From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 96418C6FD19 for ; Mon, 13 Mar 2023 14:43:08 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id CF9D06B0072; Mon, 13 Mar 2023 10:43:07 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id CA9E06B0074; Mon, 13 Mar 2023 10:43:07 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id B726B6B0075; Mon, 13 Mar 2023 10:43:07 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id A60446B0072 for ; Mon, 13 Mar 2023 10:43:07 -0400 (EDT) Received: from smtpin03.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay03.hostedemail.com (Postfix) with ESMTP id 7AA7FA0C6C for ; Mon, 13 Mar 2023 14:43:07 +0000 (UTC) X-FDA: 80564142414.03.98F9CB5 Received: from szxga01-in.huawei.com (szxga01-in.huawei.com [45.249.212.187]) by imf01.hostedemail.com (Postfix) with ESMTP id 4D3B040005 for ; Mon, 13 Mar 2023 14:43:02 +0000 (UTC) Authentication-Results: imf01.hostedemail.com; dkim=none; dmarc=pass (policy=quarantine) header.from=huawei.com; spf=pass (imf01.hostedemail.com: domain of wangkefeng.wang@huawei.com designates 45.249.212.187 as permitted sender) smtp.mailfrom=wangkefeng.wang@huawei.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1678718585; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Jq1BUbWKG13gdJQBFg8xdyThIvd23+F5BgCkeMF5Zk8=; b=417kUw9Ut4Hj38Moa67qQKbXikrCLgn5Bgjb1wwKieUXuozwSn9JaB2yEsgnjqMdhUVSpm 3Y/0nUKVgZxj2O+PJ2wHHBhfPGTLuS4HEN7Z4tzUm6bwBJJ02xJGIP0MwOGOLoyVOcOT3G xOi5/VtmETIHpkncvYIGO00ZDU9s3iw= ARC-Authentication-Results: i=1; imf01.hostedemail.com; dkim=none; dmarc=pass (policy=quarantine) header.from=huawei.com; spf=pass (imf01.hostedemail.com: domain of wangkefeng.wang@huawei.com designates 45.249.212.187 as permitted sender) smtp.mailfrom=wangkefeng.wang@huawei.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1678718585; a=rsa-sha256; cv=none; b=DCZ4TjinkURIn9zqo2WVy8WYK+JxWdo8KOJuSyM73RY0BOxSBgvv3u9bsZXP1FcGmGNK4M wZax88OyqIOO4vHxI0/kA4cazUA36OUEOEmrvnTNeLTgdtpfZiDN781ah2YqGkq8q9eniY 1c8NnXYT3IgpD+JkSKIx84XYArqAcyU= Received: from dggpemm500001.china.huawei.com (unknown [172.30.72.56]) by szxga01-in.huawei.com (SkyGuard) with ESMTP id 4PZzrX16pGzrSqQ; Mon, 13 Mar 2023 22:42:04 +0800 (CST) Received: from [10.174.177.243] (10.174.177.243) by dggpemm500001.china.huawei.com (7.185.36.107) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.21; Mon, 13 Mar 2023 22:42:55 +0800 Message-ID: <41a98759-1626-5e8f-3b1b-d038ef1925a7@huawei.com> Date: Mon, 13 Mar 2023 22:42:54 +0800 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Thunderbird/102.5.1 Subject: Re: [PATCH v6] mm,kfence: decouple kfence from page granularity mapping judgement Content-Language: en-US To: Marco Elver , Zhenhua Huang CC: , , , , , , , , , , , , , , References: <1678708637-8669-1-git-send-email-quic_zhenhuah@quicinc.com> From: Kefeng Wang In-Reply-To: Content-Type: text/plain; charset="UTF-8"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [10.174.177.243] X-ClientProxiedBy: dggems703-chm.china.huawei.com (10.3.19.180) To dggpemm500001.china.huawei.com (7.185.36.107) X-CFilter-Loop: Reflected X-Rspamd-Queue-Id: 4D3B040005 X-Rspamd-Server: rspam09 X-Rspam-User: X-Stat-Signature: zmhof75hrmopbb788qjufridwhsyg5a6 X-HE-Tag: 1678718582-614939 X-HE-Meta: U2FsdGVkX1+9a9p9giHbKcG/lcS7gfWlEhDwf8CTj7nBpw2HPJrJQjpvnsNudmceJrsEdNG3PNwyl4yb0X1rozoIlqcPG223O0k0FnXUliCekNkDZ55SFn/Gp1h/4GReklNattbqNZ4p6kLYiA4/T6QloYiZiZ1avVm4Oh3DsSzo+M6+/J5ppeur2NnTvLeVXptCf6iExcIYVqRckjLf4Cz5deNuUUA1m1Irffht/Zmkzz+5EEHeDuCMIbxpLFM98Jz9xTa0suKDD0sqPNbtpDmA/0f10pb/Vw90JteWzWC8f9VzmVd3XeEv5BKmQ25V/LO0JjO5lkGLqfeiZyU1RKF2bAdYjpcC3ULBAdghmIex3qVQoHR7Pqhi88SfjqDBTaI3nV9leeq+OFayWHRJfwfcismmwFIL9/Tyoem1XMFoqOrGPzFteUj9jHxJ8Mm5syJGZZIaMlPVHG+In23dQzskfytdMrXYzYRLrXVURtQXRFoiVOkVh6+Z9F+8Yo3QQyNL/21JtGW6f3adyTzzp2XWs+r5fbamsG1koKyfJW/3h2hGkVmDum2sIMivvyplbzodBIIqjWI6PkZtAZT6x0Ep0uJX70rP79Xdcgb+bEGsxPH8fZzZ4v/WpKgKJuoY8ZZM/u9murqNawnnbK6EhBF1LuVNwxe6c/SGY/0PxNZ1VilsCVECfWvQuJaF2P122Xo36yDf4JS3D4X3EUKROGxBSg+j9NeJHueEVEa2/KjZYvE9b1WFd2xQ98UZnLxiontGvY29LMHH+oC8HwUWMdfTiKDB5vB5s9Iz3Wc5WPGntnio9txKZVtPBrY4HnUaoepnBcn2DR6Ba+9hehB78/zd016ngokJtDC9gvItsNOYpk8mb6kQ54kUuw0N0CGDJKjOt7PTsiZT5JM+dlfSeHlF9DZHgtvjU/gHVgc7KZRiEdNLprkChOQCc2CJZve6SozFjAdvib/GU2LZbt6 X2LAhh+S Vlv6jhO0JyLzcOOYlq3a4W0DM6WU2L3ThH8w8g/HtCvBNgNisxRrW7OyQQrGbHLktX1POJKxQ4agDXn68uVvzSFyQtRpmFdDX7+3vJ+XJQRjQLno4vn/7tccNVA1emnhrZpqXJ+QW066Igai5DxnlLouBXY00p+Y4T8aiuAMUBX4ty4cCkxt3IxgLRqFGMURBAyFTl4w3GJ6nyarT1MSbCDPImzudFUHr0Iq/9dR/BUjvA0a79+xmyW36IOYe8lE0nkKFCKwfebJnGBaJC316xL57Yaokx3fsKOV+zvFhRKy737KVBq5E3Xo1/K/tl7++bGmAnUnj3lMlVNs= X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: On 2023/3/13 21:00, Marco Elver wrote: > On Mon, 13 Mar 2023 at 12:57, Zhenhua Huang wrote: >> >> Kfence only needs its pool to be mapped as page granularity, if it is >> inited early. Previous judgement was a bit over protected. From [1], Mark >> suggested to "just map the KFENCE region a page granularity". So I >> decouple it from judgement and do page granularity mapping for kfence >> pool only. Need to be noticed that late init of kfence pool still requires >> page granularity mapping. >> >> Page granularity mapping in theory cost more(2M per 1GB) memory on arm64 >> platform. Like what I've tested on QEMU(emulated 1GB RAM) with >> gki_defconfig, also turning off rodata protection: >> Before: >> [root@liebao ]# cat /proc/meminfo >> MemTotal: 999484 kB >> After: >> [root@liebao ]# cat /proc/meminfo >> MemTotal: 1001480 kB >> >> To implement this, also relocate the kfence pool allocation before the >> linear mapping setting up, arm64_kfence_alloc_pool is to allocate phys >> addr, __kfence_pool is to be set after linear mapping set up. >> >> LINK: [1] https://lore.kernel.org/linux-arm-kernel/Y+IsdrvDNILA59UN@FVFF77S0Q05N/ >> Suggested-by: Mark Rutland >> Signed-off-by: Zhenhua Huang >> --- >> arch/arm64/mm/mmu.c | 42 ++++++++++++++++++++++++++++++++++++++++++ >> arch/arm64/mm/pageattr.c | 8 ++++++-- >> include/linux/kfence.h | 10 ++++++++++ >> mm/kfence/core.c | 9 +++++++++ >> 4 files changed, 67 insertions(+), 2 deletions(-) >> >> diff --git a/arch/arm64/mm/mmu.c b/arch/arm64/mm/mmu.c >> index 6f9d889..ca5c932 100644 >> --- a/arch/arm64/mm/mmu.c >> +++ b/arch/arm64/mm/mmu.c >> @@ -24,6 +24,7 @@ >> #include >> #include >> #include >> +#include >> >> #include >> #include >> @@ -525,6 +526,31 @@ static int __init enable_crash_mem_map(char *arg) >> } >> early_param("crashkernel", enable_crash_mem_map); >> >> +#ifdef CONFIG_KFENCE >> + >> +static phys_addr_t arm64_kfence_alloc_pool(void) >> +{ >> + phys_addr_t kfence_pool; >> + >> + if (!kfence_sample_interval) >> + return 0; >> + >> + kfence_pool = memblock_phys_alloc(KFENCE_POOL_SIZE, PAGE_SIZE); >> + if (!kfence_pool) >> + pr_err("failed to allocate kfence pool\n"); >> + >> + return kfence_pool; >> +} >> + >> +#else >> + >> +static phys_addr_t arm64_kfence_alloc_pool(void) >> +{ >> + return 0; >> +} >> + >> +#endif >> + >> static void __init map_mem(pgd_t *pgdp) >> { >> static const u64 direct_map_end = _PAGE_END(VA_BITS_MIN); >> @@ -532,6 +558,7 @@ static void __init map_mem(pgd_t *pgdp) >> phys_addr_t kernel_end = __pa_symbol(__init_begin); >> phys_addr_t start, end; >> int flags = NO_EXEC_MAPPINGS; >> + phys_addr_t kfence_pool; >> u64 i; >> >> /* >> @@ -564,6 +591,10 @@ static void __init map_mem(pgd_t *pgdp) >> } >> #endif >> >> + kfence_pool = arm64_kfence_alloc_pool(); >> + if (kfence_pool) >> + memblock_mark_nomap(kfence_pool, KFENCE_POOL_SIZE); >> + >> /* map all the memory banks */ >> for_each_mem_range(i, &start, &end) { >> if (start >= end) >> @@ -608,6 +639,17 @@ static void __init map_mem(pgd_t *pgdp) >> } >> } >> #endif >> + >> + /* Kfence pool needs page-level mapping */ >> + if (kfence_pool) { >> + __map_memblock(pgdp, kfence_pool, >> + kfence_pool + KFENCE_POOL_SIZE, >> + pgprot_tagged(PAGE_KERNEL), >> + NO_BLOCK_MAPPINGS | NO_CONT_MAPPINGS); >> + memblock_clear_nomap(kfence_pool, KFENCE_POOL_SIZE); >> + /* kfence_pool really mapped now */ >> + kfence_set_pool(kfence_pool); >> + } >> } >> >> void mark_rodata_ro(void) >> diff --git a/arch/arm64/mm/pageattr.c b/arch/arm64/mm/pageattr.c >> index 79dd201..25e4a983 100644 >> --- a/arch/arm64/mm/pageattr.c >> +++ b/arch/arm64/mm/pageattr.c >> @@ -7,6 +7,7 @@ >> #include >> #include >> #include >> +#include >> >> #include >> #include >> @@ -22,12 +23,15 @@ bool rodata_full __ro_after_init = IS_ENABLED(CONFIG_RODATA_FULL_DEFAULT_ENABLED >> bool can_set_direct_map(void) >> { >> /* >> - * rodata_full, DEBUG_PAGEALLOC and KFENCE require linear map to be >> + * rodata_full and DEBUG_PAGEALLOC require linear map to be >> * mapped at page granularity, so that it is possible to >> * protect/unprotect single pages. >> + * >> + * Kfence pool requires page granularity mapping also if we init it >> + * late. >> */ >> return (rodata_enabled && rodata_full) || debug_pagealloc_enabled() || >> - IS_ENABLED(CONFIG_KFENCE); >> + (IS_ENABLED(CONFIG_KFENCE) && !kfence_sample_interval); > > If you're struggling with kfence_sample_interval not existing if > !CONFIG_KFENCE, this is one of the occasions where it'd be perfectly > fine to write: > > bool can_set_direct_map(void) { > #ifdef CONFIG_KFENCE > /* ... your comment here ...*/ > if (!kfence_sample_interval) > return true; > } > #endif > return ......... > } > >> } >> The can_set_direct_map() could be called anytime, eg, memory add, vmalloc, and this will make different state of can_set_direct_map() if kfence is re-enabled, I think that we need a new value to check whether or not the early kfence_pool is initialized.