From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932595AbbERTmV (ORCPT ); Mon, 18 May 2015 15:42:21 -0400 Received: from www.linutronix.de ([62.245.132.108]:50782 "EHLO Galois.linutronix.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932275AbbERTmS (ORCPT ); Mon, 18 May 2015 15:42:18 -0400 Date: Mon, 18 May 2015 21:42:27 +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: 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 Mon, 18 May 2015, Thomas Gleixner wrote: > 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. Gah. Hit send before finishing the mail. It's unlazy_fpu (which I agree is a horrible name) which does the right thing. > > + > > +/* > > + * 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 >