From mboxrd@z Thu Jan 1 00:00:00 1970 From: Christophe de Dinechin Subject: Re: [PATCH 03/11] x86/fpu: make __raw_xsave_addr() use feature number instead of mask Date: Thu, 11 Oct 2018 19:30:07 +0200 Message-ID: References: <20181004140547.13014-1-bigeasy@linutronix.de> <20181004140547.13014-4-bigeasy@linutronix.de> Mime-Version: 1.0 Content-Type: text/plain Cc: linux-kernel@vger.kernel.org, x86@kernel.org, Andy Lutomirski , Paolo Bonzini , Radim =?utf-8?B?S3LEjW3DocWZ?= , kvm@vger.kernel.org, "Jason A. Donenfeld" , Rik van Riel , Dave Hansen To: Sebastian Andrzej Siewior Return-path: In-reply-to: <20181004140547.13014-4-bigeasy@linutronix.de> Sender: linux-kernel-owner@vger.kernel.org List-Id: kvm.vger.kernel.org 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 > --- > 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)