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 04E89C6FD1F for ; Thu, 16 Mar 2023 15:11:22 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 8117B900003; Thu, 16 Mar 2023 11:11:22 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 7C1CF900002; Thu, 16 Mar 2023 11:11:22 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 662B1900003; Thu, 16 Mar 2023 11:11:22 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0011.hostedemail.com [216.40.44.11]) by kanga.kvack.org (Postfix) with ESMTP id 56368900002 for ; Thu, 16 Mar 2023 11:11:22 -0400 (EDT) Received: from smtpin22.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay09.hostedemail.com (Postfix) with ESMTP id 1529980B46 for ; Thu, 16 Mar 2023 15:11:22 +0000 (UTC) X-FDA: 80575100004.22.8FBEEB2 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) by imf08.hostedemail.com (Postfix) with ESMTP id B74BA16001D for ; Thu, 16 Mar 2023 15:11:19 +0000 (UTC) Authentication-Results: imf08.hostedemail.com; dkim=pass header.d=quicinc.com header.s=qcppdkim1 header.b=jTKfj9vc; spf=pass (imf08.hostedemail.com: domain of quic_zhenhuah@quicinc.com designates 205.220.180.131 as permitted sender) smtp.mailfrom=quic_zhenhuah@quicinc.com; dmarc=pass (policy=none) header.from=quicinc.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1678979479; a=rsa-sha256; cv=none; b=CZkAWKZ2I153FLgyBD25bHVkGbiSHxfGampI/tiqS+/SA513SLQm8dKhjqGaJOc6yxGoFC JtVjLfBzd2cBJZM1Vp8LQOToO+YDqdmnzT1t4ZwaVOri+U4o5QfyIMHpSbmRIdtXn9zVZI qg6tMl+z1cx5TtvlekBR0yoUXIKBnc4= ARC-Authentication-Results: i=1; imf08.hostedemail.com; dkim=pass header.d=quicinc.com header.s=qcppdkim1 header.b=jTKfj9vc; spf=pass (imf08.hostedemail.com: domain of quic_zhenhuah@quicinc.com designates 205.220.180.131 as permitted sender) smtp.mailfrom=quic_zhenhuah@quicinc.com; dmarc=pass (policy=none) header.from=quicinc.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1678979479; 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=0ugVgRxy8hZ3/3OpBR3JVOANzKxtq2sgvDV6Grf6dNM=; b=Ed3enccWCy5QwZRD4jTzesyBOOoRry+E6/kiEfgS6PH39UKlOnRp2tAC0dDq9puuQDD3iW g5jBOQGMVdpK0eU+7JWqmKw/qr80HB7GQTjAp82h3d8FZalVJQG5ObEE82TyRuGThvm40y CiLvzbHBqaqFVtjzjWvbcCWJ27RGYcA= Received: from pps.filterd (m0279873.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 32GER89S031439; Thu, 16 Mar 2023 15:11:06 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quicinc.com; h=message-id : date : mime-version : subject : to : cc : references : from : in-reply-to : content-type : content-transfer-encoding; s=qcppdkim1; bh=0ugVgRxy8hZ3/3OpBR3JVOANzKxtq2sgvDV6Grf6dNM=; b=jTKfj9vcvbQWeF7CAuZ4+fH3VVIHN/gJ46xsv1ISgj4pmNUueZS7uZNR8zqDANsxdHT4 B96qnSSAESXCQC/79vSRzLGNnJ6k+Gclyx8eL/oPo5JdI4IyPi5LD0T4RJdnKAwh3LT+ i1DGCtDeayFQ4w8oRoM9rjkiAcqs3Dv7Vb6UDhmnb5NuGr1jAYQsNeOYakbPXPk6z28G ZjnJvNBYdE2a3NNp/CfibwDUzI5qkYq6nRh1onvcJGrw4b921OIB0CplY03C+V6JVUyv E2H/kfWy2M67IXEl4bjgWN03Mc745malsgvhrO1FXcR+mjBADatSIHosUGVNbPMGJQ87 gw== Received: from nalasppmta01.qualcomm.com (Global_NAT1.qualcomm.com [129.46.96.20]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 3pc4vv8554-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 16 Mar 2023 15:11:05 +0000 Received: from nalasex01a.na.qualcomm.com (nalasex01a.na.qualcomm.com [10.47.209.196]) by NALASPPMTA01.qualcomm.com (8.17.1.5/8.17.1.5) with ESMTPS id 32GFB4ZF030484 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 16 Mar 2023 15:11:04 GMT Received: from [10.253.39.45] (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 08:11:00 -0700 Message-ID: <1176a4b0-f95f-d93e-75c4-e02dbb300f80@quicinc.com> Date: Thu, 16 Mar 2023 23:10:58 +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 v10] mm,kfence: decouple kfence from page granularity mapping judgement Content-Language: en-US To: Kefeng Wang , , , , , , , , , , CC: , , , , , References: <1678969110-11941-1-git-send-email-quic_zhenhuah@quicinc.com> <8f064a51-723e-986e-be25-ec2929b685de@huawei.com> From: Zhenhua Huang In-Reply-To: <8f064a51-723e-986e-be25-ec2929b685de@huawei.com> 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: t5eRAWpFNuauNVGxeAyLpkca2sEJ-Rfq X-Proofpoint-GUID: t5eRAWpFNuauNVGxeAyLpkca2sEJ-Rfq 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_10,2023-03-16_01,2023-02-09_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 phishscore=0 mlxlogscore=999 mlxscore=0 spamscore=0 clxscore=1015 impostorscore=0 bulkscore=0 malwarescore=0 suspectscore=0 priorityscore=1501 lowpriorityscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2303150002 definitions=main-2303160122 X-Rspam-User: X-Rspamd-Queue-Id: B74BA16001D X-Rspamd-Server: rspam01 X-Stat-Signature: 6gnsoi8sjbprw81zfqdnp6jhfpuzspor X-HE-Tag: 1678979479-952684 X-HE-Meta: U2FsdGVkX19QEBtH+N17YtRfnQ2We+jrh54yBPKZz5co2JtBAS6pcuIZT1JAe14ZQIbLZS1sNlclKY36kL+fdiL6Slrd30NVszcnqWFuhhSieo9qenxzS6lD4rmyAG3iKdFhfSztuT8W1/mR7zAIJqUpdWkHRmyB5Pj/mEB93aiD9Nsbw3b3md08Gyn2C7tFvMXy8uQV326AuYFp+SkHa5GC84O1+K63IZwhvk6+FizRM5eqCgDZruSnC4elZFOsr+ethoJSqiVrMlSby9f+W6lTdDMbRKgOcF+zHmO3Cgn19+3BTIsXZ+Zt5X4kKTUDECE2kb5gzSlxL61GvUJU81ddDDrj0av5GAl5WqxWBexl/dExtiYBa00alRIfFuGtvBCtj5AKvAtxwKIPehme0+xKj6rnISEqU7lcMsrP8IzLIBt/DAeWDzlhXSp6d4ggdng3AqnrGemwLE9rYCUtevmE38bcZxGjQrkf181pXOGxAxIgWK4MaH35cwT/A5F68HXyRBMV2kl1BVuDsV9IQE42c1WnqpspEsei6cguaqcVCNDTMRl2c2cIH1fj9TZHbTPww1i9qbmEvI+fiV0Lk2Lcsx5nEAAqNoz/E8iOB5QIczzN8pC5kosZjZzEnQq5EfpEtHigK+gamlHE6CX1p5U/okNgKrA7LoUBojHBb6qEYQ3RtNPfAxTqhigPsF2u5P54NoZG+IaXBlL0aXkTv+TTTA5SSVcKVapVF6L06y6cCa2V0l7k6EkVNG4TnCJ82B1ZBZt2vw3d/78NQtKH1I3XYO4uR++D9VNdKEA3slYizSzkPe4KQmzV8lEc+Xygu72reIacbyQpZXfQ2sMmJQb3mO83MG8GbTzUDijI66W4cUau5sICyVDoMONUQJJAFT281yXFa0Zjlq2AFbCI7nkBj2BNC83QatSkji1mIWhWpNRnjgYBoSJvr9xkD+mi6OszjrR1MM2KDeLoIlX I9/VY6qf xet63sqmLeX5z9v8uNzOnCeVMHu7jImPMuyD1TACqw20257mQ7SU5aEIL44IEKb5Q+P6JNemJcknQwyJubHDfaChIKeRttbws0INSift4wJcpwq51rH/SuxJbIjyzLiVVaIE0m8cJySe4QY3t1/3ue+sPOi6BjhWwg46V+qaam8GmvTXD12E0tO/wYkkWlLGcWFlO1QWBwgUrOZSOd4tWBMhFiK5MVyNAHygtXFFSpSOqUT02LWTUbFkjbuskyzlOUgp+wQ11A66cOwNum4HkbZ0QS9UkUeog8SuBSccuyaQvasjRtAfydXyAsA3V8vq9am0wXpj2w5/3gt/GsuXhc+k3z0M4umJSzWZeyT3rSxbqV3SruW57T3+7SorrM15MDmtWcob+4yX6957OJkQrQhqbG+LCBKTwdUVq7aI2TqipzYM= 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 22:15, Kefeng Wang wrote: > > > On 2023/3/16 20:18, 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. >> > > A few little comments, Thanks Kefeng. Addressed your comments in latest patch. Thanks, Zhenhua > > >> 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 | 10 +++++++ >>   arch/arm64/mm/mmu.c             | 61 >> +++++++++++++++++++++++++++++++++++++++++ >>   arch/arm64/mm/pageattr.c        |  7 +++-- >>   mm/kfence/core.c                |  4 +++ >>   4 files changed, 80 insertions(+), 2 deletions(-) >> >> diff --git a/arch/arm64/include/asm/kfence.h >> b/arch/arm64/include/asm/kfence.h >> index aa855c6..a81937f 100644 >> --- a/arch/arm64/include/asm/kfence.h >> +++ b/arch/arm64/include/asm/kfence.h >> @@ -19,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 ae25524d..aaf1801 100644 >> --- a/arch/arm64/mm/mmu.c >> +++ b/arch/arm64/mm/mmu.c >> @@ -24,6 +24,7 @@ >>   #include >>   #include >>   #include >> +#include >>   #include >>   #include >> @@ -38,6 +39,7 @@ >>   #include >>   #include >>   #include >> +#include >>   #define NO_BLOCK_MAPPINGS    BIT(0) >>   #define NO_CONT_MAPPINGS    BIT(1) >> @@ -521,12 +523,67 @@ 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; > > maybe add __ro_after_init > >> + >> +/* early_param() will be parsed before map_mem() below. */ >> +static int __init parse_kfence_early_init(char *arg) >> +{ >> +    int val; >> + >> +    if (get_option(&arg, &val)) >> +        kfence_early_init = !!val; >> +    return 0; >> +} >> +early_param("kfence.sample_interval", parse_kfence_early_init); >> + >> +static phys_addr_t arm64_kfence_alloc_pool(void) > > and __init > >> +{ >> +    phys_addr_t kfence_pool; >> + >> +    if (!kfence_early_init) >> +        return 0; >> + >> +    kfence_pool = memblock_phys_alloc(KFENCE_POOL_SIZE, PAGE_SIZE); >> +    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; >> +} >> + >> +static void arm64_kfence_map_pool(phys_addr_t kfence_pool, pgd_t *pgdp) > > Ditto. > > Reviewed-by: Kefeng Wang > >> +{ >> +    if (!kfence_pool) >> +        return; >> + >> +    /* 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) >>   { >>       static const u64 direct_map_end = _PAGE_END(VA_BITS_MIN); >>       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; >> @@ -539,6 +596,8 @@ 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 (can_set_direct_map()) >>           flags |= NO_BLOCK_MAPPINGS | NO_CONT_MAPPINGS; >> @@ -604,6 +663,8 @@ static void __init map_mem(pgd_t *pgdp) >>           } >>       } >>   #endif >> + >> +    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 debdecf..dd1291a 100644 >> --- a/arch/arm64/mm/pageattr.c >> +++ b/arch/arm64/mm/pageattr.c >> @@ -11,6 +11,7 @@ >>   #include >>   #include >>   #include >> +#include >>   struct page_change_data { >>       pgprot_t set_mask; >> @@ -22,12 +23,14 @@ 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-granular mapping if initialized late. >>        */ >>       return (rodata_enabled && rodata_full) || >> debug_pagealloc_enabled() || >> -        IS_ENABLED(CONFIG_KFENCE); >> +        arm64_kfence_can_set_direct_map(); >>   } >>   static int change_page_range(pte_t *ptep, unsigned long addr, void >> *data) >> diff --git a/mm/kfence/core.c b/mm/kfence/core.c >> index 1417888..bf2f194c 100644 >> --- a/mm/kfence/core.c >> +++ b/mm/kfence/core.c >> @@ -824,6 +824,10 @@ void __init kfence_alloc_pool(void) >>       if (!kfence_sample_interval) >>           return; >> +    /* if the pool has already been initialized by arch, skip the >> below. */ >> +    if (__kfence_pool) >> +        return; >> + >>       __kfence_pool = memblock_alloc(KFENCE_POOL_SIZE, PAGE_SIZE); >>       if (!__kfence_pool)