x86/fpu: Use pkru_write_default() in copy_init_fpstate_to_fpregs()

ANBZ: #173

commit 371071131c upstream.

There is no point in using copy_init_pkru_to_fpregs() which in turn calls
write_pkru(). write_pkru() tries to fiddle with the task's xstate buffer
for nothing because the XRSTOR[S](init_fpstate) just cleared the xfeature
flag in the xstate header which makes get_xsave_addr() fail.

It's a useless exercise anyway because the reinitialization activates the
FPU so before the task's xstate buffer can be used again a XRSTOR[S] must
happen which in turn dumps the PKRU value.

Get rid of the now unused copy_init_pkru_to_fpregs().

Intel-SIG: commit 371071131c x86/fpu: Use pkru_write_default() in
copy_init_fpstate_to_fpregs().
Intel Advanced Matrix Extensions(AMX) is one of the key features on Sapphire
Rapids(SPR) and it depends on xsave, this patch is part of Thomas Gleixner's
x86 FPU code cleanup that upstream AMX implementation is building on, and is
also key to all code for being developed in upstream that depends on xsave.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Borislav Petkov <bp@suse.de>
Link: https://lkml.kernel.org/r/20210623121455.732508792@linutronix.de
[ Lin Wang: amend commit log ]
Signed-off-by: Lin Wang <lin.x.wang@intel.com>
Reviewed-by: Artie Ding <artie.ding@linux.alibaba.com>
This commit is contained in:
Thomas Gleixner 2021-06-23 14:02:11 +02:00 committed by Qiao Ma
parent 9d07b71d98
commit 33975ff5b5
4 changed files with 1 additions and 24 deletions

View File

@ -124,7 +124,6 @@ extern int arch_set_user_pkey_access(struct task_struct *tsk, int pkey,
unsigned long init_val);
extern int __arch_set_user_pkey_access(struct task_struct *tsk, int pkey,
unsigned long init_val);
extern void copy_init_pkru_to_fpregs(void);
static inline int vma_pkey(struct vm_area_struct *vma)
{

View File

@ -311,8 +311,7 @@ static inline void restore_fpregs_from_init_fpstate(u64 features_mask)
else
frstor(&init_fpstate.fsave);
if (cpu_feature_enabled(X86_FEATURE_OSPKE))
copy_init_pkru_to_fpregs();
pkru_write_default();
}
/*

View File

@ -10,7 +10,6 @@
#include <asm/cpufeature.h> /* boot_cpu_has, ... */
#include <asm/mmu_context.h> /* vma_pkey() */
#include <asm/pkru.h> /* read/write_pkru() */
int __execute_only_pkey(struct mm_struct *mm)
{
@ -125,22 +124,6 @@ u32 init_pkru_value = PKRU_AD_KEY( 1) | PKRU_AD_KEY( 2) | PKRU_AD_KEY( 3) |
PKRU_AD_KEY(10) | PKRU_AD_KEY(11) | PKRU_AD_KEY(12) |
PKRU_AD_KEY(13) | PKRU_AD_KEY(14) | PKRU_AD_KEY(15);
/*
* Called from the FPU code when creating a fresh set of FPU
* registers. This is called from a very specific context where
* we know the FPU regstiers are safe for use and we can use PKRU
* directly.
*/
void copy_init_pkru_to_fpregs(void)
{
u32 init_pkru_value_snapshot = READ_ONCE(init_pkru_value);
/*
* Override the PKRU state that came from 'init_fpstate'
* with the baseline from the process.
*/
write_pkru(init_pkru_value_snapshot);
}
static ssize_t init_pkru_read_file(struct file *file, char __user *user_buf,
size_t count, loff_t *ppos)
{

View File

@ -44,10 +44,6 @@ static inline bool arch_pkeys_enabled(void)
return false;
}
static inline void copy_init_pkru_to_fpregs(void)
{
}
#endif /* ! CONFIG_ARCH_HAS_PKEYS */
#endif /* _LINUX_PKEYS_H */