Re: [PATCH 4/8] x86/fpu: Remove the thread::fpu pointer

From: Peter Zijlstra
Date: Thu Apr 10 2025 - 03:40:44 EST


On Wed, Apr 09, 2025 at 11:11:23PM +0200, Ingo Molnar wrote:

> diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h
> index 5ea7e5d2c4de..b7f7c9c83409 100644
> --- a/arch/x86/include/asm/processor.h
> +++ b/arch/x86/include/asm/processor.h
> @@ -514,12 +514,9 @@ struct thread_struct {
>
> struct thread_shstk shstk;
> #endif
> -
> - /* Floating point and extended processor state */
> - struct fpu *fpu;
> };
>
> -#define x86_task_fpu(task) ((task)->thread.fpu)
> +#define x86_task_fpu(task) ((struct fpu *)((void *)(task) + sizeof(*(task))))

Doesn't our FPU state need to be cacheline aligned? Looking at struct
fpu, it has a bunch of members that have __aligned__(64) on them, and as
such the whole of struct fpu will inherit this alignment requirement.

This means that both task and sizeof(*task) need to be cacheline aligned
for this to work.

Would it make sense to add something like:

static_assert(sizeof(struct task_struct) % 64 == 0);

And I didn't check, but isn't task a page pointer and as such always
page aligned?