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 183C1C3DA61 for ; Thu, 25 Jul 2024 03:12:23 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 940266B0092; Wed, 24 Jul 2024 23:12:22 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 8F02C6B0093; Wed, 24 Jul 2024 23:12:22 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 791A66B0095; Wed, 24 Jul 2024 23:12:22 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id 57BE06B0092 for ; Wed, 24 Jul 2024 23:12:22 -0400 (EDT) Received: from smtpin03.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id D43BF40BEB for ; Thu, 25 Jul 2024 03:12:21 +0000 (UTC) X-FDA: 82376801682.03.63BCCAD Received: from mail-oi1-f174.google.com (mail-oi1-f174.google.com [209.85.167.174]) by imf13.hostedemail.com (Postfix) with ESMTP id 6CDEE20005 for ; Thu, 25 Jul 2024 03:12:19 +0000 (UTC) Authentication-Results: imf13.hostedemail.com; dkim=pass header.d=bytedance.com header.s=google header.b=OrJcpEm7; spf=none (imf13.hostedemail.com: domain of cuiyunhui@bytedance.com has no SPF policy when checking 209.85.167.174) smtp.mailfrom=cuiyunhui@bytedance.com; dmarc=pass (policy=quarantine) header.from=bytedance.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1721877116; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to: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=cu9687oCx4uOGDe4OiwariNCS6dee7E66EmnZVU7Q0Y=; b=qtoqX0hiQBVIkMT6EbQHUQoP+OZoWjwr5SluQA2PwgEZxtwV4SYLSMiRHl7ftygccTemIS u73IHrGeDaIPDOO8bUjN2aWgFvmokMI0k1N4lgntcxP5dc0DhCxDq6PSZ95Y1rq86QUlwi j4nV8TiiGagje3zHNrgUytaxauP8CeU= ARC-Authentication-Results: i=1; imf13.hostedemail.com; dkim=pass header.d=bytedance.com header.s=google header.b=OrJcpEm7; spf=none (imf13.hostedemail.com: domain of cuiyunhui@bytedance.com has no SPF policy when checking 209.85.167.174) smtp.mailfrom=cuiyunhui@bytedance.com; dmarc=pass (policy=quarantine) header.from=bytedance.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1721877116; a=rsa-sha256; cv=none; b=jloMG9h4mIsJhjDthlkDXRieN+0zPEhaO6zH3a7+saWIYRKEsFQ+UPZ6MYbFe7j2rHUhe2 tLQLa1acTPRxnKEYzHS3TcI3p/OU9lp4q7FegQUemN9VIvYk5k1xhVMEKfnqS+CFGBOrWq VFujjxBYPOUi8s70PddbKSKBSVavkFY= Received: by mail-oi1-f174.google.com with SMTP id 5614622812f47-3cabac56b38so304626b6e.3 for ; Wed, 24 Jul 2024 20:12:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bytedance.com; s=google; t=1721877138; x=1722481938; darn=kvack.org; h=content-transfer-encoding:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=cu9687oCx4uOGDe4OiwariNCS6dee7E66EmnZVU7Q0Y=; b=OrJcpEm7b8JR8hYjdVYJtfanMVSGL4woZC0IDONeY+ABvl4FiUeVCgcx+IBy3tgFIt h4PrOF6cZ92DLOg+tucIXMzyeh8Q4iKp5W4+grgScsDsSZzAk9JbIrNwgjV20plUeXEq Rl43UMic+GhKIZobbc/hbPTTTMt0/LPt4QAc1kGL0LxDq76fGa86gcbJdbbROHbbUJBc Ll+t4YUMSk0und+Z6wwGY4nco7heajLmcX7PLEYQ0JLfi15Gdw+ZclbR3Uh1qM+vP+X0 3Muoe6kPoC/z0c+AlPfH5+GO3rHde7Uxdx9kX6NV52/LzRRG0074VLON49lv+ajbQCki asFQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1721877138; x=1722481938; h=content-transfer-encoding:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=cu9687oCx4uOGDe4OiwariNCS6dee7E66EmnZVU7Q0Y=; b=QDFUEchp6fcL99j5Gf/DCKqDNnkaZnLPhOeZ5kFL9ZzoeVhz6BbIdULqGmCswpfs/+ X7tV/jk6QRdeZtWSwFZ76EU6aIH4uowo+LGCIkoQmCeANxbTw3u3au2o8z0RL2eM1yeg X1ty1AUkBd4/WlH3dHsQSCX9kLkxLIc/yYP2d8xfnQMt3vu/Hiu4MIEIGuzcOVIXdMxE hVtKWhQluAVDMGyDoFE7B4uYRE4NHyKAedFf7rvrcbMA2ElfP1yj4dHUZKo+EbkSMUOm H5FXf7R//IluXPjyupeTQcK4GHhC5v5hGW/P9n18xuvE4Il2BA/PhnTbsMBZfqE2Q2MG tw3w== X-Forwarded-Encrypted: i=1; AJvYcCWkbUNDX37TiJzwdQCN3nBGZySx/SM+Vb+i+MfsxvNBJcekxW3ymH5y7REaKxvMxVl+8XmVDdnBCi7H4Xx5KFTrZjA= X-Gm-Message-State: AOJu0YzFDxqsfVWRj0fJoxgPNoPrY4NllwNE6Te3Sonc4Lt07vhgilvS fnDILvPG1TM3hRytizQ6zcrt2gk4Egj4TZbwRd8TAxgoPVkeVYG8knTFbQicB3c6OtljMs6426i ZLMJyF4UuEdTWE4P/6JTANKnxoIgsfCEs1643Hw== X-Google-Smtp-Source: AGHT+IH7eQqNk/hE6j0z3hEenIAwOSDS1pqafFZdF1oX4eGeVYwsChdoaEs/YGxXKyBqffJft9Wjco1IX1haQoD405c= X-Received: by 2002:a05:6870:d10d:b0:260:e48b:62d8 with SMTP id 586e51a60fabf-264a0e7267emr1682524fac.29.1721877137982; Wed, 24 Jul 2024 20:12:17 -0700 (PDT) MIME-Version: 1.0 References: <20240724142137.91047-1-cuiyunhui@bytedance.com> In-Reply-To: <20240724142137.91047-1-cuiyunhui@bytedance.com> From: yunhui cui Date: Thu, 25 Jul 2024 11:12:07 +0800 Message-ID: Subject: Re: [PATCH] riscv: mm: add paging_check() before paging_init() To: punit.agrawal@bytedance.com, paul.walmsley@sifive.com, palmer@dabbelt.com, aou@eecs.berkeley.edu, rppt@kernel.org, akpm@linux-foundation.org, alexghiti@rivosinc.com, bjorn@rivosinc.com, tglx@linutronix.de, suagrfillet@gmail.com, arnd@arndb.de, samuel.holland@sifive.com, cuiyunhui@bytedance.com, david@redhat.com, shikemeng@huaweicloud.com, leobras@redhat.com, xiao.w.wang@intel.com, charlie@rivosinc.com, willy@infradead.org, jszhang@kernel.org, gregkh@linuxfoundation.org, chenjiahao16@huawei.com, conor.dooley@microchip.com, james.morse@arm.com, ajones@ventanamicro.com, bhe@redhat.com, rmk+kernel@armlinux.org.uk, namcao@linutronix.de, dawei.li@shingroup.cn, linux-riscv , lkml - Kernel Mailing List , linux-mm@kvack.org Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Rspamd-Server: rspam03 X-Rspam-User: X-Rspamd-Queue-Id: 6CDEE20005 X-Stat-Signature: tk4yc7bqay5honrj6fepns57j5aa4gmx X-HE-Tag: 1721877139-795302 X-HE-Meta: U2FsdGVkX1+NC71tAuCSlEiJvwE6JAIY0GSz7p/4z10Jg9QSJZUoEZeQ0y71tdiHzzSMS11HCayEgnzkCju7tU+VqqZmw885lEPOfbnP3koPjGQaTFAc1WWnZz1tz0D/yB7pMV1atT2d3XrFDvtKAKfIHDsf0v2Sh6jSsZZCpYQ9vqJT6sx0gKJpA6gSOTeD6LeW/UVNVXYWcqgmS54g3HZxqZ8u1VLbNE4ch3kqcgqsovZyMb9wVY8jroysh8tP+jfcXbyJAoXPd7zzl1fIRltbPWRWlyDv32H2u9X4wMy2yOyHnjhcbDywQ5CpzPKr27q614ZPpk4JaqKUXDnwpEWiVNuumjG0pBvHcVq1M/a3x3+YOQexu4+PmJMG3Ap7R88fKlzpGziLMHD/19XgzhS3MzQ7B+KjD6tXzDmpLmOJonn65AL98VkLpxKks52mwaQXyGix3mlxsDP96yvjUxjKE++NZKJcPA7fX7L/c+X0ATh5xduHveJLNksCe2s49odMvhRwGE/JpMG/yAtQl/9pkDPyWZo7KAux4Xo5ojEF84NAyy/twoilkuGnWnI1IxpUXg4EEtDpjZOf5VLEIMc4nJKK0MrNqb/e8rlNfdz3JgVYSQl9aPIOdxom/bOCXocD7dwkDE2WDZUPE60P4SEmgk2GXL02aObdM1fdmMCR9BcUvtTJBsiYDuYIty3SBn0I8wB7mBv8K80m7d5ndJI9AL1y0Gi6gZ88jcMyBkEnEMOO4Wbu6LNJ9HNkp+ztwZXPJwSxfeoqsBegyNZrd7ClB1RSipXTAgGCcNEYTRix3UjUebY86NbhATu9Wo0K7ucQ+e5kEIrXtgXyqrvq47m7Ab5vmYOVkh1+Z1BjrPD3B4GqBCsx/rHhoIUFKlgXJUR4MJV8r0SeQL2J6ZUy22fClUamsGBQE3YOjwFG3dH8v7iWBB3al7Q1ypPt1v8G6y9VYuYIxXQCxeW08UT UU8LFEd5 GgXYYJkV7A+EyWbAo6fFdVXrsAl/9uE3uAo/OQ/n3ywG3saKIwrhLFaVvBP8EbnQRnBfdhwmdtpg4KugahTCaKXoYCNIbhoyZDI7/ZvUKz/3jG+ajsQ5vy/CTagNDpkADqXfZdUgT3u1GUO0so0CWo4HXDlPCSYargrf7VYIZ7ETt8IAR/ubpTd99YkT+rjWJDcGmc7a5vCO043lgRlSVidBz7eb5yThDO5E1un/RlDyioD82SMoDbA2c93p817or8sobdBIaKU+YFZSQaxuPF98NdfwkAFP95uozlqN2qQE2QKgLdPhdKX7EfLLScygL+zpIm1+7buVqPZwW/PoTCkU3OwTtAeSSTsPnK7dJMxwqWuFME3FFsGq8a+I19JoylRiw9CG35+uOimppj/aEs7jsIxz+qqISSfJZ 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: Add mailing list: linux-riscv@lists.infradead.org,linux-kernel@vger.kernel.org,linux-mm@kvack= .org On Wed, Jul 24, 2024 at 10:22=E2=80=AFPM Yunhui Cui wrote: > > When establishing a linear mapping, the virtual address is obtained > through __va(). If the physical address is too large, such as 1TB, then > the virtual address will overflow in the address space of sv39. > The log is as follows: > [ 0.000000] Unable to handle kernel paging request at virtual address = 000000d97fdf7ad8 > [ 0.000000] [000000d97fdf7ad8] pgd=3D000000407ff7e801, p4d=3D000000407= ff7e801, pud=3D000000407ff7e801 > [ 0.000000] Unable to handle kernel paging request at virtual address = 000000d97fdfaff0 > [ 0.000000] [000000d97fdfaff0] pgd=3D000000407ff7e801, p4d=3D000000407= ff7e801, pud=3D000000407ff7e801 > ... > [ 0.000000] Insufficient stack space to handle exception! > [ 0.000000] Task stack: [0xffffffff81400000..0xffffffff81404000] > [ 0.000000] Overflow stack: [0xffffffff80c67370..0xffffffff80c68370] > [ 0.000000] CPU: 0 PID: 0 Comm: swapper Tainted: G W 6= .6.3-00133-g60497fad461d-dirty #71 > [ 0.000000] epc : die_kernel_fault+0x158/0x1c8 > [ 0.000000] ra : die_kernel_fault+0x12a/0x1c8 > [ 0.000000] epc : ffffffff808cde36 ra : ffffffff808cde08 sp : ffffffff= 813fff80 > [ 0.000000] gp : ffffffff815a1678 tp : 0000000000000000 t0 : 00000031= 30386537 > [ 0.000000] t1 : 0000000000000031 t2 : 6537666637303430 s0 : ffffffff= 813fffc0 > [ 0.000000] s1 : ffffffff815b0b28 a0 : 0000000000000016 a1 : ffffffff= 81495298 > [ 0.000000] a2 : 0000000000000010 a3 : ffffffff81495298 a4 : 00000000= 000001fe > [ 0.000000] a5 : 000000d97fdfa000 a6 : ffffffff814250d0 a7 : 00000000= 00000030 > [ 0.000000] s2 : 000000d97fdfaff0 s3 : ffffffff81400040 s4 : 000000d9= 7fdfaff0 > [ 0.000000] s5 : ffffffff815a0ed0 s6 : 0000000000000000 s7 : 00000000= 8f604390 > [ 0.000000] s8 : 0000000000000000 s9 : ffffffffffffffff s10: 00000000= 00000000 > [ 0.000000] s11: 0000000000000000 t3 : ffffffff815baa9b t4 : ffffffff= 815baa9b > [ 0.000000] t5 : ffffffff815baa88 t6 : ffffffff813ffda8 > [ 0.000000] status: 0000000200000100 badaddr: 000000d97fdfaff0 cause: = 000000000000000d > [ 0.000000] Kernel panic - not syncing: Kernel stack overflow > [ 0.000000] CPU: 0 PID: 0 Comm: swapper Tainted: G W 6= .6.3-00133-g60497fad461d-dirty #71 > [ 0.000000] Call Trace: > [ 0.000000] [] dump_backtrace+0x28/0x30 > [ 0.000000] [] show_stack+0x38/0x44 > [ 0.000000] [] dump_stack_lvl+0x44/0x5c > [ 0.000000] [] dump_stack+0x18/0x20 > [ 0.000000] [] panic+0x110/0x2f2 > [ 0.000000] [] walk_stackframe+0x0/0x120 > [ 0.000000] [] die_kernel_fault+0x12a/0x1c8 > [ 0.000000] ---[ end Kernel panic - not syncing: Kernel stack overflow= ]--- > > In other words, the maximum value of the physical address needs to meet > Documentation/riscv/vm-layout.rst to ensure that there is no overflow. > For sv48/57, the actual virtual address space is huge, so this problem > is generally not triggered, but it is also checked in the code. > > We give a warning for the overflowed physical address region and reverve = it > so that the kernel can bringup successfully. > > Signed-off-by: Yunhui Cui > --- > arch/riscv/include/asm/page.h | 9 +++++++ > arch/riscv/include/asm/pgtable.h | 1 + > arch/riscv/kernel/setup.c | 1 + > arch/riscv/mm/init.c | 44 ++++++++++++++++++++++++++++++++ > include/linux/memblock.h | 5 ++++ > mm/memblock.c | 5 ---- > 6 files changed, 60 insertions(+), 5 deletions(-) > > diff --git a/arch/riscv/include/asm/page.h b/arch/riscv/include/asm/page.= h > index 235fd45d998d..60c3db47c6d8 100644 > --- a/arch/riscv/include/asm/page.h > +++ b/arch/riscv/include/asm/page.h > @@ -38,6 +38,15 @@ > */ > #define PAGE_OFFSET_L4 _AC(0xffffaf8000000000, UL) > #define PAGE_OFFSET_L3 _AC(0xffffffd800000000, UL) > + > +/* > + * See vm-layout.rst, the size of L3 direct mapping of all physical > + * memory 124GB, L4 is 64TB, L5 is 32PB. > + */ > +#define MAX_PFN_MEM_ADDR_L5 (0x80000000000000ULL) > +#define MAX_PFN_MEM_ADDR_L4 (0x400000000000ULL) > +#define MAX_PFN_MEM_ADDR_L3 (0x1F00000000ULL) > + > #else > #define PAGE_OFFSET _AC(CONFIG_PAGE_OFFSET, UL) > #endif /* CONFIG_64BIT */ > diff --git a/arch/riscv/include/asm/pgtable.h b/arch/riscv/include/asm/pg= table.h > index 089f3c9f56a3..b4ff4791e1dc 100644 > --- a/arch/riscv/include/asm/pgtable.h > +++ b/arch/riscv/include/asm/pgtable.h > @@ -947,6 +947,7 @@ extern uintptr_t _dtb_early_pa; > #endif /* CONFIG_XIP_KERNEL */ > extern u64 satp_mode; > > +void paging_check(void); > void paging_init(void); > void misc_mem_init(void); > > diff --git a/arch/riscv/kernel/setup.c b/arch/riscv/kernel/setup.c > index 4f73c0ae44b2..24fedaa7ae93 100644 > --- a/arch/riscv/kernel/setup.c > +++ b/arch/riscv/kernel/setup.c > @@ -259,6 +259,7 @@ void __init setup_arch(char **cmdline_p) > parse_early_param(); > > efi_init(); > + paging_check(); > paging_init(); > > /* Parse the ACPI tables for possible boot-time configuration */ > diff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c > index bfa2dea95354..1c475c1d4c1b 100644 > --- a/arch/riscv/mm/init.c > +++ b/arch/riscv/mm/init.c > @@ -1385,6 +1385,50 @@ static void __init arch_reserve_crashkernel(void) > low_size, high); > } > > +static inline bool phymem_addr_overflow(phys_addr_t start, phys_addr_t e= nd) > +{ > + if (pgtable_l5_enabled) { > + if (start > MAX_PFN_MEM_ADDR_L5 || end > MAX_PFN_MEM_ADDR= _L5) > + goto out; > + } > + if (pgtable_l4_enabled) { > + if (start > MAX_PFN_MEM_ADDR_L4 || end > MAX_PFN_MEM_ADDR= _L4) > + goto out; > + } > + if (start > MAX_PFN_MEM_ADDR_L3 || end > MAX_PFN_MEM_ADDR_L3) > + goto out; > + > + return false; > + > +out: > + WARN(true, "Physical memory address overflowed!"); > + return true; > +} > + > +static void __init phymem_check(struct memblock_type *type) > +{ > + phys_addr_t base, end, size; > + int idx; > + struct memblock_region *rgn; > + > + for_each_memblock_type(idx, type, rgn) { > + base =3D rgn->base; > + size =3D rgn->size; > + end =3D base + size - 1; > + > + if (phymem_addr_overflow(base, end)) { > + pr_warn("Region: [0x%llx-0x%llx] reserved.", base= , end); > + memblock_reserve(base, size); > + } > + } > +} > + > +void __init paging_check(void) > +{ > + phymem_check(&memblock.reserved); > + phymem_check(&memblock.memory); > +} > + > void __init paging_init(void) > { > setup_bootmem(); > diff --git a/include/linux/memblock.h b/include/linux/memblock.h > index fc4d75c6cec3..36a38c326b7a 100644 > --- a/include/linux/memblock.h > +++ b/include/linux/memblock.h > @@ -251,6 +251,11 @@ static inline void __next_physmem_range(u64 *idx, st= ruct memblock_type *type, > __for_each_mem_range(i, &memblock.reserved, NULL, NUMA_NO_NODE, \ > MEMBLOCK_NONE, p_start, p_end, NULL) > > +#define for_each_memblock_type(i, memblock_type, rgn) \ > + for (i =3D 0, rgn =3D &memblock_type->regions[0]; = \ > + i < memblock_type->cnt; \ > + i++, rgn =3D &memblock_type->regions[i]) > + > static inline bool memblock_is_hotpluggable(struct memblock_region *m) > { > return m->flags & MEMBLOCK_HOTPLUG; > diff --git a/mm/memblock.c b/mm/memblock.c > index 3b9dc2d89b8a..f992050093f1 100644 > --- a/mm/memblock.c > +++ b/mm/memblock.c > @@ -141,11 +141,6 @@ struct memblock_type physmem =3D { > */ > static __refdata struct memblock_type *memblock_memory =3D &memblock.mem= ory; > > -#define for_each_memblock_type(i, memblock_type, rgn) \ > - for (i =3D 0, rgn =3D &memblock_type->regions[0]; = \ > - i < memblock_type->cnt; \ > - i++, rgn =3D &memblock_type->regions[i]) > - > #define memblock_dbg(fmt, ...) \ > do { \ > if (memblock_debug) \ > -- > 2.39.2 > Thanks, Yunhui