All of lore.kernel.org
 help / color / mirror / Atom feed
From: Gregory CLEMENT <gregory.clement@bootlin.com>
To: "Maciej W. Rozycki" <macro@orcam.me.uk>,
	Thomas Bogendoerfer <tsbogend@alpha.franken.de>
Cc: Jiaxun Yang <jiaxun.yang@flygoat.com>,
	linux-mips@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v4] MIPS: mm: kmalloc tlb_vpn array to avoid stack overflow
Date: Fri, 28 Nov 2025 10:22:57 +0100	[thread overview]
Message-ID: <871pli5x5a.fsf@BLaptop.bootlin.com> (raw)
In-Reply-To: <alpine.DEB.2.21.2511280544050.36486@angie.orcam.me.uk>

Hello Maciej,

> From: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
>
> Owing to Config4.MMUSizeExt and VTLB/FTLB MMU features later MIPSr2+ 
> cores can have more than 64 TLB entries.  Therefore allocate an array 
> for uniquification instead of placing too small an array on the stack.
>
> Fixes: 35ad7e181541 ("MIPS: mm: tlb-r4k: Uniquify TLB entries on init")
> Co-developed-by: Maciej W. Rozycki <macro@orcam.me.uk>
> Signed-off-by: Maciej W. Rozycki <macro@orcam.me.uk>
> Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
> Cc: stable@vger.kernel.org # v6.17+: 9f048fa48740: MIPS: mm: Prevent a TLB shutdown on initial uniquification
> Cc: stable@vger.kernel.org # v6.17+

Thanks for this patch. It allows booting on EyQ5 and EyeQ6H. However,
during the build process, I saw this new warning:

WARNING: modpost: vmlinux: section mismatch in reference: r4k_tlb_configure+0x3e4 (section: .text) -> memblock_alloc_try_nid_raw (section: .init.text)

Tested-by: Gregory CLEMENT <gregory.clement@bootlin.com>

Gregory

> ---
>  Verified with Malta/74Kf and Malta/interAptiv for initial and secondary 
> CPU bootstrap.  The PM path hasn't been covered, but is expected to be 
> the same as secondary CPU bootstrap.
>
>  NB Malta/interAptiv has issues later on in SMP boot (boots fine UP) and 
> hangs with repeated:
>
> irq 23: nobody cared (try booting with the "irqpoll" option)
> CPU: 1 UID: 0 PID: 0 Comm: swapper/1 Not tainted 6.18.0-rc1-dirty #2 NONE
>
> messages (for the CP0 timer interrupt AFAICT; GIC timer is supposed to 
> be used instead).  This will have to be bisected.
>
> Changes from v3:
>
> - Rearrange tags including stable backport ones so as to pick the original 
>   change together with this fix only.
>
> Changes from v2:
>
> - Use the bootmem allocator for early calls (CPU #0 bootstrap).
>
> - Update the change description; mark for stable backporting.
> ---
>  arch/mips/mm/tlb-r4k.c |   16 +++++++++++++++-
>  1 file changed, 15 insertions(+), 1 deletion(-)
>
> linux-mips-tlb-r4k-uniquify-tlbsize.diff
> Index: linux-macro/arch/mips/mm/tlb-r4k.c
> ===================================================================
> --- linux-macro.orig/arch/mips/mm/tlb-r4k.c
> +++ linux-macro/arch/mips/mm/tlb-r4k.c
> @@ -12,6 +12,7 @@
>  #include <linux/init.h>
>  #include <linux/sched.h>
>  #include <linux/smp.h>
> +#include <linux/memblock.h>
>  #include <linux/mm.h>
>  #include <linux/hugetlb.h>
>  #include <linux/export.h>
> @@ -524,15 +525,24 @@ static int r4k_vpn_cmp(const void *a, co
>   */
>  static void r4k_tlb_uniquify(void)
>  {
> -	unsigned long tlb_vpns[1 << MIPS_CONF1_TLBS_SIZE];
>  	int tlbsize = current_cpu_data.tlbsize;
> +	bool use_slab = slab_is_available();
>  	int start = num_wired_entries();
> +	phys_addr_t tlb_vpn_size;
> +	unsigned long *tlb_vpns;
>  	unsigned long vpn_mask;
>  	int cnt, ent, idx, i;
>  
>  	vpn_mask = GENMASK(cpu_vmbits - 1, 13);
>  	vpn_mask |= IS_ENABLED(CONFIG_64BIT) ? 3ULL << 62 : 1 << 31;
>  
> +	tlb_vpn_size = tlbsize * sizeof(*tlb_vpns);
> +	tlb_vpns = (use_slab ?
> +		    kmalloc(tlb_vpn_size, GFP_KERNEL) :
> +		    memblock_alloc_raw(tlb_vpn_size, sizeof(*tlb_vpns)));
> +	if (WARN_ON(!tlb_vpns))
> +		return; /* Pray local_flush_tlb_all() is good enough. */
> +
>  	htw_stop();
>  
>  	for (i = start, cnt = 0; i < tlbsize; i++, cnt++) {
> @@ -585,6 +595,10 @@ static void r4k_tlb_uniquify(void)
>  	tlbw_use_hazard();
>  	htw_start();
>  	flush_micro_tlb();
> +	if (use_slab)
> +		kfree(tlb_vpns);
> +	else
> +		memblock_free(tlb_vpns, tlb_vpn_size);
>  }
>  
>  /*

-- 
Grégory CLEMENT, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com

  reply	other threads:[~2025-11-28  9:23 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-11-28  5:53 [PATCH v4] MIPS: mm: kmalloc tlb_vpn array to avoid stack overflow Maciej W. Rozycki
2025-11-28  9:22 ` Gregory CLEMENT [this message]
2025-11-28 16:56   ` Maciej W. Rozycki
2025-11-28 12:30 ` Klara Modin
2025-11-28 16:57   ` Maciej W. Rozycki

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=871pli5x5a.fsf@BLaptop.bootlin.com \
    --to=gregory.clement@bootlin.com \
    --cc=jiaxun.yang@flygoat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mips@vger.kernel.org \
    --cc=macro@orcam.me.uk \
    --cc=tsbogend@alpha.franken.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.