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 B1CA4D3C549 for ; Fri, 18 Oct 2024 04:16:33 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 272106B0082; Fri, 18 Oct 2024 00:16:33 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 221026B0083; Fri, 18 Oct 2024 00:16:33 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 0C18A6B0085; Fri, 18 Oct 2024 00:16:33 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0014.hostedemail.com [216.40.44.14]) by kanga.kvack.org (Postfix) with ESMTP id E34A46B0082 for ; Fri, 18 Oct 2024 00:16:32 -0400 (EDT) Received: from smtpin19.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay07.hostedemail.com (Postfix) with ESMTP id 496A5161806 for ; Fri, 18 Oct 2024 04:16:19 +0000 (UTC) X-FDA: 82685410962.19.4784775 Received: from mail.loongson.cn (mail.loongson.cn [114.242.206.163]) by imf06.hostedemail.com (Postfix) with ESMTP id D84B918000D for ; Fri, 18 Oct 2024 04:16:21 +0000 (UTC) Authentication-Results: imf06.hostedemail.com; dkim=none; spf=pass (imf06.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=1729224796; 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=WP6P+IuTJcpjgkSRKRPTSezlMceIv/n3G8809khThsY=; b=eEO0YMzbbuFd0kdyOsPfcsRafg1aZ+e8MvuzfIb8qm651naq2cUiIToBrAlQwtWcQtlshh Z7Rgd2izBtItHrKEPzC5ilusUsovRCFGHKjqsUSXeKRBo3X3nnCdWLItZlJsxrlubppdfB vz5BG7D/Hp2ReGhtyxb3JWGhhVE6LcI= ARC-Authentication-Results: i=1; imf06.hostedemail.com; dkim=none; spf=pass (imf06.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=1729224796; a=rsa-sha256; cv=none; b=z1bwa+xfBQgplLUWKGuRC4S5Q4YMlHWPFVggi2/U80fkyvjMirhK5L2Znch8OKxa9N5kaP /l6tXTtckTJTjuqv6Ym+FS+kx4jmR7CZHH7Tu5hX6TJ0B8adpLLm5GGnLKwuDtmL2kaqLt /T56GLK8id1n80m5KLsOiN8dKsDlMRk= Received: from loongson.cn (unknown [10.20.42.62]) by gateway (Coremail) with SMTP id _____8CxLOsX4RFnwlEjAA--.51247S3; Fri, 18 Oct 2024 12:16:23 +0800 (CST) Received: from [10.20.42.62] (unknown [10.20.42.62]) by front1 (Coremail) with SMTP id qMiowMAxQNYU4RFnDmcvAA--.23651S3; Fri, 18 Oct 2024 12:16:20 +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 12:16:01 +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:qMiowMAxQNYU4RFnDmcvAA--.23651S3 X-CM-SenderInfo: xpdruxter6z05rqj20fqof0/ X-Coremail-Antispam: 1Uk129KBj93XoW3try5ZFWrur17Jr4UuF4DGFX_yoWDWr47pr 9rCF1kuF4UXrnrJwsFqwn0vrnFqwn7KF42gFnrKF1rAF9FgFnrXr1UJry3uFy8A3y8Ga40 vr4rKa4agF1Ut3cCm3ZEXasCq-sJn29KB7ZKAUJUUUU8529EdanIXcx71UUUUU7KY7ZEXa sCq-sGcSsGvfJ3Ic02F40EFcxC0VAKzVAqx4xG6I80ebIjqfuFe4nvWSU5nxnvy29KBjDU 0xBIdaVrnRJUUU9Sb4IE77IF4wAFF20E14v26r1j6r4UM7CY07I20VC2zVCF04k26cxKx2 IYs7xG6rWj6s0DM7CIcVAFz4kK6r1Y6r17M28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48v e4kI8wA2z4x0Y4vE2Ix0cI8IcVAFwI0_Jr0_JF4l84ACjcxK6xIIjxv20xvEc7CjxVAFwI 0_Jr0_Gr1l84ACjcxK6I8E87Iv67AKxVW8Jr0_Cr1UM28EF7xvwVC2z280aVCY1x0267AK xVW8Jr0_Cr1UM2AIxVAIcxkEcVAq07x20xvEncxIr21l57IF6xkI12xvs2x26I8E6xACxx 1l5I8CrVACY4xI64kE6c02F40Ex7xfMcIj6xIIjxv20xvE14v26r106r15McIj6I8E87Iv 67AKxVW8JVWxJwAm72CE4IkC6x0Yz7v_Jr0_Gr1lF7xvr2IY64vIr41lc7I2V7IY0VAS07 AlzVAYIcxG8wCF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkEbVWUJVW8JwCFI7km07C2 67AKxVWUtVW8ZwC20s026c02F40E14v26r1j6r18MI8I3I0E7480Y4vE14v26r106r1rMI 8E67AF67kF1VAFwI0_Jw0_GFylIxkGc2Ij64vIr41lIxAIcVC0I7IYx2IY67AKxVWUJVWU CwCI42IY6xIIjxv20xvEc7CjxVAFwI0_Jr0_Gr1lIxAIcVCF04k26cxKx2IYs7xG6r1j6r 1xMIIF0xvEx4A2jsIE14v26r4j6F4UMIIF0xvEx4A2jsIEc7CjxVAFwI0_Gr0_Gr1UYxBI daVFxhVjvjDU0xZFpf9x07jnUUUUUUUU= X-Rspamd-Server: rspam06 X-Rspamd-Queue-Id: D84B918000D X-Stat-Signature: jzi8m7pem8gb881f6uhk8p7b965uki9r X-Rspam-User: X-HE-Tag: 1729224981-193224 X-HE-Meta: U2FsdGVkX1+a6dVC8zlGcKGk2Nv4i/PFeTIyrAtSj9WuEQ9RM7VjC0IzA6J5bk6JEBLwYwEC03WnksDWRPjGsYJEuWUHb8okHL+6QZ9KAuzROAZW4d5YkMJSQ5v7BuBIzITltgyZHFAl9m5qGWBKaXX+SBLSQU9ug5aw2y3C62/wXvaDBWWq1rUZ8LnrzXaIzpQeaDNzr2nYQCRkM4HBgNL8CN9D+BAohgMDUa/5MkkIOVyU6rAPEpJaIik0XX1EEEBAQWxfU7hVXXZ3LErhGUXKvAS3rrgNIO9ODqNqIT+kt+UR5EdYIeJo20mqscxPzVEkhvsUgrI2BsIL6bS9+FLkBpxjfjZjd9ml4m26LfAqTyMsRa93n0eN1tsrMPcaHKrEvEfY6y0ErFgETvQ2Ol5P3Gk3XRxWT7D9sJY+QPRvvSVHEYFaQmjAkiqmBdoE+acK82qm4wddrkFr4j3ZAmUmsZm5gvQLvwNVxcH5Ztxf7bYpIe14mOLhr3D+lLgKV1quLv7gvKhMv80kA20YaC5sEx8Ejtix5Lyd8IX4zilJ+3lDWkIlW4vHb7XLaCt8ZR4YpLycsJN1vTTlLb0F543DS8Nm7OiPYUr/a2+hbxVvcguXimf+c1YQR61rDPH+GNhkYfH/QUeWsyYB/pt0JjlytjSvoxTWwwdk/ZeNR8FkyBWQhdpUdJ3OI009SEc7nILBSBG1kpvLAc7+fQktGJk93PRErW0PeJxqAHTDjoSDGu2XsM3nozBoA9uF1A7ZBaBRzSO7huTvAFQ3Ydd9Qk3NHtpX39MngX24JYA9z9CS80GM3cPZUSUrXI0D1v3j97ycbqPZ8mJmT2jJZTN+hy9NhdmDataxD8jirOCyUHL4AOVTMZKag9nq5/cfVGwv3T4ZmX6LbPNri//ZpCyIIjrMvtEEKO0ylPLnQE8Ni35fFEdsObjc9PN4BnlNTtKlSZG3njrsJ/NoJULZhPt lcQs2G0q YoXPnMfkQ+/ED9Os3dlrkrYlwZ4habFMTV4lfRFX6Xtnc0DbLSC4SmoxhC2rvhJBcrwj59Ua/JKtRsbqSC5reDsh1S0/6fpTSLSSKHyS1Cw04ycWDCv79epNtP3ObVxYuIlpnlQxwTH/Vkn6r5OFBiqf8R1J9IlX4Jib0z1v+B/N9D/DXL8293h+MK6PWv9ojCZ/IMuHRIcc0YDUN5OvYb2s5EA== 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 下午12:11, Huacai Chen wrote: > On Fri, Oct 18, 2024 at 11:44 AM maobibo wrote: >> >> >> >> 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()? > It exists before, not added by this patch. The reason is explained in > https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?h=v6.12-rc3&id=f93f67d06b1023313ef1662eac490e29c025c030 why speculative accesses may cause spurious page fault in kernel space with PTE enabled? speculative accesses exists anywhere, it does not cause spurious page fault. Obvious you do not it and you write wrong patch. > > Huacai > >> >> 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 >>>> >> >>