From: Rik van Riel <riel@redhat.com>
To: Oleg Nesterov <oleg@redhat.com>
Cc: "H. Peter Anvin" <hpa@zytor.com>,
Suresh Siddha <suresh.b.siddha@intel.com>,
Andy Lutomirski <luto@amacapital.net>,
Thomas Gleixner <tglx@linutronix.de>,
Ingo Molnar <mingo@redhat.com>, Fenghua Yu <fenghua.yu@intel.com>,
the arch/x86 maintainers <x86@kernel.org>,
linux-kernel <linux-kernel@vger.kernel.org>
Subject: Re: question about save_xstate_sig() - WHY DOES THIS WORK?
Date: Thu, 29 Jan 2015 15:52:43 -0500 [thread overview]
Message-ID: <54CA9D9B.3090600@redhat.com> (raw)
In-Reply-To: <20150129204534.GA30530@redhat.com>
On 01/29/2015 03:45 PM, Oleg Nesterov wrote:
> On 01/27, Rik van Riel wrote:
>>
>> On 01/27/2015 02:40 PM, Oleg Nesterov wrote:
>>>>>
>>>>> - Is unlazy_fpu()->__save_init_fpu() safe wrt
>>>>> __kernel_fpu_begin() from irq?
>>
>> It looks like it should be safe, as long as __save_init_fpu()
>> knows that the task no longer has the FPU after __kernel_fpu_end(),
>> so it does not try to save the kernel FPU state to the user's
>> task->thread.fpu.state->xstate
>
> Not sure this is enough, but...
>
>> The caveat here is that __kernel_fpu_begin()/__kernel_fpu_end()
>> needs to be kept from running during unlazy_fpu().
>
> Yes,
>
>> This means interrupted_kernel_fpu_idle and/or irq_fpu_usable
>> need to check whether preemption is disabled, and lock out
>> __kernel_fpu_begin() when preemption is disabled.
>
> But we already have kernel_fpu_disable/enable. unlazy_cpu() can use
> it to avoid the race ?
I suspect this will be fine, if __kernel_fpu_end()
from IRQ context always restores the FPU context,
or calls stts, so things like save_init_fpu() will
either continue where they left off, or trap and
then continue where they left off.
__kernel_fpu_end() from process context can be
lazier, something I can work on in my next version
of the "defer FPU loading to kernel -> user space
boundary" patch series.
>> I can certainly merge unlazy_fpu() and save_init_fpu() into the
>> same function, but I am not sure whether or not it should call
>> __thread_fpu_end() - it looks like that would be desirable in some
>> cases, but not in others...
>
> I _think_ that we never actually want __thread_fpu_end(), although it
> doesn't really hurt if !eager. Probably ulazy/save should do
>
> if (!__save_init_fpu())
> __thread_fpu_end();
There is at least one case where we want __thread_fpu_end(),
and that is xstateregs_set. I got this by moving the
__thread_fpu_end() call from save_init_fpu() into init_fpu().
I am not sure about __math_error. I suspect we may need
__thread_fpu_end() in there so the math state can be
re-initialized if the task catches SIGFPE and continues.
On the other hand, I do not see code in there that
actually does that at the moment...
Let me send my RFC patch to clean up & merge
unlazy_fpu and save_init_fpu() in the next email.
next prev parent reply other threads:[~2015-01-29 20:52 UTC|newest]
Thread overview: 61+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-01-23 19:34 question about save_xstate_sig() - WHY DOES THIS WORK? Rik van Riel
2015-01-23 20:51 ` [PATCH, RFC] x86,fpu: make signal handling xstate save & restore preemption safe Rik van Riel
2015-01-23 21:07 ` question about save_xstate_sig() - WHY DOES THIS WORK? H. Peter Anvin
2015-01-24 13:39 ` Rik van Riel
2015-01-24 20:20 ` Oleg Nesterov
2015-01-26 23:27 ` Rik van Riel
2015-01-27 19:40 ` Oleg Nesterov
2015-01-27 20:27 ` Rik van Riel
2015-01-27 20:50 ` Rik van Riel
2015-01-29 21:01 ` Oleg Nesterov
2015-01-29 20:45 ` Oleg Nesterov
2015-01-29 20:52 ` Rik van Riel [this message]
2015-01-29 21:00 ` [PATCH RFC] x86,fpu: merge save_init_fpu & unlazy_fpu Rik van Riel
2015-01-29 21:21 ` Oleg Nesterov
2015-01-29 21:07 ` [PATCH 0/3]: x86, fpu: unlazy_fpu fixes/cleanups Oleg Nesterov
2015-01-29 21:07 ` [PATCH 1/3] x86, fpu: unlazy_fpu: don't reset thread.fpu_counter Oleg Nesterov
2015-01-29 21:26 ` Rik van Riel
2015-01-29 21:08 ` [PATCH 2/3] x86, fpu: unlazy_fpu: don't do __thread_fpu_end() if use_eager_fpu() Oleg Nesterov
2015-01-29 21:36 ` Rik van Riel
2015-01-29 21:49 ` Oleg Nesterov
2015-01-29 21:53 ` Rik van Riel
2015-01-29 21:54 ` Rik van Riel
2015-01-29 21:08 ` [PATCH 3/3] x86, fpu: kill save_init_fpu(), change math_error() to use unlazy_fpu() Oleg Nesterov
2015-01-29 21:54 ` Rik van Riel
2015-01-29 21:17 ` [PATCH 0/3]: x86, fpu: unlazy_fpu fixes/cleanups Dave Hansen
2015-01-29 21:33 ` Oleg Nesterov
2015-01-29 21:43 ` Dave Hansen
2015-01-29 21:56 ` Oleg Nesterov
2015-01-29 21:58 ` Rik van Riel
2015-01-29 23:26 ` Dave Hansen
2015-01-30 1:33 ` Rik van Riel
2015-02-02 18:11 ` Dave Hansen
2015-01-30 12:45 ` Oleg Nesterov
2015-01-30 13:30 ` Oleg Nesterov
2015-01-30 13:43 ` Oleg Nesterov
2015-01-30 17:49 ` [PATCH 0/3] cleanups to the disable lazy fpu restore code riel
2015-01-30 17:49 ` [PATCH 1/3] x86,fpu: move lazy restore functions up a few lines riel
2015-01-30 17:49 ` [PATCH 2/3] x86,fpu: introduce task_disable_lazy_fpu_restore helper riel
2015-01-30 17:49 ` [PATCH 3/3] x86,fpu: use disable_task_lazy_fpu_restore helper riel
2015-01-30 21:46 ` Dave Hansen
2015-01-30 21:48 ` Rik van Riel
2015-02-02 17:56 ` Rik van Riel
2015-02-02 18:00 ` [PATCH 0/6] cleanups to lazy FPU restore code riel
2015-02-02 18:00 ` [PATCH 1/6] x86,fpu: move lazy restore functions up a few lines riel
2015-02-02 18:00 ` [PATCH 2/6] x86,fpu: introduce task_disable_lazy_fpu_restore helper riel
2015-02-02 18:00 ` [PATCH 3/6] x86,fpu: use an explicit if/else in switch_fpu_prepare riel
2015-02-02 18:00 ` [PATCH 4/6] x86,fpu: use disable_task_lazy_fpu_restore helper riel
2015-02-02 19:21 ` Oleg Nesterov
2015-02-02 19:43 ` Rik van Riel
2015-02-03 19:08 ` Oleg Nesterov
2015-02-03 22:01 ` Rik van Riel
2015-02-06 16:42 ` Rik van Riel
2015-02-02 18:00 ` [PATCH 5/6] x86,fpu: also check fpu_lazy_restore when use_eager_fpu riel
2015-02-02 18:55 ` Oleg Nesterov
2015-02-02 19:19 ` Rik van Riel
2015-02-02 18:00 ` [PATCH 6/6] x86,fpu: remove redundant increments of fpu_counter riel
2015-02-02 18:34 ` Oleg Nesterov
2015-02-02 18:40 ` Rik van Riel
2015-02-18 23:40 ` Ingo Molnar
2015-02-18 23:54 ` Borislav Petkov
2015-02-19 20:09 ` Oleg Nesterov
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=54CA9D9B.3090600@redhat.com \
--to=riel@redhat.com \
--cc=fenghua.yu@intel.com \
--cc=hpa@zytor.com \
--cc=linux-kernel@vger.kernel.org \
--cc=luto@amacapital.net \
--cc=mingo@redhat.com \
--cc=oleg@redhat.com \
--cc=suresh.b.siddha@intel.com \
--cc=tglx@linutronix.de \
--cc=x86@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.