From: Suresh Siddha <suresh.b.siddha@intel.com>
To: Wolfgang Walter <wolfgang.walter@stwm.de>
Cc: "Siddha, Suresh B" <suresh.b.siddha@intel.com>,
Herbert Xu <herbert@gondor.apana.org.au>,
"netdev@vger.kernel.org" <netdev@vger.kernel.org>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
Ingo Molnar <mingo@elte.hu>,
viro@ZenIV.linux.org.uk, hpa@zytor.com, vegard.nossum@gmail.com
Subject: Re: Kernel oops with 2.6.26, padlock and ipsec: probably problem with fpu state changes
Date: Fri, 8 Aug 2008 11:53:57 -0700 [thread overview]
Message-ID: <20080808185356.GC607@linux-os.sc.intel.com> (raw)
In-Reply-To: <200808081236.55172.wolfgang.walter@stwm.de>
On Fri, Aug 08, 2008 at 03:36:54AM -0700, Wolfgang Walter wrote:
> Am Donnerstag, 7. August 2008 18:23 schrieb Wolfgang Walter:
> > But yesterday I tried the following patch on top of a vanilla 2.6.26:
> >
> > =======================================================
> > diff -ur ../linux-2.6.26/drivers/crypto/padlock-aes.c
> > ./drivers/crypto/padlock-aes.c ---
> > ../linux-2.6.26/drivers/crypto/padlock-aes.c 2008-07-15 11:29:32.000000000
> > +0200 +++ ./drivers/crypto/padlock-aes.c 2008-08-07 17:46:55.000000000
> > +0200 @@ -16,6 +16,7 @@
> > #include <linux/interrupt.h>
> > #include <linux/kernel.h>
> > #include <asm/byteorder.h>
> > +#include <asm/i387.h>
> > #include "padlock.h"
> >
> > /* Control word. */
> > @@ -144,9 +145,11 @@
> > static inline void padlock_xcrypt(const u8 *input, u8 *output, void *key,
> > void *control_word)
> > {
> > + kernel_fpu_begin();
> > asm volatile (".byte 0xf3,0x0f,0xa7,0xc8" /* rep xcryptecb */
> >
> > : "+S"(input), "+D"(output)
> > : "d"(control_word), "b"(key), "c"(1));
> >
> > + kernel_fpu_end();
> > }
> >
> > static void aes_crypt_copy(const u8 *in, u8 *out, u32 *key, struct cword
> > *cword) @@ -179,6 +182,7 @@
> > return;
> > }
> >
> > + kernel_fpu_begin();
> > asm volatile ("test $1, %%cl;"
> > "je 1f;"
> > "lea -1(%%ecx), %%eax;"
> > @@ -190,15 +194,18 @@
> >
> > : "+S"(input), "+D"(output)
> > : "d"(control_word), "b"(key), "c"(count)
> > : "ax");
> >
> > + kernel_fpu_end();
> > }
> >
> > static inline u8 *padlock_xcrypt_cbc(const u8 *input, u8 *output, void
> > *key, u8 *iv, void *control_word, u32 count)
> > {
> > /* rep xcryptcbc */
> > + kernel_fpu_begin();
> > asm volatile (".byte 0xf3,0x0f,0xa7,0xd0"
> >
> > : "+S" (input), "+D" (output), "+a" (iv)
> > : "d" (control_word), "b" (key), "c" (count));
> >
> > + kernel_fpu_end();
> > return iv;
> > }
> >
> > =============================================================
> >
> > I found that kernel_fpu_begin(); kernel_fpu_begin(); is used with
> > MMX and/or SSE:
> >
> > include/asm/xor_32.h
> > drivers/md/raid6mmx.c
> > drivers/md/raid6sse1.c
> > drivers/md/raid6sse2.c
> >
> >
> > With this change I its a little bit more stable, I needed more then 5
> > minutes to crash the kernel (repeated it several times). If I read
> > the code correctly this disables preemption for the time the padlock cmd
> > is executing.
>
> Forget that - I booted the wrong kernel.
>
> I now really test this modification and it seems to be stable. The router now
> runs for 45 minutes without oops.
Ok. Thanks. I think I can explain the failure:
These padlock instructions though don't use/touch SSE registers, but it behaves
similar to other SSE instructions. For example, it might cause DNA faults
when cr0.ts is set. While this is a spurious DNA trap, it might cause
problems with the recent fpu code changes.
This is the code sequence that is probably causing this problem:
a) new app is getting exec'd and it is somewhere in between
start_thread() and flush_old_exec() in the load_xyz_binary()
b) At pont "a", task's fpu state (like TS_USEDFPU, used_math() etc) is
cleared.
c) Now we get an interrupt/softirq which starts using these encrypt/decrypt
routines in the network stack. This generates a math fault (as
cr0.ts is '1') which sets TS_USEDFPU and restores the math that is
in the task's xstate.
d) Return to exec code path, which does start_thread() which does
free_thread_xstate() and sets xstate pointer to NULL while
the TS_USEDFPU is still set.
e) At the next context switch from the new exec'd task to another task,
we have a scenarios where TS_USEDFPU is set but xstate pointer is null.
This can cause an oops during unlazy_fpu() in __switch_to()
Now:
1) This should happen with or with out pre-emption. Viro also encountered
similar problem with out CONFIG_PREEMPT.
2) kernel_fpu_begin() and kernel_fpu_end() will fix this problem, because
kernel_fpu_begin() will manually do a clts() and won't run in to the
situation of setting TS_USEDFPU in step "c" above.
3) This was working before the fpu changes, because its a spurious
math fault which doesn't corrupt any fpu/sse registers and the task's
math state was always in an allocated state.
I propose to go with wolf's patch which add's kernel_fpu_begin() and
kernel_fpu_end() around these instructions. This is the correct fix
(unless there is something wrong in my above understanding).
thanks,
suresh
next prev parent reply other threads:[~2008-08-08 18:53 UTC|newest]
Thread overview: 70+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-07-17 14:53 Kernel oops with 2.6.26 and ipsec (Was: Re: IPSEC in 2.6.25 causes stalled connections) Wolfgang Walter
2008-07-17 20:42 ` Kernel oops with 2.6.26 and ipsec Wolfgang Walter
[not found] ` <200807301411.01622.wolfgang.walter@stwm.de>
[not found] ` <20080806103354.GA31623@gondor.apana.org.au>
2008-08-06 17:33 ` Kernel oops with 2.6.26, padlock and ipsec: probably problem with fpu state changes Wolfgang Walter
2008-08-06 20:14 ` Suresh Siddha
2008-08-06 21:21 ` Suresh Siddha
2008-08-07 0:38 ` Wolfgang Walter
2008-08-08 8:44 ` Wolfgang Walter
2008-08-08 18:31 ` Vegard Nossum
2008-08-07 16:23 ` Wolfgang Walter
2008-08-08 10:36 ` Wolfgang Walter
2008-08-08 18:53 ` Suresh Siddha [this message]
2008-08-08 19:01 ` H. Peter Anvin
2008-08-08 19:19 ` Wolfgang Walter
2008-08-08 23:11 ` Suresh Siddha
2008-08-09 0:38 ` Herbert Xu
2008-08-09 1:23 ` Herbert Xu
2008-08-09 1:54 ` Wolfgang Walter
2008-08-09 2:16 ` Herbert Xu
2008-08-09 3:09 ` Wolfgang Walter
2008-08-09 3:20 ` Herbert Xu
2008-08-09 14:29 ` Herbert Xu
2008-08-09 14:32 ` Herbert Xu
2008-08-09 17:52 ` Suresh Siddha
2008-08-10 5:30 ` Herbert Xu
2008-08-10 5:41 ` H. Peter Anvin
2008-08-11 22:57 ` Suresh Siddha
2008-08-09 17:48 ` Suresh Siddha
2008-08-09 1:28 ` Wolfgang Walter
2008-08-09 13:31 ` Herbert Xu
2008-08-09 14:37 ` Herbert Xu
2008-08-09 15:14 ` Wolfgang Walter
2008-08-09 15:57 ` Wolfgang Walter
2008-08-09 16:10 ` H. Peter Anvin
2008-08-09 17:02 ` Wolfgang Walter
2008-08-09 18:52 ` Suresh Siddha
2008-08-09 19:37 ` Suresh Siddha
2008-08-09 22:59 ` Wolfgang Walter
2008-08-10 3:05 ` Herbert Xu
2008-08-11 19:01 ` Suresh Siddha
2008-08-11 19:22 ` Ingo Molnar
2008-08-11 19:24 ` H. Peter Anvin
2008-08-11 20:19 ` Suresh Siddha
2008-08-12 0:39 ` Herbert Xu
2008-08-12 0:42 ` H. Peter Anvin
2008-08-12 0:46 ` Herbert Xu
2008-08-12 0:48 ` H. Peter Anvin
2008-08-12 0:52 ` Herbert Xu
2008-08-12 0:38 ` Wolfgang Walter
2008-08-12 11:43 ` Wolfgang Walter
2008-08-12 12:02 ` Herbert Xu
2008-08-12 18:28 ` Suresh Siddha
2008-08-12 23:40 ` Herbert Xu
2008-08-09 18:12 ` Suresh Siddha
2008-08-09 18:54 ` Suresh Siddha
2008-08-09 16:05 ` H. Peter Anvin
2008-08-09 18:14 ` Suresh Siddha
2008-08-10 0:29 ` Herbert Xu
2008-08-10 1:56 ` Wolfgang Walter
2008-08-10 1:59 ` Herbert Xu
2008-08-09 17:59 ` Suresh Siddha
2008-08-10 1:40 ` Herbert Xu
2008-08-09 1:49 ` Herbert Xu
2008-08-09 1:59 ` H. Peter Anvin
2008-08-09 2:43 ` Wolfgang Walter
2008-08-09 3:30 ` H. Peter Anvin
2008-08-09 10:50 ` Wolfgang Walter
2008-08-08 19:09 ` Wolfgang Walter
2008-08-08 19:32 ` Suresh Siddha
2008-08-08 23:10 ` Wolfgang Walter
2008-08-08 23:15 ` 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=20080808185356.GC607@linux-os.sc.intel.com \
--to=suresh.b.siddha@intel.com \
--cc=herbert@gondor.apana.org.au \
--cc=hpa@zytor.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=netdev@vger.kernel.org \
--cc=vegard.nossum@gmail.com \
--cc=viro@ZenIV.linux.org.uk \
--cc=wolfgang.walter@stwm.de \
/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;
as well as URLs for NNTP newsgroup(s).