From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754445AbbERTiB (ORCPT ); Mon, 18 May 2015 15:38:01 -0400 Received: from www.linutronix.de ([62.245.132.108]:50743 "EHLO Galois.linutronix.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754089AbbERTiA (ORCPT ); Mon, 18 May 2015 15:38:00 -0400 Date: Mon, 18 May 2015 21:38:09 +0200 (CEST) From: Thomas Gleixner To: Dave Hansen cc: linux-kernel@vger.kernel.org, x86@kernel.org, dave.hansen@linux.intel.com, oleg@redhat.com, bp@alien8.de, riel@redhat.com, sbsiddha@gmail.com, luto@amacapital.net, mingo@redhat.com, hpa@zytor.com, fenghua.yu@intel.com Subject: Re: [PATCH 02/19] x86, fpu: wrap get_xsave_addr() to make it safer In-Reply-To: <20150508185949.7774761A@viggo.jf.intel.com> Message-ID: References: <20150508185948.4C19F4B0@viggo.jf.intel.com> <20150508185949.7774761A@viggo.jf.intel.com> User-Agent: Alpine 2.11 (DEB 23 2013-08-11) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Linutronix-Spam-Score: -1.0 X-Linutronix-Spam-Level: - X-Linutronix-Spam-Status: No , -1.0 points, 5.0 required, ALL_TRUSTED=-1,SHORTCIRCUIT=-0.0001 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, 8 May 2015, Dave Hansen wrote: > The MPX code appears to be saving off the FPU in an unsafe > way. It does not disable preemption or ensure that the > FPU state has been allocated. > > This patch introduces a new helper which will do both of > those things internally. This changelog does not really match the implementation. Unless I'm missing something I can't find anything preemption related. > + > +/* > + * This wraps up the common operations that need to occur when retrieving > + * data from xsave state. It first ensures that the current task was > + * using the FPU and retrieves the data in to a buffer. It then calculates > + * the offset of the requested field in the buffer. > + * > + * This function is safe to call whether the FPU is in use or not. > + * > + * Note that this only works on the current task. > + * > + * Inputs: > + * @xsave_field: state which is defined in xsave.h (e.g. XSTATE_FP, > + * XSTATE_SSE, etc...) > + * Output: > + * address of the state in the xsave area. or NULL in case of ..... > + */ > +void *get_xsave_field(int xsave_field) > +{ > + union thread_xstate *xstate; > + > + if (!tsk_used_math(current)) > + return NULL; > + /* > + * unlazy_fpu() is poorly named and will actually > + * save the xstate off in to the memory buffer. > + */ > + unlazy_fpu(current); > + xstate = current->thread.fpu.state; > + > + return get_xsave_addr(&xstate->xsave, xsave_field); > +} Thanks, tglx