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 06905D3C545 for ; Fri, 18 Oct 2024 03:45:11 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 20E266B0082; Thu, 17 Oct 2024 23:45:11 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 1BD046B0083; Thu, 17 Oct 2024 23:45:11 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 05D1F6B0085; Thu, 17 Oct 2024 23:45:10 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0010.hostedemail.com [216.40.44.10]) by kanga.kvack.org (Postfix) with ESMTP id DBDCC6B0082 for ; Thu, 17 Oct 2024 23:45:10 -0400 (EDT) Received: from smtpin20.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay03.hostedemail.com (Postfix) with ESMTP id F0DF8A16D1 for ; Fri, 18 Oct 2024 03:44:48 +0000 (UTC) X-FDA: 82685331708.20.B3B8997 Received: from mail.loongson.cn (mail.loongson.cn [114.242.206.163]) by imf23.hostedemail.com (Postfix) with ESMTP id DB558140012 for ; Fri, 18 Oct 2024 03:44:59 +0000 (UTC) Authentication-Results: imf23.hostedemail.com; dkim=none; spf=pass (imf23.hostedemail.com: domain of maobibo@loongson.cn designates 114.242.206.163 as permitted sender) smtp.mailfrom=maobibo@loongson.cn; dmarc=none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1729222914; 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=lTAxJwkGGKWR2096DeYAbEpsIZo7osRC19vJGemQ3W8=; b=gmxDrDrybvTtFTykW2w6xEeNDC1XuB3dDRfS17o3wokvWhBPVTR22NVxo6xrZB/i/Vjg3U GHdt7tF5Xuxfc7nznoXrSu26VS8ENS15T4lWdiBKHVNWM1EanhfapDbg44zHPFj98H5ly/ 1BQcmGkQOXYSvBgC/8UE5mIoM4PH1SU= ARC-Authentication-Results: i=1; imf23.hostedemail.com; dkim=none; spf=pass (imf23.hostedemail.com: domain of maobibo@loongson.cn designates 114.242.206.163 as permitted sender) smtp.mailfrom=maobibo@loongson.cn; dmarc=none ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1729222914; a=rsa-sha256; cv=none; b=q0AQHY6jAxP9jUiA1fLyvbL/BNeUWjOSp1vG7gnsawxvY5EILASrNyGMcOyKeDlaPC9ADT coapY5DfqYwu4wOUIvhmhKKoKXjE/S7K4JDbg3dbkH2wY7Oj01Jdna0eQ8Vqwh8L3JTyDd K0P3JQKK1JrhXFAaAGHvhYABBm+pTJQ= Received: from loongson.cn (unknown [10.20.42.62]) by gateway (Coremail) with SMTP id _____8AxvvCv2RFnZkwjAA--.52093S3; Fri, 18 Oct 2024 11:44:48 +0800 (CST) Received: from [10.20.42.62] (unknown [10.20.42.62]) by front1 (Coremail) with SMTP id qMiowMBxHeSn2RFnpmAvAA--.29241S3; Fri, 18 Oct 2024 11:44:41 +0800 (CST) Subject: Re: [PATCH v2 1/3] LoongArch: Set initial pte entry with PAGE_GLOBAL for kernel space To: Huacai Chen Cc: Andrey Ryabinin , Andrew Morton , David Hildenbrand , Barry Song , loongarch@lists.linux.dev, linux-kernel@vger.kernel.org, kasan-dev@googlegroups.com, linux-mm@kvack.org References: <20241014035855.1119220-1-maobibo@loongson.cn> <20241014035855.1119220-2-maobibo@loongson.cn> From: maobibo Message-ID: Date: Fri, 18 Oct 2024 11:44:20 +0800 User-Agent: Mozilla/5.0 (X11; Linux loongarch64; rv:68.0) Gecko/20100101 Thunderbird/68.7.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 8bit X-CM-TRANSID:qMiowMBxHeSn2RFnpmAvAA--.29241S3 X-CM-SenderInfo: xpdruxter6z05rqj20fqof0/ X-Coremail-Antispam: 1Uk129KBj93XoW3ArWxtrWfKrWkZr1Utw4fJFc_yoWfWr4rpF 9rCFn5WF4UXr97Ja92qr1Uur1UXwsagF4xKFnFkFyrAasFgr1kWr18Gr9xuF1kA3yUCa4F vr4fKa4a9a1jqagCm3ZEXasCq-sJn29KB7ZKAUJUUUU7529EdanIXcx71UUUUU7KY7ZEXa sCq-sGcSsGvfJ3Ic02F40EFcxC0VAKzVAqx4xG6I80ebIjqfuFe4nvWSU5nxnvy29KBjDU 0xBIdaVrnRJUUUPIb4IE77IF4wAFF20E14v26r1j6r4UM7CY07I20VC2zVCF04k26cxKx2 IYs7xG6rWj6s0DM7CIcVAFz4kK6r1Y6r17M28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48v e4kI8wA2z4x0Y4vE2Ix0cI8IcVAFwI0_JFI_Gr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI 0_Jr0_Gr1l84ACjcxK6I8E87Iv67AKxVW8Jr0_Cr1UM28EF7xvwVC2z280aVCY1x0267AK xVW8Jr0_Cr1UM2kKe7AKxVWUXVWUAwAS0I0E0xvYzxvE52x082IY62kv0487Mc804VCY07 AIYIkI8VC2zVCFFI0UMc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7IYx2IY67AKxVWU AVWUtwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j6r4UM4x0Y48IcVAKI4 8JMxk0xIA0c2IEe2xFo4CEbIxvr21lc7CjxVAaw2AFwI0_JF0_Jw1l42xK82IYc2Ij64vI r41l4I8I3I0E4IkC6x0Yz7v_Jr0_Gr1l4IxYO2xFxVAFwI0_Jrv_JF1lx2IqxVAqx4xG67 AKxVWUJVWUGwC20s026x8GjcxK67AKxVWUGVWUWwC2zVAF1VAY17CE14v26r1q6r43MIIY rxkI7VAKI48JMIIF0xvE2Ix0cI8IcVAFwI0_Jr0_JF4lIxAIcVC0I7IYx2IY6xkF7I0E14 v26r1j6r4UMIIF0xvE42xK8VAvwI8IcIk0rVWUJVWUCwCI42IY6I8E87Iv67AKxVWUJVW8 JwCI42IY6I8E87Iv6xkF7I0E14v26r1j6r4UYxBIdaVFxhVjvjDU0xZFpf9x07jOiSdUUU UU= X-Rspamd-Server: rspam06 X-Rspamd-Queue-Id: DB558140012 X-Stat-Signature: 7defcqwjkwh67ea1kzay655y1kjgojrq X-Rspam-User: X-HE-Tag: 1729223099-67582 X-HE-Meta: U2FsdGVkX1+trBijCSjwn/GXePu4TnqXiyGy0rQ4FPnHFaPmJTJt11GIOFoJDjpx/5wfUHz0h8gVX6qNGYU7PGbxMed9CUfKAtKSMPaXfX06zzd3DtMsA18NEU+RojEiUe29ut5nMRHlo8/aGS9eKJ+Bbn2bGt5IKSu+gxPn+ImMboTmxGX8U0HAOBTiD07iHKPTyORa3mQ21HwrM6fAqdgpXSSrUkakE30SQWuyoHm4waXhVh+YS9yoo4HTlBWxdXIullCKaz/RqD7Sp6qwnzTsCQe4OqzNxGms/BByANgGdi70BPBXdlx4ECfHEXbIky9lKAYiHXURRkZDBZfffq6p8BYdpTABJpIuKlV35r+tN8EnEPB+tu6QW4W8eCvdPLbI5MGPDsut1pSewIloc5hzyZMTxF64ua+vM3OeMI6f1AGmuLf4jyTkH33zSf9AFEoxUoT9srpCbU1eGPdAOB4au3ua8m/r7mRsKTXw+FHK5nd1w3Gyfrst9sihLX83jPNHCVAPpkUiVkLOVINrd2zfSKNpElivPu2DknJUV16QCdAhGuttMJeAWeym3BT4Ki23hIxZPUg0vWK0ndXpZL9aafKBFP9Mz5cwheTJR73xaVNKOL28OH3sXooOn8L42dvieAAZlh18aY/2dYnBnLtiZ7O/3kgoKt5buqMLljOArTag2ZAeeRPhsPE7CHGxSHS6n5YOo1NlvCrdXeV5UVsjNVAxdQ1QuEhJWToh3b14EdKjr4nxxMj071BZecgvOwOBkdFIU61VaOiigC/EB869AjQXPX//zHwQMQRdtHFhVsZC2D+WPJRCfjusZReTckdMYE8BOnYwm9boDjJuT+6lxBBgJ05Cp8K0eaTXUPL/qGj5e6MjEwyJFd2cFZeyJcWm4YokyyrHbcb5uSA2sTpugU2XJPHxplzhDDe3JtZcOhd9s7HFkY9ZJTy6Ds0fJkRJ1g8qOFc6ZQfM1QU jQHalrlK V7M3ltT6BBergpYFicQZnlQqYD4A1fb7f/di3zKpuwsqU8JVu/cDjhHgyh1S/cDEITltyII6qB0dzGU1OQUhreeeXdFGa0bBtquGVjezlvRtTPTDTolQqDVxzfdGyKJ/MTGju6kguS4jaz818+qaIVlur1+rwc86qILU6lWuqCI8zEiM6nmmhFkQSXRUpf4bkFdMBoZV9jXvcO3VmRkxFhKLrwA== 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: List-Subscribe: List-Unsubscribe: On 2024/10/18 上午11:14, Huacai Chen wrote: > Hi, Bibo, > > I applied this patch but drop the part of arch/loongarch/mm/kasan_init.c: > https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson.git/commit/?h=loongarch-next&id=15832255e84494853f543b4c70ced50afc403067 > > Because kernel_pte_init() should operate on page-table pages, not on > data pages. You have already handle page-table page in > mm/kasan/init.c, and if we don't drop the modification on data pages > in arch/loongarch/mm/kasan_init.c, the kernel fail to boot if KASAN is > enabled. > static inline void set_pte(pte_t *ptep, pte_t pteval) { WRITE_ONCE(*ptep, pteval); - - if (pte_val(pteval) & _PAGE_GLOBAL) { - pte_t *buddy = ptep_buddy(ptep); - /* - * Make sure the buddy is global too (if it's !none, - * it better already be global) - */ - if (pte_none(ptep_get(buddy))) { -#ifdef CONFIG_SMP - /* - * For SMP, multiple CPUs can race, so we need - * to do this atomically. - */ - __asm__ __volatile__( - __AMOR "$zero, %[global], %[buddy] \n" - : [buddy] "+ZB" (buddy->pte) - : [global] "r" (_PAGE_GLOBAL) - : "memory"); - - DBAR(0b11000); /* o_wrw = 0b11000 */ -#else /* !CONFIG_SMP */ - WRITE_ONCE(*buddy, __pte(pte_val(ptep_get(buddy)) | _PAGE_GLOBAL)); -#endif /* CONFIG_SMP */ - } - } + DBAR(0b11000); /* o_wrw = 0b11000 */ } No, please hold on. This issue exists about twenty years, Do we need be in such a hurry now? why is DBAR(0b11000) added in set_pte()? Regards Bibo Mao > Huacai > > On Mon, Oct 14, 2024 at 11:59 AM Bibo Mao wrote: >> >> Unlike general architectures, there are two pages in one TLB entry >> on LoongArch system. For kernel space, it requires both two pte >> entries with PAGE_GLOBAL bit set, else HW treats it as non-global >> tlb, there will be potential problems if tlb entry for kernel space >> is not global. Such as fail to flush kernel tlb with function >> local_flush_tlb_kernel_range() which only flush tlb with global bit. >> >> With function kernel_pte_init() added, it can be used to init pte >> table when it is created for kernel address space, and the default >> initial pte value is PAGE_GLOBAL rather than zero at beginning. >> >> Kernel address space areas includes fixmap, percpu, vmalloc, kasan >> and vmemmap areas set default pte entry with PAGE_GLOBAL set. >> >> Signed-off-by: Bibo Mao >> --- >> arch/loongarch/include/asm/pgalloc.h | 13 +++++++++++++ >> arch/loongarch/include/asm/pgtable.h | 1 + >> arch/loongarch/mm/init.c | 4 +++- >> arch/loongarch/mm/kasan_init.c | 4 +++- >> arch/loongarch/mm/pgtable.c | 22 ++++++++++++++++++++++ >> include/linux/mm.h | 1 + >> mm/kasan/init.c | 8 +++++++- >> mm/sparse-vmemmap.c | 5 +++++ >> 8 files changed, 55 insertions(+), 3 deletions(-) >> >> diff --git a/arch/loongarch/include/asm/pgalloc.h b/arch/loongarch/include/asm/pgalloc.h >> index 4e2d6b7ca2ee..b2698c03dc2c 100644 >> --- a/arch/loongarch/include/asm/pgalloc.h >> +++ b/arch/loongarch/include/asm/pgalloc.h >> @@ -10,8 +10,21 @@ >> >> #define __HAVE_ARCH_PMD_ALLOC_ONE >> #define __HAVE_ARCH_PUD_ALLOC_ONE >> +#define __HAVE_ARCH_PTE_ALLOC_ONE_KERNEL >> #include >> >> +static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm) >> +{ >> + pte_t *pte; >> + >> + pte = (pte_t *) __get_free_page(GFP_KERNEL); >> + if (!pte) >> + return NULL; >> + >> + kernel_pte_init(pte); >> + return pte; >> +} >> + >> static inline void pmd_populate_kernel(struct mm_struct *mm, >> pmd_t *pmd, pte_t *pte) >> { >> diff --git a/arch/loongarch/include/asm/pgtable.h b/arch/loongarch/include/asm/pgtable.h >> index 9965f52ef65b..22e3a8f96213 100644 >> --- a/arch/loongarch/include/asm/pgtable.h >> +++ b/arch/loongarch/include/asm/pgtable.h >> @@ -269,6 +269,7 @@ extern void set_pmd_at(struct mm_struct *mm, unsigned long addr, pmd_t *pmdp, pm >> extern void pgd_init(void *addr); >> extern void pud_init(void *addr); >> extern void pmd_init(void *addr); >> +extern void kernel_pte_init(void *addr); >> >> /* >> * Encode/decode swap entries and swap PTEs. Swap PTEs are all PTEs that >> diff --git a/arch/loongarch/mm/init.c b/arch/loongarch/mm/init.c >> index 8a87a482c8f4..9f26e933a8a3 100644 >> --- a/arch/loongarch/mm/init.c >> +++ b/arch/loongarch/mm/init.c >> @@ -198,9 +198,11 @@ pte_t * __init populate_kernel_pte(unsigned long addr) >> if (!pmd_present(pmdp_get(pmd))) { >> pte_t *pte; >> >> - pte = memblock_alloc(PAGE_SIZE, PAGE_SIZE); >> + pte = memblock_alloc_raw(PAGE_SIZE, PAGE_SIZE); >> if (!pte) >> panic("%s: Failed to allocate memory\n", __func__); >> + >> + kernel_pte_init(pte); >> pmd_populate_kernel(&init_mm, pmd, pte); >> } >> >> diff --git a/arch/loongarch/mm/kasan_init.c b/arch/loongarch/mm/kasan_init.c >> index 427d6b1aec09..34988573b0d5 100644 >> --- a/arch/loongarch/mm/kasan_init.c >> +++ b/arch/loongarch/mm/kasan_init.c >> @@ -152,6 +152,8 @@ static void __init kasan_pte_populate(pmd_t *pmdp, unsigned long addr, >> phys_addr_t page_phys = early ? >> __pa_symbol(kasan_early_shadow_page) >> : kasan_alloc_zeroed_page(node); >> + if (!early) >> + kernel_pte_init(__va(page_phys)); >> next = addr + PAGE_SIZE; >> set_pte(ptep, pfn_pte(__phys_to_pfn(page_phys), PAGE_KERNEL)); >> } while (ptep++, addr = next, addr != end && __pte_none(early, ptep_get(ptep))); >> @@ -287,7 +289,7 @@ void __init kasan_init(void) >> set_pte(&kasan_early_shadow_pte[i], >> pfn_pte(__phys_to_pfn(__pa_symbol(kasan_early_shadow_page)), PAGE_KERNEL_RO)); >> >> - memset(kasan_early_shadow_page, 0, PAGE_SIZE); >> + kernel_pte_init(kasan_early_shadow_page); >> csr_write64(__pa_symbol(swapper_pg_dir), LOONGARCH_CSR_PGDH); >> local_flush_tlb_all(); >> >> diff --git a/arch/loongarch/mm/pgtable.c b/arch/loongarch/mm/pgtable.c >> index eb6a29b491a7..228ffc1db0a3 100644 >> --- a/arch/loongarch/mm/pgtable.c >> +++ b/arch/loongarch/mm/pgtable.c >> @@ -38,6 +38,28 @@ pgd_t *pgd_alloc(struct mm_struct *mm) >> } >> EXPORT_SYMBOL_GPL(pgd_alloc); >> >> +void kernel_pte_init(void *addr) >> +{ >> + unsigned long *p, *end; >> + unsigned long entry; >> + >> + entry = (unsigned long)_PAGE_GLOBAL; >> + p = (unsigned long *)addr; >> + end = p + PTRS_PER_PTE; >> + >> + do { >> + p[0] = entry; >> + p[1] = entry; >> + p[2] = entry; >> + p[3] = entry; >> + p[4] = entry; >> + p += 8; >> + p[-3] = entry; >> + p[-2] = entry; >> + p[-1] = entry; >> + } while (p != end); >> +} >> + >> void pgd_init(void *addr) >> { >> unsigned long *p, *end; >> diff --git a/include/linux/mm.h b/include/linux/mm.h >> index ecf63d2b0582..6909fe059a2c 100644 >> --- a/include/linux/mm.h >> +++ b/include/linux/mm.h >> @@ -3818,6 +3818,7 @@ void *sparse_buffer_alloc(unsigned long size); >> struct page * __populate_section_memmap(unsigned long pfn, >> unsigned long nr_pages, int nid, struct vmem_altmap *altmap, >> struct dev_pagemap *pgmap); >> +void kernel_pte_init(void *addr); >> void pmd_init(void *addr); >> void pud_init(void *addr); >> pgd_t *vmemmap_pgd_populate(unsigned long addr, int node); >> diff --git a/mm/kasan/init.c b/mm/kasan/init.c >> index 89895f38f722..ac607c306292 100644 >> --- a/mm/kasan/init.c >> +++ b/mm/kasan/init.c >> @@ -106,6 +106,10 @@ static void __ref zero_pte_populate(pmd_t *pmd, unsigned long addr, >> } >> } >> >> +void __weak __meminit kernel_pte_init(void *addr) >> +{ >> +} >> + >> static int __ref zero_pmd_populate(pud_t *pud, unsigned long addr, >> unsigned long end) >> { >> @@ -126,8 +130,10 @@ static int __ref zero_pmd_populate(pud_t *pud, unsigned long addr, >> >> if (slab_is_available()) >> p = pte_alloc_one_kernel(&init_mm); >> - else >> + else { >> p = early_alloc(PAGE_SIZE, NUMA_NO_NODE); >> + kernel_pte_init(p); >> + } >> if (!p) >> return -ENOMEM; >> >> diff --git a/mm/sparse-vmemmap.c b/mm/sparse-vmemmap.c >> index edcc7a6b0f6f..c0388b2e959d 100644 >> --- a/mm/sparse-vmemmap.c >> +++ b/mm/sparse-vmemmap.c >> @@ -184,6 +184,10 @@ static void * __meminit vmemmap_alloc_block_zero(unsigned long size, int node) >> return p; >> } >> >> +void __weak __meminit kernel_pte_init(void *addr) >> +{ >> +} >> + >> pmd_t * __meminit vmemmap_pmd_populate(pud_t *pud, unsigned long addr, int node) >> { >> pmd_t *pmd = pmd_offset(pud, addr); >> @@ -191,6 +195,7 @@ pmd_t * __meminit vmemmap_pmd_populate(pud_t *pud, unsigned long addr, int node) >> void *p = vmemmap_alloc_block_zero(PAGE_SIZE, node); >> if (!p) >> return NULL; >> + kernel_pte_init(p); >> pmd_populate_kernel(&init_mm, pmd, p); >> } >> return pmd; >> -- >> 2.39.3 >>