Message ID | 20240124024200.102792-7-weijiang.yang@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Enable CET Virtualization | expand |
On Tue, 2024-01-23 at 18:41 -0800, Yang Weijiang wrote: > -bool fpu_alloc_guest_fpstate(struct fpu_guest *gfpu) > +static struct fpstate *__fpu_alloc_init_guest_fpstate(struct > fpu_guest *gfpu) > { > struct fpstate *fpstate; > unsigned int size; > > - size = fpu_user_cfg.default_size + ALIGN(offsetof(struct > fpstate, regs), 64); > + /* > + * fpu_guest_cfg.default_size is initialized to hold all > enabled > + * xfeatures except the user dynamic xfeatures. If the user > dynamic > + * xfeatures are enabled, the guest fpstate will be re- > allocated to > + * hold all guest enabled xfeatures, so omit user dynamic > xfeatures > + * here. > + */ > + size = fpu_guest_cfg.default_size + > + ALIGN(offsetof(struct fpstate, regs), 64); Minor, I'm not sure the extra char warrants changing it to a wrapped line, but that's just my personal opinion. > + > fpstate = vzalloc(size); > if (!fpstate) > - return false; > + return NULL; > + /* > + * Initialize sizes and feature masks, use fpu_user_cfg.* > + * for user_* settings for compatibility of exiting uAPIs. > + */ > + fpstate->size = fpu_guest_cfg.default_size; > + fpstate->xfeatures = fpu_guest_cfg.default_features; > + fpstate->user_size = fpu_user_cfg.default_size; > + fpstate->user_xfeatures = fpu_user_cfg.default_features; > + fpstate->xfd = 0; > > - /* Leave xfd to 0 (the reset value defined by spec) */ > - __fpstate_reset(fpstate, 0); > fpstate_init_user(fpstate); > fpstate->is_valloc = true; > fpstate->is_guest = true; > > gfpu->fpstate = fpstate; > - gfpu->xfeatures = fpu_user_cfg.default_features; > - gfpu->perm = fpu_user_cfg.default_features; > + gfpu->xfeatures = fpu_guest_cfg.default_features; > + gfpu->perm = fpu_guest_cfg.default_features; > + > + return fpstate; > +} > + > +bool fpu_alloc_guest_fpstate(struct fpu_guest *gfpu) > +{ > + struct fpstate *fpstate; > + > + fpstate = __fpu_alloc_init_guest_fpstate(gfpu); The above two statements could be just one line and still even fit under 80 chars. All the same, Reviewed-by: Rick Edgecombe <rick.p.edgecombe@intel.com> > + > + if (!fpstate) > + return false; >
On 1/30/2024 9:38 AM, Edgecombe, Rick P wrote: > On Tue, 2024-01-23 at 18:41 -0800, Yang Weijiang wrote: >> -bool fpu_alloc_guest_fpstate(struct fpu_guest *gfpu) >> +static struct fpstate *__fpu_alloc_init_guest_fpstate(struct >> fpu_guest *gfpu) >> { >> struct fpstate *fpstate; >> unsigned int size; >> >> - size = fpu_user_cfg.default_size + ALIGN(offsetof(struct >> fpstate, regs), 64); >> + /* >> + * fpu_guest_cfg.default_size is initialized to hold all >> enabled >> + * xfeatures except the user dynamic xfeatures. If the user >> dynamic >> + * xfeatures are enabled, the guest fpstate will be re- >> allocated to >> + * hold all guest enabled xfeatures, so omit user dynamic >> xfeatures >> + * here. >> + */ >> + size = fpu_guest_cfg.default_size + >> + ALIGN(offsetof(struct fpstate, regs), 64); > Minor, I'm not sure the extra char warrants changing it to a wrapped > line, but that's just my personal opinion. > >> + >> fpstate = vzalloc(size); >> if (!fpstate) >> - return false; >> + return NULL; >> + /* >> + * Initialize sizes and feature masks, use fpu_user_cfg.* >> + * for user_* settings for compatibility of exiting uAPIs. >> + */ >> + fpstate->size = fpu_guest_cfg.default_size; >> + fpstate->xfeatures = fpu_guest_cfg.default_features; >> + fpstate->user_size = fpu_user_cfg.default_size; >> + fpstate->user_xfeatures = fpu_user_cfg.default_features; >> + fpstate->xfd = 0; >> >> - /* Leave xfd to 0 (the reset value defined by spec) */ >> - __fpstate_reset(fpstate, 0); >> fpstate_init_user(fpstate); >> fpstate->is_valloc = true; >> fpstate->is_guest = true; >> >> gfpu->fpstate = fpstate; >> - gfpu->xfeatures = fpu_user_cfg.default_features; >> - gfpu->perm = fpu_user_cfg.default_features; >> + gfpu->xfeatures = fpu_guest_cfg.default_features; >> + gfpu->perm = fpu_guest_cfg.default_features; >> + >> + return fpstate; >> +} >> + >> +bool fpu_alloc_guest_fpstate(struct fpu_guest *gfpu) >> +{ >> + struct fpstate *fpstate; >> + >> + fpstate = __fpu_alloc_init_guest_fpstate(gfpu); > The above two statements could be just one line and still even fit > under 80 chars. Indeed, the variable is redundant, I'll remove it, thanks! > > All the same, > > Reviewed-by: Rick Edgecombe <rick.p.edgecombe@intel.com> > >> + >> + if (!fpstate) >> + return false; >>
diff --git a/arch/x86/kernel/fpu/core.c b/arch/x86/kernel/fpu/core.c index 516af626bf6a..6048352e1cc7 100644 --- a/arch/x86/kernel/fpu/core.c +++ b/arch/x86/kernel/fpu/core.c @@ -194,8 +194,6 @@ void fpu_reset_from_exception_fixup(void) } #if IS_ENABLED(CONFIG_KVM) -static void __fpstate_reset(struct fpstate *fpstate, u64 xfd); - static void fpu_init_guest_permissions(struct fpu_guest *gfpu) { struct fpu_state_perm *fpuperm; @@ -216,25 +214,53 @@ static void fpu_init_guest_permissions(struct fpu_guest *gfpu) gfpu->perm = perm & ~FPU_GUEST_PERM_LOCKED; } -bool fpu_alloc_guest_fpstate(struct fpu_guest *gfpu) +static struct fpstate *__fpu_alloc_init_guest_fpstate(struct fpu_guest *gfpu) { struct fpstate *fpstate; unsigned int size; - size = fpu_user_cfg.default_size + ALIGN(offsetof(struct fpstate, regs), 64); + /* + * fpu_guest_cfg.default_size is initialized to hold all enabled + * xfeatures except the user dynamic xfeatures. If the user dynamic + * xfeatures are enabled, the guest fpstate will be re-allocated to + * hold all guest enabled xfeatures, so omit user dynamic xfeatures + * here. + */ + size = fpu_guest_cfg.default_size + + ALIGN(offsetof(struct fpstate, regs), 64); + fpstate = vzalloc(size); if (!fpstate) - return false; + return NULL; + /* + * Initialize sizes and feature masks, use fpu_user_cfg.* + * for user_* settings for compatibility of exiting uAPIs. + */ + fpstate->size = fpu_guest_cfg.default_size; + fpstate->xfeatures = fpu_guest_cfg.default_features; + fpstate->user_size = fpu_user_cfg.default_size; + fpstate->user_xfeatures = fpu_user_cfg.default_features; + fpstate->xfd = 0; - /* Leave xfd to 0 (the reset value defined by spec) */ - __fpstate_reset(fpstate, 0); fpstate_init_user(fpstate); fpstate->is_valloc = true; fpstate->is_guest = true; gfpu->fpstate = fpstate; - gfpu->xfeatures = fpu_user_cfg.default_features; - gfpu->perm = fpu_user_cfg.default_features; + gfpu->xfeatures = fpu_guest_cfg.default_features; + gfpu->perm = fpu_guest_cfg.default_features; + + return fpstate; +} + +bool fpu_alloc_guest_fpstate(struct fpu_guest *gfpu) +{ + struct fpstate *fpstate; + + fpstate = __fpu_alloc_init_guest_fpstate(gfpu); + + if (!fpstate) + return false; /* * KVM sets the FP+SSE bits in the XSAVE header when copying FPU state