On Thu, 2020-05-07 at 20:22 +0200, Thomas Gleixner wrote: > Yu-cheng Yu <yu-cheng.yu@xxxxxxxxx> writes: > > @@ -983,6 +983,7 @@ int copy_xstate_to_kernel(void *kbuf, struct xregs_state *xsave, unsigned int of > > { > > unsigned int offset, size; > > struct xstate_header header; > > + int last_off; > > int i; > > > > /* > > @@ -1006,7 +1007,17 @@ int copy_xstate_to_kernel(void *kbuf, struct xregs_state *xsave, unsigned int of > > > > __copy_xstate_to_kernel(kbuf, &header, offset, size, size_total); > > > > + last_off = 0; > > + > > for (i = 0; i < XFEATURE_MAX; i++) { > > + /* > > + * Clear uninitialized area before XSAVE header. > > + */ > > + if (i == FIRST_EXTENDED_XFEATURE) { > > + memset(kbuf + last_off, 0, XSAVE_HDR_OFFSET - last_off); > > + last_off = XSAVE_HDR_OFFSET + XSAVE_HDR_SIZE; > > + } > > + > > /* > > * Copy only in-use xstates: > > */ > > @@ -1020,11 +1031,16 @@ int copy_xstate_to_kernel(void *kbuf, struct xregs_state *xsave, unsigned int of > > if (offset + size > size_total) > > break; > > > > + memset(kbuf + last_off, 0, offset - last_off); > > + last_off = offset + size; > > + > > __copy_xstate_to_kernel(kbuf, src, offset, size, size_total); > > } > > > > } > > > > + memset(kbuf + last_off, 0, size_total - last_off); > > Why doing all this partial zeroing? There is absolutely no point. > > Either the caller clears the buffer or this function clears it right at > the beginning with: > > memset(kbuf, 0, min(size_total, XSAVE_MAX_SIZE)); I was concerned that the XSAVES buffer can be large, but this is not in a performance-critical path. Yes, clear it in the beginning is simpler. Yu-cheng