From: Suresh Siddha <suresh.b.siddha@intel.com>
To: Oleg Nesterov <oleg@redhat.com>
Cc: torvalds@linux-foundation.org, hpa@zytor.com, mingo@elte.hu,
linux-kernel@vger.kernel.org, suresh@aristanetworks.com
Subject: Re: [PATCH 2/3] x86, xsave: remove thread_has_fpu() bug check in __sanitize_i387_state()
Date: Wed, 09 May 2012 14:18:37 -0700 [thread overview]
Message-ID: <1336598317.4634.34.camel@sbsiddha-desk.sc.intel.com> (raw)
In-Reply-To: <20120509203047.GA334@redhat.com>
On Wed, 2012-05-09 at 22:30 +0200, Oleg Nesterov wrote:
> On 05/08, Suresh Siddha wrote:
> >
> > BUG_ON() in __sanitize_i387_state() is checking that the fpu state
> > is not live any more. But for preempt kernels, task can be scheduled
> > out and in at any place and the preload_fpu logic during context switch
> > can make the fpu registers live again.
>
> And? Do you see any particular scenario when this BUG_ON() is wrong?
>
> Afaics, __sanitize_i387_state() should not be called if the task can
> be scheduled in with ->fpu_counter != 0.
It is not easy, that is why we haven't seen any issues for so long. I
can give an example with 64-bit kernel with preempt enabled.
Task-A which uses fpu frequently and as such you will find its
fpu_counter mostly non-zero. During its time slice, kernel used fpu by
doing kernel_fpu_begin/kernel_fpu_end(). After this, in the same
scheduling slice, task-A got a signal to handle. Then during the signal
setup path we got preempted when we are just before the
sanitize_i387_state() call in
arch/x86/kernel/xsave.c:save_i387_xstate(). And when we come back we
will have the fpu registers live that can hit the bug_on.
This doesn't happen with 32-bit kernel because they do clear_used_math()
before doing sanitize_i387_state() and any preempt shouldn't preload the
fpu state.
64-bit kernel didn't do this earlier because they do an optimization of
copying the live fpu registers on to the stack directly (see
xsave_user() in the same file) etc.
I am planning to remove this 64-bit specific signal handling
optimization and share the same signal handling code between 32bit/64bit
kernels (infact someone posted those patches before and I am planning to
dust them off soon and repost).
Also, in future because of some xstate that can't be handled in lazy
manner (for example AMD's LWP state), we will always pre-load during
context-switch. But that is a different story.
> > Similarly during core dump, thread dumping the core can schedule out
> > and in for page-allocations etc in non-preempt case.
>
> Again, can't understand. The core-dumping thread does init_fpu()
> before it calls sanitize_i387_state().
Here I actually meant other threads context-switching in and out, while
the main thread dumps the core. For example, other threads can
context-switch in and out (because of preempt or the explicit schedule()
in kernel/exit.c:exit_mm()) and the main thread dumping core can run
into this bug when it finds some other thread with its fpu registers
live on some other cpu.
thanks,
suresh
next prev parent reply other threads:[~2012-05-09 21:15 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-05-07 19:07 [PATCH 1/2] coredump: flush the fpu exit state for proper multi-threaded core dump Suresh Siddha
2012-05-07 19:07 ` [PATCH 2/2] x86, xsave: remove thread_has_fpu() bug check in __sanitize_i387_state() Suresh Siddha
2012-05-07 19:15 ` [PATCH 1/2] coredump: flush the fpu exit state for proper multi-threaded core dump Linus Torvalds
2012-05-07 20:09 ` Suresh Siddha
2012-05-08 23:18 ` Suresh Siddha
2012-05-08 23:18 ` [PATCH 1/3] " Suresh Siddha
2012-05-09 21:05 ` Oleg Nesterov
2012-05-09 21:32 ` Suresh Siddha
2012-05-10 16:55 ` Oleg Nesterov
2012-05-10 17:04 ` Linus Torvalds
2012-05-10 23:33 ` [PATCH v2 1/4] fork: move the real prepare_to_copy() users to arch_dup_task_struct() Suresh Siddha
2012-05-10 23:33 ` [PATCH v2 2/4] coredump: ensure the fpu state is flushed for proper multi-threaded core dump Suresh Siddha
2012-05-11 16:51 ` Oleg Nesterov
2012-05-11 19:05 ` Suresh Siddha
2012-05-13 16:11 ` Oleg Nesterov
2012-05-15 18:03 ` Suresh Siddha
2012-05-15 18:55 ` Oleg Nesterov
2012-05-17 0:17 ` [tip:x86/fpu] " tip-bot for Suresh Siddha
2012-05-10 23:33 ` [PATCH v2 3/4] x86, xsave: remove thread_has_fpu() bug check in __sanitize_i387_state() Suresh Siddha
2012-05-17 0:18 ` [tip:x86/fpu] " tip-bot for Suresh Siddha
2012-05-10 23:33 ` [PATCH v2 4/4] x86, fpu: drop the fpu state during thread exit Suresh Siddha
2012-05-17 0:19 ` [tip:x86/fpu] " tip-bot for Suresh Siddha
2012-05-11 0:17 ` [PATCH v2 1/4] fork: move the real prepare_to_copy() users to arch_dup_task_struct() Benjamin Herrenschmidt
2012-05-17 0:16 ` [tip:x86/fpu] " tip-bot for Suresh Siddha
2012-05-10 23:48 ` [PATCH 1/3] coredump: flush the fpu exit state for proper multi-threaded core dump Suresh Siddha
2012-05-08 23:18 ` [PATCH 2/3] x86, xsave: remove thread_has_fpu() bug check in __sanitize_i387_state() Suresh Siddha
2012-05-09 20:30 ` Oleg Nesterov
2012-05-09 21:18 ` Suresh Siddha [this message]
2012-05-10 16:36 ` Oleg Nesterov
2012-05-08 23:18 ` [PATCH 3/3] x86, fpu: clear the fpu state during thread exit Suresh Siddha
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=1336598317.4634.34.camel@sbsiddha-desk.sc.intel.com \
--to=suresh.b.siddha@intel.com \
--cc=hpa@zytor.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=oleg@redhat.com \
--cc=suresh@aristanetworks.com \
--cc=torvalds@linux-foundation.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome