Sebastian Andrzej Siewior writes: > Most users of __raw_xsave_addr() use a feature number, shift it to a > mask and then __raw_xsave_addr() shifts it back to the feature number. > > Make __raw_xsave_addr() use the feature number as argument. > > Signed-off-by: Sebastian Andrzej Siewior <bigeasy@xxxxxxxxxxxxx> > --- > arch/x86/kernel/fpu/xstate.c | 16 ++++++++-------- > 1 file changed, 8 insertions(+), 8 deletions(-) > > diff --git a/arch/x86/kernel/fpu/xstate.c b/arch/x86/kernel/fpu/xstate.c > index 87a57b7642d36..38d0b5ea40425 100644 > --- a/arch/x86/kernel/fpu/xstate.c > +++ b/arch/x86/kernel/fpu/xstate.c > @@ -811,10 +811,8 @@ void fpu__resume_cpu(void) > * > * Note: does not work for compacted buffers. > */ > -void *__raw_xsave_addr(struct xregs_state *xsave, int xstate_feature_mask) > +void *__raw_xsave_addr(struct xregs_state *xsave, int feature_nr) It might be clearer to offer both interfaces, since both are used? > { > - int feature_nr = fls64(xstate_feature_mask) - 1; > - > if (!xfeature_enabled(feature_nr)) { > WARN_ON_FPU(1); > return NULL; > @@ -842,6 +840,7 @@ void *__raw_xsave_addr(struct xregs_state *xsave, int xstate_feature_mask) > */ > void *get_xsave_addr(struct xregs_state *xsave, int xstate_feature) > { > + int feature_nr; > /* > * Do we even *have* xsave state? > */ > @@ -869,7 +868,8 @@ void *get_xsave_addr(struct xregs_state *xsave, int xstate_feature) > if (!(xsave->header.xfeatures & xstate_feature)) > return NULL; > > - return __raw_xsave_addr(xsave, xstate_feature); > + feature_nr = fls64(xstate_feature) - 1; > + return __raw_xsave_addr(xsave, feature_nr); and then move that to a wrapper function that takes a mask? > } > EXPORT_SYMBOL_GPL(get_xsave_addr); > > @@ -1018,7 +1018,7 @@ int copy_xstate_to_kernel(void *kbuf, struct xregs_state *xsave, unsigned int of > * Copy only in-use xstates: > */ > if ((header.xfeatures >> i) & 1) { > - void *src = __raw_xsave_addr(xsave, 1 << i); > + void *src = __raw_xsave_addr(xsave, i); > > offset = xstate_offsets[i]; > size = xstate_sizes[i]; > @@ -1104,7 +1104,7 @@ int copy_xstate_to_user(void __user *ubuf, struct xregs_state *xsave, unsigned i > * Copy only in-use xstates: > */ > if ((header.xfeatures >> i) & 1) { > - void *src = __raw_xsave_addr(xsave, 1 << i); > + void *src = __raw_xsave_addr(xsave, i); > > offset = xstate_offsets[i]; > size = xstate_sizes[i]; > @@ -1161,7 +1161,7 @@ int copy_kernel_to_xstate(struct xregs_state *xsave, const void *kbuf) > u64 mask = ((u64)1 << i); > > if (hdr.xfeatures & mask) { > - void *dst = __raw_xsave_addr(xsave, 1 << i); > + void *dst = __raw_xsave_addr(xsave, i); > > offset = xstate_offsets[i]; > size = xstate_sizes[i]; > @@ -1215,7 +1215,7 @@ int copy_user_to_xstate(struct xregs_state *xsave, const void __user *ubuf) > u64 mask = ((u64)1 << i); > > if (hdr.xfeatures & mask) { > - void *dst = __raw_xsave_addr(xsave, 1 << i); > + void *dst = __raw_xsave_addr(xsave, i); > > offset = xstate_offsets[i]; > size = xstate_sizes[i]; -- Cheers, Christophe de Dinechin (IRC c3d)