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 D0932C76196 for ; Thu, 16 Mar 2023 12:20:23 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 4E219900003; Thu, 16 Mar 2023 08:20:23 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 49267900002; Thu, 16 Mar 2023 08:20:23 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 3335A900003; Thu, 16 Mar 2023 08:20:23 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0015.hostedemail.com [216.40.44.15]) by kanga.kvack.org (Postfix) with ESMTP id 23DD1900002 for ; Thu, 16 Mar 2023 08:20:23 -0400 (EDT) Received: from smtpin14.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay03.hostedemail.com (Postfix) with ESMTP id C4713A09BA for ; Thu, 16 Mar 2023 12:20:22 +0000 (UTC) X-FDA: 80574669084.14.14A534D Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) by imf24.hostedemail.com (Postfix) with ESMTP id 5935718000A for ; Thu, 16 Mar 2023 12:20:20 +0000 (UTC) Authentication-Results: imf24.hostedemail.com; dkim=pass header.d=quicinc.com header.s=qcppdkim1 header.b=NDR7e9nT; dmarc=pass (policy=none) header.from=quicinc.com; spf=pass (imf24.hostedemail.com: domain of quic_zhenhuah@quicinc.com designates 205.220.180.131 as permitted sender) smtp.mailfrom=quic_zhenhuah@quicinc.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1678969220; 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:dkim-signature; bh=AG74fjdSctjP7e/B3IYzY6uBYNMQ0Wgjh9MkmYE2g/4=; b=lcSxORE3LqlTL/I7+fWa7HTJn+bJF+pWKpLm8rWQWo84yhaim0fwXdbI7rR7vlRxOh1Kek 2f6s0mUzj8a1n8yxajWUGeLY9jcbmCWeno9+18Hj7CdigcrxptAPywGh8vCLAKifIHhUKt QpXHCqltghtHnXFewsnRnnfpalPiAxw= ARC-Authentication-Results: i=1; imf24.hostedemail.com; dkim=pass header.d=quicinc.com header.s=qcppdkim1 header.b=NDR7e9nT; dmarc=pass (policy=none) header.from=quicinc.com; spf=pass (imf24.hostedemail.com: domain of quic_zhenhuah@quicinc.com designates 205.220.180.131 as permitted sender) smtp.mailfrom=quic_zhenhuah@quicinc.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1678969220; a=rsa-sha256; cv=none; b=nlOPVrsXCNHfQvnvJBmpd26YSbNxvqKklGlz+MDdjVCdB424yHNt53uUlP2MHa5/9VkgDJ gLZUkW9fX7uLUWL7FxbAfWjRur8jVJeslT3d6Nt0huvyNyY8ziG2NGueFzEgvqglU3/1Ic G3SfaEZnrwmyjXS5QRAioMlGTaDhVbk= Received: from pps.filterd (m0279868.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 32GAsYWl032638; Thu, 16 Mar 2023 12:19:59 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quicinc.com; h=message-id : date : mime-version : subject : from : to : cc : references : in-reply-to : content-type : content-transfer-encoding; s=qcppdkim1; bh=AG74fjdSctjP7e/B3IYzY6uBYNMQ0Wgjh9MkmYE2g/4=; b=NDR7e9nTX94v/OL+0VRDzsPzg0Bh5lgDGtLKz+RMmO0HLwpZ0ePXxcp2nWfMDjkVSAJo vYMiruUXHPlvCSJTWdoGkkKqf3L22VjR7YV44HsAGnfhVPPcdcwRB/OxK+Fq0zJ55fmf t2etrepnKZJL2cABMmAzpIRYtJN4kYGxoro0YqJLGf7AgWvw1x7CvdZ+Gr9AimOOfFBt LJ3hj/K238dnzRwY8uz7vUSZK287bW+1tg0V086v4DhJufJ428UF8GyONYeHKro0d23S J+syaywQL+Db2wnrhysdzvYCBrkt4ISgsF6XEmjNmOxDBTwRtxzE+O1Q9r+uba4VzfUq cQ== Received: from nalasppmta04.qualcomm.com (Global_NAT1.qualcomm.com [129.46.96.20]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 3pbpya1q4n-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 16 Mar 2023 12:19:59 +0000 Received: from nalasex01a.na.qualcomm.com (nalasex01a.na.qualcomm.com [10.47.209.196]) by NALASPPMTA04.qualcomm.com (8.17.1.5/8.17.1.5) with ESMTPS id 32GCJwqH013552 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 16 Mar 2023 12:19:58 GMT Received: from [10.239.132.245] (10.80.80.8) by nalasex01a.na.qualcomm.com (10.47.209.196) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.41; Thu, 16 Mar 2023 05:19:54 -0700 Message-ID: <33aae812-ab0a-d5fb-8211-6ed6f0368b42@quicinc.com> Date: Thu, 16 Mar 2023 20:19:51 +0800 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Thunderbird/102.8.0 Subject: Re: [PATCH v9] mm,kfence: decouple kfence from page granularity mapping judgement Content-Language: en-US From: Zhenhua Huang To: Marco Elver CC: , , , , , , , , , , , , , , , References: <1678956620-26103-1-git-send-email-quic_zhenhuah@quicinc.com> In-Reply-To: Content-Type: text/plain; charset="UTF-8"; format=flowed Content-Transfer-Encoding: 8bit X-Originating-IP: [10.80.80.8] X-ClientProxiedBy: nasanex01b.na.qualcomm.com (10.46.141.250) To nalasex01a.na.qualcomm.com (10.47.209.196) X-QCInternal: smtphost X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=5800 signatures=585085 X-Proofpoint-ORIG-GUID: 46-ZSdruD3kHwpCRnPZdVnewAgSYLycm X-Proofpoint-GUID: 46-ZSdruD3kHwpCRnPZdVnewAgSYLycm X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.254,Aquarius:18.0.942,Hydra:6.0.573,FMLib:17.11.170.22 definitions=2023-03-16_08,2023-03-16_01,2023-02-09_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 lowpriorityscore=0 mlxlogscore=999 spamscore=0 phishscore=0 bulkscore=0 impostorscore=0 adultscore=0 priorityscore=1501 malwarescore=0 suspectscore=0 clxscore=1015 mlxscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2303150002 definitions=main-2303160102 X-Rspamd-Queue-Id: 5935718000A X-Rspamd-Server: rspam09 X-Rspam-User: X-Stat-Signature: 71magnhyd4h7xp5mpun9eubirerz8se6 X-HE-Tag: 1678969220-177984 X-HE-Meta: U2FsdGVkX1/NtRM1lc+tGZVNwhEXQEIF+JIztCR6cpeMQbLCkmbA0zPbCm18adXH/oWqH0pFg0lWvDNYHkYFNpMoBqZW38X8vu0nvAwb7SQkXcHdpdofcgszOjoat8c1jI+gqdMzIwziglwTKFfHNCjjvnW3Zsqsb2JHS3WyrWhk8y+cH6zojt7LixbdV/k+su6GMUMHQtAJ77urQadwNN01de6M9qbQcETdNlzpS+Mhh27rK2eLweYqoAGF5aismPeXGLw6Lj/tGLT6ZdBNyd1IsiEOe2tY+aTHvZw3k34sEBt6ibpzHH2sWr4KgMIE2fgOq/0gAKEMt4LGo2EARe+cdjA0d0Z0h/Hrn5fKYZuRWLqX0pjV3NzQWoHnRy1943n8N1tccNYz0xMKmm2cU8QXcHZ/iOf/nuAXifwUuQRFVuP2lWm0V6Kg5siwcaYTYh/+uhxqzuybeUStxxopvyZ/mXx1AYgeQXGmlKO8VzyGyq2N2eJlvx821BuExKEl8evoMFCjKSexQgx4FLAMSpdBBctgZs+MS+m9N7Qk3LyAFf1pHfJQUTiLK7aClCn3cu+ofXZue37KtEr8+s8JuqP/fhGln0+epdNbknAWZE1Uifl6ICFvtKUPM8RsKJAO81dmghM+mChtp8qmaShJHFSpW7OXKWyc19QAB+zu1XvSxDBdy8H1Vr8W3CYgl1nnng3dTDCV3a19PHSwVND9L3zf7YvV8r/nLo3ou64x3DJwJ3UJA0BOYs/NS6ekV1fHCMVvBptC2jOqP6fm4Agfndq2V4WT0OnywJ9coczBebe+JrVsNjW8LpboLfu/VbJ0wsf5vN5N0/dO+xXam/RKkP9n4DTKzpB/62vvkxkADOGtbaOswHj3/dMhVJPYBe970HiLoSIuAZvWXwxJM9n674xdErMcIfim0bMJFGsBKMwSFqyjIkh86Lof1mTFMwCsmtbDPxGbsCwoQ31rm0O cs2394e/ fBQ3J9qiiEEtbBM5YDLOchdSa2DIKN/aeQtZI1qmJAqyYusznThdGjYIFS88nc8M62F7h8E6/RjCoT3Ir2qCWcxCBXIo5Ek9b/Zo9e07WYyLq+nKt5AAIuL1LQqdHuU0j3Z2k7HdA+9OHCOoGi6l63MXdUxrvzE26KEuBVOrkklRhAz0T7W09J2wjk2HPv62DnQOIt4VobRk3rzRjCfofrWwa4q4rtn0aLCD3QQvoqQdm4EQB3nPgO2PvDPq3qmI2EnA05S+OYxjEWuTB/Mrl6ZSF7Z3/culHE8YldJSMs3Iu0D1eQJYR+qqBHeYPQTHKfr2ssQD1ss1mOHGep4WhXIl4eEIm13/v49yWGr1MgFnasBOYiPLVlQiy955N4RKPK6u+wyOnYzm/jZnfztCJ2gvUOQ== 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/16 18:36, Zhenhua Huang wrote: > > > On 2023/3/16 18:06, Marco Elver wrote: >> On Thu, Mar 16, 2023 at 04:50PM +0800, 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/include/asm/kfence.h | 16 +++++++++++ >>>   arch/arm64/mm/mmu.c             | 59 >>> +++++++++++++++++++++++++++++++++++++++++ >>>   arch/arm64/mm/pageattr.c        |  9 +++++-- >>>   include/linux/kfence.h          |  1 + >>>   mm/kfence/core.c                |  4 +++ >>>   5 files changed, 87 insertions(+), 2 deletions(-) >>> >>> diff --git a/arch/arm64/include/asm/kfence.h >>> b/arch/arm64/include/asm/kfence.h >>> index aa855c6..8143c91 100644 >>> --- a/arch/arm64/include/asm/kfence.h >>> +++ b/arch/arm64/include/asm/kfence.h >>> @@ -10,6 +10,22 @@ >>>   #include >>> +extern phys_addr_t early_kfence_pool; >> >> This should not be accessible if !CONFIG_KFENCE. >> >>> +#ifdef CONFIG_KFENCE >>> + >>> +extern char *__kfence_pool; >>> +static inline void kfence_set_pool(phys_addr_t addr) >>> +{ >>> +    __kfence_pool = phys_to_virt(addr); >>> +} >> >> kfence_set_pool() is redundant if it's for arm64 only, because we know >> where it's needed, and there you could just access __kfence_pool >> directly. So let's just remove this function. (Initially I thought you >> want to provide it generally, also for other architectures.) >> >>> +#else >>> + >>> +static inline void kfence_set_pool(phys_addr_t addr) { } >>> + >>> +#endif >>> + >>>   static inline bool arch_kfence_init_pool(void) { return true; } >> [...] >>> +#endif >>> + >>> +phys_addr_t early_kfence_pool; >> >> This variable now exists in non-KFENCE builds, which is wrong. >> >>>   static void __init map_mem(pgd_t *pgdp) >>>   { >>>       static const u64 direct_map_end = _PAGE_END(VA_BITS_MIN); >>> @@ -543,6 +587,10 @@ static void __init map_mem(pgd_t *pgdp) >>>        */ >>>       BUILD_BUG_ON(pgd_index(direct_map_end - 1) == >>> pgd_index(direct_map_end)); >>> +    early_kfence_pool = arm64_kfence_alloc_pool(); >>> +    if (early_kfence_pool) >>> +        memblock_mark_nomap(early_kfence_pool, KFENCE_POOL_SIZE); >>> + >>>       if (can_set_direct_map()) >>>           flags |= NO_BLOCK_MAPPINGS | NO_CONT_MAPPINGS; >>> @@ -608,6 +656,17 @@ static void __init map_mem(pgd_t *pgdp) >>>           } >>>       } >>>   #endif >>> + >>> +    /* Kfence pool needs page-level mapping */ >>> +    if (early_kfence_pool) { >>> +        __map_memblock(pgdp, early_kfence_pool, >>> +            early_kfence_pool + KFENCE_POOL_SIZE, >>> +            pgprot_tagged(PAGE_KERNEL), >>> +            NO_BLOCK_MAPPINGS | NO_CONT_MAPPINGS); >>> +        memblock_clear_nomap(early_kfence_pool, KFENCE_POOL_SIZE); >>> +        /* kfence_pool really mapped now */ >>> +        kfence_set_pool(early_kfence_pool); >>> +    } >> >> This whole piece of code could also be wrapped in another function, >> which becomes a no-op if !CONFIG_KFENCE. Then you also don't need to >> provide the KFENCE_POOL_SIZE define for 0 if !CONFIG_KFENCE. >> >> [...] >>> +     * >>> +     * 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) && !early_kfence_pool); >> >> Accessing a non-existent variable if !CONFIG_KFENCE works because the >> compiler optimizes out the access, but is generally bad style. > > Hi Marco, > > Actually my previous intention is not to do separation between KFENCE > and non-KFENCE, instead to ensure early_kfence_pool always to be NULL in > non-KFENCE build. That works well from my side w/ and w/o > CONFIG_KFENCE.. but Yes that not clear to have this variable still in > non-Kfence build. > > Sure, I will follow your suggestion below and tested on my side. Thanks. > > Thanks, > Zhenhua > >> >> >> I think the only issue that I have is that the separation between KFENCE >> and non-KFENCE builds is not great. >> >> At the end of the email are is a diff against your patch which would be >> my suggested changes (while at it, I fixed up a bunch of other issues). >> Untested, so if you decide to adopt these changes, please test. Hi Marco, All below seems well except minor change like we can't define kfence_early_init as __initdata because it is used by non init function like can_set_direct_map. Warning reported: WARNING: modpost: vmlinux.o: section mismatch in reference: can_set_direct_map (section: .text) -> kfence_early_init (section: .init.data) I have modified and sent out a new patchset. Please help review. Thanks, Zhenhua >> >> Thanks, >> -- Marco >> >> ------ >8 ------ >> >> >> diff --git a/arch/arm64/include/asm/kfence.h >> b/arch/arm64/include/asm/kfence.h >> index 8143c91854e1..a81937fae9f6 100644 >> --- a/arch/arm64/include/asm/kfence.h >> +++ b/arch/arm64/include/asm/kfence.h >> @@ -10,22 +10,6 @@ >>   #include >> -extern phys_addr_t early_kfence_pool; >> - >> -#ifdef CONFIG_KFENCE >> - >> -extern char *__kfence_pool; >> -static inline void kfence_set_pool(phys_addr_t addr) >> -{ >> -    __kfence_pool = phys_to_virt(addr); >> -} >> - >> -#else >> - >> -static inline void kfence_set_pool(phys_addr_t addr) { } >> - >> -#endif >> - >>   static inline bool arch_kfence_init_pool(void) { return true; } >>   static inline bool kfence_protect_page(unsigned long addr, bool >> protect) >> @@ -35,4 +19,14 @@ static inline bool kfence_protect_page(unsigned >> long addr, bool protect) >>       return true; >>   } >> +#ifdef CONFIG_KFENCE >> +extern bool kfence_early_init; >> +static inline bool arm64_kfence_can_set_direct_map(void) >> +{ >> +    return !kfence_early_init; >> +} >> +#else /* CONFIG_KFENCE */ >> +static inline bool arm64_kfence_can_set_direct_map(void) { return >> false; } >> +#endif /* CONFIG_KFENCE */ >> + >>   #endif /* __ASM_KFENCE_H */ >> diff --git a/arch/arm64/mm/mmu.c b/arch/arm64/mm/mmu.c >> index 61944c7091f0..683958616ac1 100644 >> --- a/arch/arm64/mm/mmu.c >> +++ b/arch/arm64/mm/mmu.c >> @@ -528,17 +528,14 @@ static int __init enable_crash_mem_map(char *arg) >>   early_param("crashkernel", enable_crash_mem_map); >>   #ifdef CONFIG_KFENCE >> +bool kfence_early_init = !!CONFIG_KFENCE_SAMPLE_INTERVAL; >> -static bool kfence_early_init __initdata = >> !!CONFIG_KFENCE_SAMPLE_INTERVAL; >> -/* >> - * early_param can be parsed before linear mapping >> - * set up >> - */ >> -static int __init parse_kfence_early_init(char *p) >> +/* early_param() will be parsed before map_mem() below. */ >> +static int __init parse_kfence_early_init(char *arg) >>   { >>       int val; >> -    if (get_option(&p, &val)) >> +    if (get_option(&arg, &val)) >>           kfence_early_init = !!val; >>       return 0; >>   } >> @@ -552,22 +549,34 @@ static phys_addr_t arm64_kfence_alloc_pool(void) >>           return 0; >>       kfence_pool = memblock_phys_alloc(KFENCE_POOL_SIZE, PAGE_SIZE); >> -    if (!kfence_pool) >> +    if (!kfence_pool) { >>           pr_err("failed to allocate kfence pool\n"); >> +        kfence_early_init = false; >> +        return 0; >> +    } >> + >> +    /* Temporarily mark as NOMAP. */ >> +    memblock_mark_nomap(kfence_pool, KFENCE_POOL_SIZE); >>       return kfence_pool; >>   } >> -#else >> - >> -static phys_addr_t arm64_kfence_alloc_pool(void) >> +static void arm64_kfence_map_pool(phys_addr_t kfence_pool, pgd_t *pgdp) >>   { >> -    return 0; >> -} >> - >> -#endif >> +    if (!kfence_pool) >> +        return; >> -phys_addr_t early_kfence_pool; >> +    /* KFENCE pool needs page-level mapping. */ >> +    __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 = phys_to_virt(kfence_pool); >> +} >> +#else /* CONFIG_KFENCE */ >> +static inline phys_addr_t arm64_kfence_alloc_pool(void) { return 0; } >> +static inline void arm64_kfence_map_pool(phys_addr_t kfence_pool, >> pgd_t *pgdp) { } >> +#endif /* CONFIG_KFENCE */ >>   static void __init map_mem(pgd_t *pgdp) >>   { >> @@ -575,6 +584,7 @@ static void __init map_mem(pgd_t *pgdp) >>       phys_addr_t kernel_start = __pa_symbol(_stext); >>       phys_addr_t kernel_end = __pa_symbol(__init_begin); >>       phys_addr_t start, end; >> +    phys_addr_t early_kfence_pool; >>       int flags = NO_EXEC_MAPPINGS; >>       u64 i; >> @@ -588,8 +598,6 @@ static void __init map_mem(pgd_t *pgdp) >>       BUILD_BUG_ON(pgd_index(direct_map_end - 1) == >> pgd_index(direct_map_end)); >>       early_kfence_pool = arm64_kfence_alloc_pool(); >> -    if (early_kfence_pool) >> -        memblock_mark_nomap(early_kfence_pool, KFENCE_POOL_SIZE); >>       if (can_set_direct_map()) >>           flags |= NO_BLOCK_MAPPINGS | NO_CONT_MAPPINGS; >> @@ -656,17 +664,7 @@ static void __init map_mem(pgd_t *pgdp) >>           } >>       } >>   #endif >> - >> -    /* Kfence pool needs page-level mapping */ >> -    if (early_kfence_pool) { >> -        __map_memblock(pgdp, early_kfence_pool, >> -            early_kfence_pool + KFENCE_POOL_SIZE, >> -            pgprot_tagged(PAGE_KERNEL), >> -            NO_BLOCK_MAPPINGS | NO_CONT_MAPPINGS); >> -        memblock_clear_nomap(early_kfence_pool, KFENCE_POOL_SIZE); >> -        /* kfence_pool really mapped now */ >> -        kfence_set_pool(early_kfence_pool); >> -    } >> +    arm64_kfence_map_pool(early_kfence_pool, pgdp); >>   } >>   void mark_rodata_ro(void) >> diff --git a/arch/arm64/mm/pageattr.c b/arch/arm64/mm/pageattr.c >> index 7ce5295cc6fb..aa8fd12cc96f 100644 >> --- a/arch/arm64/mm/pageattr.c >> +++ b/arch/arm64/mm/pageattr.c >> @@ -7,7 +7,6 @@ >>   #include >>   #include >>   #include >> -#include >>   #include >>   #include >> @@ -28,11 +27,10 @@ bool can_set_direct_map(void) >>        * 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. >> +     * KFENCE pool requires page-granular mapping if initialized late. >>        */ >>       return (rodata_enabled && rodata_full) || >> debug_pagealloc_enabled() || >> -        (IS_ENABLED(CONFIG_KFENCE) && !early_kfence_pool); >> +           arm64_kfence_can_set_direct_map(); >>   } >>   static int change_page_range(pte_t *ptep, unsigned long addr, void >> *data) >> diff --git a/include/linux/kfence.h b/include/linux/kfence.h >> index 91cbcc98e293..726857a4b680 100644 >> --- a/include/linux/kfence.h >> +++ b/include/linux/kfence.h >> @@ -222,7 +222,6 @@ bool __kfence_obj_info(struct kmem_obj_info *kpp, >> void *object, struct slab *sla >>   #else /* CONFIG_KFENCE */ >> -#define KFENCE_POOL_SIZE 0 >>   static inline bool is_kfence_address(const void *addr) { return >> false; } >>   static inline void kfence_alloc_pool(void) { } >>   static inline void kfence_init(void) { } >> diff --git a/mm/kfence/core.c b/mm/kfence/core.c >> index fab087d39633..e7f22af5e710 100644 >> --- a/mm/kfence/core.c >> +++ b/mm/kfence/core.c >> @@ -818,7 +818,7 @@ void __init kfence_alloc_pool(void) >>       if (!kfence_sample_interval) >>           return; >> -    /* if the pool has already been initialized by arch, skip the >> below */ >> +    /* If the pool has already been initialized by arch, skip the >> below. */ >>       if (__kfence_pool) >>           return; >