Re: [PATCH v8 11/14] x86/mm: Cap flush_tlb_info alignment at 64 bytes
From: Thomas Gleixner
Date: Fri Jun 26 2026 - 11:01:58 EST
On Tue, Jun 16 2026 at 19:11, Chuyi Zhou wrote:
> A stack allocated flush_tlb_info should keep cacheline alignment to
> avoid the regression that motivated the per-CPU storage, but using
> SMP_CACHE_BYTES directly can make the stack frame grow excessively on
> configurations with large cache lines[1].
>
> Add FLUSH_TLB_INFO_ALIGN and cap the type alignment at 64 bytes. The
> existing per-CPU flush_tlb_info instance remains
> DEFINE_PER_CPU_SHARED_ALIGNED(), so its per-CPU shared-cacheline
> alignment is unchanged.
>
> The capped type alignment matters once flush_tlb_info is moved back to the
> stack by the next patch.
This prepares for moving it back to the stack ....
> link[1]: https://lore.kernel.org/all/tip-780e0106d468a2962b16b52fdf42898f2639e0a0@xxxxxxxxxxxxxx/
This is not a documented tag. Please don't invent random tags just
because. Aside of that this lore link is silly. What's wrong with
referencing the commit?
.. excessively on configurations with large cache lines, which was
addressed in commit 780e0106d4 "....".
Hmm?
> Signed-off-by: Chuyi Zhou <zhouchuyi@xxxxxxxxxxxxx>
> ---
> arch/x86/include/asm/tlbflush.h | 5 ++++-
> 1 file changed, 4 insertions(+), 1 deletion(-)
>
> diff --git a/arch/x86/include/asm/tlbflush.h b/arch/x86/include/asm/tlbflush.h
> index 0545fe75c3fa..5889a6c4e956 100644
> --- a/arch/x86/include/asm/tlbflush.h
> +++ b/arch/x86/include/asm/tlbflush.h
> @@ -4,6 +4,7 @@
>
> #include <linux/mm_types.h>
> #include <linux/mmu_notifier.h>
> +#include <linux/minmax.h>
> #include <linux/sched.h>
>
> #include <asm/barrier.h>
> @@ -211,6 +212,8 @@ extern u16 invlpgb_count_max;
>
> extern void initialize_tlbstate_and_flush(void);
>
> +#define FLUSH_TLB_INFO_ALIGN MIN(SMP_CACHE_BYTES, 64)
This wants a comment.
> /*
> * TLB flushing:
> *
> @@ -249,7 +252,7 @@ struct flush_tlb_info {
> u8 stride_shift;
> u8 freed_tables;
> u8 trim_cpumask;
> -};
> +} __aligned(FLUSH_TLB_INFO_ALIGN);
>
> void flush_tlb_local(void);
> void flush_tlb_one_user(unsigned long addr);