* Bug when modprobing tcrypt
@ 2009-06-29 13:17 Eric Sesterhenn
2009-06-29 14:07 ` Sebastian Andrzej Siewior
0 siblings, 1 reply; 13+ messages in thread
From: Eric Sesterhenn @ 2009-06-29 13:17 UTC (permalink / raw)
To: herbert; +Cc: linux-crypto, davem
Hi,
i can repeatedly trigger the following bug when modprobing tcrypt
to test the crypto algorithms with todays -git
[ 122.967099] BUG: sleeping function called from invalid context at
kernel/rwsem.c:21
[ 122.967398] in_atomic(): 1, irqs_disabled(): 0, pid: 4926, name:
modprobe
[ 122.967643] INFO: lockdep is turned off.
[ 122.967858] Pid: 4926, comm: modprobe Tainted: G M
2.6.31-rc1-22297-g5298976 #24
[ 122.968176] Call Trace:
[ 122.968411] [<c011dd93>] __might_sleep+0xf9/0x101
[ 122.968677] [<c0777aa0>] down_read+0x16/0x68
[ 122.968928] [<c048bf04>] crypto_alg_lookup+0x16/0x34
[ 122.969479] [<c048bf52>] crypto_larval_lookup+0x30/0xf9
[ 122.969722] [<c048c038>] crypto_alg_mod_lookup+0x1d/0x62
[ 122.969977] [<c048c13e>] crypto_alloc_base+0x1e/0x64
[ 122.970271] [<c04bf991>] reset_prng_context+0xab/0x13f
[ 122.970523] [<c04e5cfc>] ? __spin_lock_init+0x27/0x51
[ 122.970777] [<c04bfce1>] cprng_init+0x2a/0x42
[ 122.971012] [<c048bb4c>] __crypto_alloc_tfm+0xfa/0x128
[ 122.971304] [<c048c153>] crypto_alloc_base+0x33/0x64
[ 122.971556] [<c04933c9>] alg_test_cprng+0x30/0x1f4
[ 122.971809] [<c0493329>] alg_test+0x12f/0x19f
[ 122.972103] [<c0177f1f>] ? __alloc_pages_nodemask+0x14d/0x481
[ 122.972356] [<d09219e2>] do_test+0xf9d/0x163f [tcrypt]
[ 122.972613] [<d0920de6>] do_test+0x3a1/0x163f [tcrypt]
[ 122.972855] [<d0926035>] tcrypt_mod_init+0x35/0x7c [tcrypt]
[ 122.973488] [<c010113c>] _stext+0x54/0x12c
[ 122.974575] [<d0926000>] ? tcrypt_mod_init+0x0/0x7c [tcrypt]
[ 122.974836] [<c01398a3>] ? up_read+0x16/0x2b
[ 122.975126] [<c0139fc4>] ? __blocking_notifier_call_chain+0x40/0x4c
[ 122.975376] [<c014ee8d>] sys_init_module+0xa9/0x1bf
[ 122.975635] [<c010292b>] sysenter_do_call+0x12/0x32
(gdb) l *(crypto_alg_lookup+0x16)
0xc048bf04 is in crypto_alg_lookup (crypto/api.c:201).
196 struct crypto_alg *crypto_alg_lookup(const char *name, u32 type, u32
mask)
197 {
198 struct crypto_alg *alg;
199
200 down_read(&crypto_alg_sem);
201 alg = __crypto_alg_lookup(name, type, mask);
202 up_read(&crypto_alg_sem);
203
204 return alg;
205 }
Please let me know if you need further information or have patches to
test.
Regards, Eric
^ permalink raw reply [flat|nested] 13+ messages in thread* Re: Bug when modprobing tcrypt 2009-06-29 13:17 Bug when modprobing tcrypt Eric Sesterhenn @ 2009-06-29 14:07 ` Sebastian Andrzej Siewior 2009-06-29 15:20 ` Neil Horman 0 siblings, 1 reply; 13+ messages in thread From: Sebastian Andrzej Siewior @ 2009-06-29 14:07 UTC (permalink / raw) To: Neil Horman; +Cc: herbert, linux-crypto, davem, Eric Sesterhenn * Eric Sesterhenn | 2009-06-29 15:17:05 [+0200]: >[ 122.967099] BUG: sleeping function called from invalid context at >kernel/rwsem.c:21 >[ 122.967398] in_atomic(): 1, irqs_disabled(): 0, pid: 4926, name: >modprobe >[ 122.967643] INFO: lockdep is turned off. >[ 122.967858] Pid: 4926, comm: modprobe Tainted: G M >2.6.31-rc1-22297-g5298976 #24 >[ 122.968176] Call Trace: >[ 122.968411] [<c011dd93>] __might_sleep+0xf9/0x101 >[ 122.968677] [<c0777aa0>] down_read+0x16/0x68 >[ 122.968928] [<c048bf04>] crypto_alg_lookup+0x16/0x34 >[ 122.969479] [<c048bf52>] crypto_larval_lookup+0x30/0xf9 >[ 122.969722] [<c048c038>] crypto_alg_mod_lookup+0x1d/0x62 >[ 122.969977] [<c048c13e>] crypto_alloc_base+0x1e/0x64 >[ 122.970271] [<c04bf991>] reset_prng_context+0xab/0x13f >[ 122.970523] [<c04e5cfc>] ? __spin_lock_init+0x27/0x51 >[ 122.970777] [<c04bfce1>] cprng_init+0x2a/0x42 >[ 122.971012] [<c048bb4c>] __crypto_alloc_tfm+0xfa/0x128 >[ 122.971304] [<c048c153>] crypto_alloc_base+0x33/0x64 >[ 122.971556] [<c04933c9>] alg_test_cprng+0x30/0x1f4 >[ 122.971809] [<c0493329>] alg_test+0x12f/0x19f >[ 122.972103] [<c0177f1f>] ? __alloc_pages_nodemask+0x14d/0x481 >[ 122.972356] [<d09219e2>] do_test+0xf9d/0x163f [tcrypt] >[ 122.972613] [<d0920de6>] do_test+0x3a1/0x163f [tcrypt] >[ 122.972855] [<d0926035>] tcrypt_mod_init+0x35/0x7c [tcrypt] >[ 122.973488] [<c010113c>] _stext+0x54/0x12c >[ 122.974575] [<d0926000>] ? tcrypt_mod_init+0x0/0x7c [tcrypt] >[ 122.974836] [<c01398a3>] ? up_read+0x16/0x2b >[ 122.975126] [<c0139fc4>] ? __blocking_notifier_call_chain+0x40/0x4c >[ 122.975376] [<c014ee8d>] sys_init_module+0xa9/0x1bf >[ 122.975635] [<c010292b>] sysenter_do_call+0x12/0x32 reset_prng_context() grabs a spinlock. That prng_lock spinlock is taken with irqsave and sometimes without what does not look good on the first look. Neil: It is legal for crypto_alloc_cipher() because it might load another module. Are you fine with the replacement of the spinlock with a mutex? rngapi_reset() in crypto/rng.c does kmalloc() with GFP_KERNEL so it looks like it is okay to sleep there. Sebastian ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: Bug when modprobing tcrypt 2009-06-29 14:07 ` Sebastian Andrzej Siewior @ 2009-06-29 15:20 ` Neil Horman 2009-06-29 21:44 ` [PATCH 1/2] crypto/ansi prng: use just a BH lock Sebastian Andrzej Siewior 2009-06-29 21:45 ` [PATCH 2/2] crypto/ansi prng: alloc cipher just in in init() Sebastian Andrzej Siewior 0 siblings, 2 replies; 13+ messages in thread From: Neil Horman @ 2009-06-29 15:20 UTC (permalink / raw) To: Sebastian Andrzej Siewior; +Cc: herbert, linux-crypto, davem, Eric Sesterhenn On Mon, Jun 29, 2009 at 04:07:04PM +0200, Sebastian Andrzej Siewior wrote: > * Eric Sesterhenn | 2009-06-29 15:17:05 [+0200]: > > >[ 122.967099] BUG: sleeping function called from invalid context at > >kernel/rwsem.c:21 > >[ 122.967398] in_atomic(): 1, irqs_disabled(): 0, pid: 4926, name: > >modprobe > >[ 122.967643] INFO: lockdep is turned off. > >[ 122.967858] Pid: 4926, comm: modprobe Tainted: G M > >2.6.31-rc1-22297-g5298976 #24 > >[ 122.968176] Call Trace: > >[ 122.968411] [<c011dd93>] __might_sleep+0xf9/0x101 > >[ 122.968677] [<c0777aa0>] down_read+0x16/0x68 > >[ 122.968928] [<c048bf04>] crypto_alg_lookup+0x16/0x34 > >[ 122.969479] [<c048bf52>] crypto_larval_lookup+0x30/0xf9 > >[ 122.969722] [<c048c038>] crypto_alg_mod_lookup+0x1d/0x62 > >[ 122.969977] [<c048c13e>] crypto_alloc_base+0x1e/0x64 > >[ 122.970271] [<c04bf991>] reset_prng_context+0xab/0x13f > >[ 122.970523] [<c04e5cfc>] ? __spin_lock_init+0x27/0x51 > >[ 122.970777] [<c04bfce1>] cprng_init+0x2a/0x42 > >[ 122.971012] [<c048bb4c>] __crypto_alloc_tfm+0xfa/0x128 > >[ 122.971304] [<c048c153>] crypto_alloc_base+0x33/0x64 > >[ 122.971556] [<c04933c9>] alg_test_cprng+0x30/0x1f4 > >[ 122.971809] [<c0493329>] alg_test+0x12f/0x19f > >[ 122.972103] [<c0177f1f>] ? __alloc_pages_nodemask+0x14d/0x481 > >[ 122.972356] [<d09219e2>] do_test+0xf9d/0x163f [tcrypt] > >[ 122.972613] [<d0920de6>] do_test+0x3a1/0x163f [tcrypt] > >[ 122.972855] [<d0926035>] tcrypt_mod_init+0x35/0x7c [tcrypt] > >[ 122.973488] [<c010113c>] _stext+0x54/0x12c > >[ 122.974575] [<d0926000>] ? tcrypt_mod_init+0x0/0x7c [tcrypt] > >[ 122.974836] [<c01398a3>] ? up_read+0x16/0x2b > >[ 122.975126] [<c0139fc4>] ? __blocking_notifier_call_chain+0x40/0x4c > >[ 122.975376] [<c014ee8d>] sys_init_module+0xa9/0x1bf > >[ 122.975635] [<c010292b>] sysenter_do_call+0x12/0x32 > > reset_prng_context() grabs a spinlock. That prng_lock spinlock is taken > with irqsave and sometimes without what does not look good on the first > look. > > Neil: It is legal for crypto_alloc_cipher() because it might load > another module. Are you fine with the replacement of the spinlock with a > mutex? rngapi_reset() in crypto/rng.c does kmalloc() with GFP_KERNEL so > it looks like it is okay to sleep there. > I'm a bit concerned about making prng_lock a mutex, since that seems like it would prevent the use of the cprng in interrupt context. I agree that the mixed use of spin_lock and spin_lock_irqsave with prng_lock is prone to deadlock, but I think that means we should probably convert all uses of prng_lock to be irqsave/restore variants to prevent the single cpu deadlock case. As for the BUG above, I think we can work around that by reorganizing reset_prng_context a bit, as we really only need the lock around ctx modifications, and the PRNG_NEED_RESET flag guards against concurrent use while the lock isn't held. I'd be happy to write a patch if you like, or you can propose one. Just let me know. Alternatively, if you can think of a way that mutexes here would still allow for interrupt context use, I'd certainly be ok with that, I just don't see how to make that happen at the moment. Regards Neil > Sebastian > ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH 1/2] crypto/ansi prng: use just a BH lock 2009-06-29 15:20 ` Neil Horman @ 2009-06-29 21:44 ` Sebastian Andrzej Siewior 2009-06-30 14:14 ` Neil Horman 2009-06-29 21:45 ` [PATCH 2/2] crypto/ansi prng: alloc cipher just in in init() Sebastian Andrzej Siewior 1 sibling, 1 reply; 13+ messages in thread From: Sebastian Andrzej Siewior @ 2009-06-29 21:44 UTC (permalink / raw) To: Neil Horman Cc: Sebastian Andrzej Siewior, herbert, linux-crypto, davem, Eric Sesterhenn From: Sebastian Andrzej Siewior <sebastian@breakpoint.cc> the current code uses a mix of sping_lock() & spin_lock_irqsave(). This can lead to deadlock with the correct timming & cprng_get_random() + cprng_reset() sequence. I've converted them to bottom half locks since all three user grab just a BH lock so this runs probably in softirq :) Signed-off-by: Sebastian Andrzej Siewior <sebastian@breakpoint.cc> --- crypto/ansi_cprng.c | 9 ++++----- 1 files changed, 4 insertions(+), 5 deletions(-) diff --git a/crypto/ansi_cprng.c b/crypto/ansi_cprng.c index d80ed4c..ff00b58 100644 --- a/crypto/ansi_cprng.c +++ b/crypto/ansi_cprng.c @@ -187,7 +187,6 @@ static int _get_more_prng_bytes(struct prng_context *ctx) /* Our exported functions */ static int get_prng_bytes(char *buf, size_t nbytes, struct prng_context *ctx) { - unsigned long flags; unsigned char *ptr = buf; unsigned int byte_count = (unsigned int)nbytes; int err; @@ -196,7 +195,7 @@ static int get_prng_bytes(char *buf, size_t nbytes, struct prng_context *ctx) if (nbytes < 0) return -EINVAL; - spin_lock_irqsave(&ctx->prng_lock, flags); + spin_lock_bh(&ctx->prng_lock); err = -EINVAL; if (ctx->flags & PRNG_NEED_RESET) @@ -268,7 +267,7 @@ empty_rbuf: goto remainder; done: - spin_unlock_irqrestore(&ctx->prng_lock, flags); + spin_unlock_bh(&ctx->prng_lock); dbgprint(KERN_CRIT "returning %d from get_prng_bytes in context %p\n", err, ctx); return err; @@ -287,7 +286,7 @@ static int reset_prng_context(struct prng_context *ctx, int rc = -EINVAL; unsigned char *prng_key; - spin_lock(&ctx->prng_lock); + spin_lock_bh(&ctx->prng_lock); ctx->flags |= PRNG_NEED_RESET; prng_key = (key != NULL) ? key : (unsigned char *)DEFAULT_PRNG_KEY; @@ -332,7 +331,7 @@ static int reset_prng_context(struct prng_context *ctx, rc = 0; ctx->flags &= ~PRNG_NEED_RESET; out: - spin_unlock(&ctx->prng_lock); + spin_unlock_bh(&ctx->prng_lock); return rc; -- 1.6.3.3 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH 1/2] crypto/ansi prng: use just a BH lock 2009-06-29 21:44 ` [PATCH 1/2] crypto/ansi prng: use just a BH lock Sebastian Andrzej Siewior @ 2009-06-30 14:14 ` Neil Horman 0 siblings, 0 replies; 13+ messages in thread From: Neil Horman @ 2009-06-30 14:14 UTC (permalink / raw) To: Sebastian Andrzej Siewior; +Cc: herbert, linux-crypto, davem, Eric Sesterhenn On Mon, Jun 29, 2009 at 11:44:30PM +0200, Sebastian Andrzej Siewior wrote: > From: Sebastian Andrzej Siewior <sebastian@breakpoint.cc> > > the current code uses a mix of sping_lock() & spin_lock_irqsave(). This can > lead to deadlock with the correct timming & cprng_get_random() + cprng_reset() > sequence. > I've converted them to bottom half locks since all three user grab just a BH > lock so this runs probably in softirq :) > > Signed-off-by: Sebastian Andrzej Siewior <sebastian@breakpoint.cc> There are more than just 3 users of this rng. This is the rng that gets allocated in the event that someone calls crypto_alloc_rng("stdrng"), and several ciphers use that, and in turn various ipsec implementations use those ciphers. That said, I've built it and tested it, and don't currently see any users of this api from within interrupt context (i.e. no lockdep warnings). I think we may want to make this api accessible within interrupt context, but that can probably wait until we have a user in said context, to find the best way to do that. Herbert, can you apply this to your tree? Thanks! Acked-by: Neil Horman <nhorman@tuxdriver.com> > --- > crypto/ansi_cprng.c | 9 ++++----- > 1 files changed, 4 insertions(+), 5 deletions(-) > > diff --git a/crypto/ansi_cprng.c b/crypto/ansi_cprng.c > index d80ed4c..ff00b58 100644 > --- a/crypto/ansi_cprng.c > +++ b/crypto/ansi_cprng.c > @@ -187,7 +187,6 @@ static int _get_more_prng_bytes(struct prng_context *ctx) > /* Our exported functions */ > static int get_prng_bytes(char *buf, size_t nbytes, struct prng_context *ctx) > { > - unsigned long flags; > unsigned char *ptr = buf; > unsigned int byte_count = (unsigned int)nbytes; > int err; > @@ -196,7 +195,7 @@ static int get_prng_bytes(char *buf, size_t nbytes, struct prng_context *ctx) > if (nbytes < 0) > return -EINVAL; > > - spin_lock_irqsave(&ctx->prng_lock, flags); > + spin_lock_bh(&ctx->prng_lock); > > err = -EINVAL; > if (ctx->flags & PRNG_NEED_RESET) > @@ -268,7 +267,7 @@ empty_rbuf: > goto remainder; > > done: > - spin_unlock_irqrestore(&ctx->prng_lock, flags); > + spin_unlock_bh(&ctx->prng_lock); > dbgprint(KERN_CRIT "returning %d from get_prng_bytes in context %p\n", > err, ctx); > return err; > @@ -287,7 +286,7 @@ static int reset_prng_context(struct prng_context *ctx, > int rc = -EINVAL; > unsigned char *prng_key; > > - spin_lock(&ctx->prng_lock); > + spin_lock_bh(&ctx->prng_lock); > ctx->flags |= PRNG_NEED_RESET; > > prng_key = (key != NULL) ? key : (unsigned char *)DEFAULT_PRNG_KEY; > @@ -332,7 +331,7 @@ static int reset_prng_context(struct prng_context *ctx, > rc = 0; > ctx->flags &= ~PRNG_NEED_RESET; > out: > - spin_unlock(&ctx->prng_lock); > + spin_unlock_bh(&ctx->prng_lock); > > return rc; > > -- > 1.6.3.3 > > ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH 2/2] crypto/ansi prng: alloc cipher just in in init() 2009-06-29 15:20 ` Neil Horman 2009-06-29 21:44 ` [PATCH 1/2] crypto/ansi prng: use just a BH lock Sebastian Andrzej Siewior @ 2009-06-29 21:45 ` Sebastian Andrzej Siewior 2009-06-29 21:48 ` Sebastian Andrzej Siewior 2009-06-30 14:51 ` Neil Horman 1 sibling, 2 replies; 13+ messages in thread From: Sebastian Andrzej Siewior @ 2009-06-29 21:45 UTC (permalink / raw) To: Neil Horman Cc: Sebastian Andrzej Siewior, herbert, linux-crypto, davem, Eric Sesterhenn From: Sebastian Andrzej Siewior <sebastian@breakpoint.cc> As reported by Eric Sesterhenn the re-allocation of the cipher in reset leads to: |BUG: sleeping function called from invalid context at kernel/rwsem.c:21 |in_atomic(): 1, irqs_disabled(): 0, pid: 4926, name: modprobe |INFO: lockdep is turned off. |Pid: 4926, comm: modprobe Tainted: G M 2.6.31-rc1-22297-g5298976 #24 |Call Trace: | [<c011dd93>] __might_sleep+0xf9/0x101 | [<c0777aa0>] down_read+0x16/0x68 | [<c048bf04>] crypto_alg_lookup+0x16/0x34 | [<c048bf52>] crypto_larval_lookup+0x30/0xf9 | [<c048c038>] crypto_alg_mod_lookup+0x1d/0x62 | [<c048c13e>] crypto_alloc_base+0x1e/0x64 | [<c04bf991>] reset_prng_context+0xab/0x13f | [<c04e5cfc>] ? __spin_lock_init+0x27/0x51 | [<c04bfce1>] cprng_init+0x2a/0x42 | [<c048bb4c>] __crypto_alloc_tfm+0xfa/0x128 | [<c048c153>] crypto_alloc_base+0x33/0x64 | [<c04933c9>] alg_test_cprng+0x30/0x1f4 | [<c0493329>] alg_test+0x12f/0x19f | [<c0177f1f>] ? __alloc_pages_nodemask+0x14d/0x481 | [<d09219e2>] do_test+0xf9d/0x163f [tcrypt] | [<d0920de6>] do_test+0x3a1/0x163f [tcrypt] | [<d0926035>] tcrypt_mod_init+0x35/0x7c [tcrypt] | [<c010113c>] _stext+0x54/0x12c | [<d0926000>] ? tcrypt_mod_init+0x0/0x7c [tcrypt] | [<c01398a3>] ? up_read+0x16/0x2b | [<c0139fc4>] ? __blocking_notifier_call_chain+0x40/0x4c | [<c014ee8d>] sys_init_module+0xa9/0x1bf | [<c010292b>] sysenter_do_call+0x12/0x32 because a spin lock is held and crypto_alloc_base() may sleep. There is no reason to re-allocate the cipher, the state is resetted in ->setkey(). This move it to init. Signed-off-by: Sebastian Andrzej Siewior <sebastian@breakpoint.cc> --- crypto/ansi_cprng.c | 18 +++++++----------- 1 files changed, 7 insertions(+), 11 deletions(-) diff --git a/crypto/ansi_cprng.c b/crypto/ansi_cprng.c index ff00b58..259d2de 100644 --- a/crypto/ansi_cprng.c +++ b/crypto/ansi_cprng.c @@ -307,17 +307,6 @@ static int reset_prng_context(struct prng_context *ctx, memset(ctx->rand_data, 0, DEFAULT_BLK_SZ); memset(ctx->last_rand_data, 0, DEFAULT_BLK_SZ); - if (ctx->tfm) - crypto_free_cipher(ctx->tfm); - - ctx->tfm = crypto_alloc_cipher("aes", 0, 0); - if (IS_ERR(ctx->tfm)) { - dbgprint(KERN_CRIT "Failed to alloc tfm for context %p\n", - ctx); - ctx->tfm = NULL; - goto out; - } ^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH 2/2] crypto/ansi prng: alloc cipher just in in init() 2009-06-29 21:45 ` [PATCH 2/2] crypto/ansi prng: alloc cipher just in in init() Sebastian Andrzej Siewior @ 2009-06-29 21:48 ` Sebastian Andrzej Siewior 2009-06-29 21:54 ` Neil Horman 2009-06-30 14:51 ` Neil Horman 1 sibling, 1 reply; 13+ messages in thread From: Sebastian Andrzej Siewior @ 2009-06-29 21:48 UTC (permalink / raw) To: Neil Horman; +Cc: herbert, linux-crypto, davem, Eric Sesterhenn * Sebastian Andrzej Siewior | 2009-06-29 23:45:08 [+0200]: >From: Sebastian Andrzej Siewior <sebastian@breakpoint.cc> > >As reported by Eric Sesterhenn the re-allocation of the cipher in reset leads Neil, the patches are untested. Could you please verify them? Sebastian ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 2/2] crypto/ansi prng: alloc cipher just in in init() 2009-06-29 21:48 ` Sebastian Andrzej Siewior @ 2009-06-29 21:54 ` Neil Horman 0 siblings, 0 replies; 13+ messages in thread From: Neil Horman @ 2009-06-29 21:54 UTC (permalink / raw) To: Sebastian Andrzej Siewior; +Cc: herbert, linux-crypto, davem, Eric Sesterhenn On Mon, Jun 29, 2009 at 11:48:21PM +0200, Sebastian Andrzej Siewior wrote: > * Sebastian Andrzej Siewior | 2009-06-29 23:45:08 [+0200]: > > >From: Sebastian Andrzej Siewior <sebastian@breakpoint.cc> > > > >As reported by Eric Sesterhenn the re-allocation of the cipher in reset leads > > Neil, the patches are untested. Could you please verify them? > > Sebastian > Yeah, you'll have to give me a day or two to get to it, but I'll test them Neil ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 2/2] crypto/ansi prng: alloc cipher just in in init() 2009-06-29 21:45 ` [PATCH 2/2] crypto/ansi prng: alloc cipher just in in init() Sebastian Andrzej Siewior 2009-06-29 21:48 ` Sebastian Andrzej Siewior @ 2009-06-30 14:51 ` Neil Horman 2009-06-30 19:55 ` [PATCH v2] " Sebastian Andrzej Siewior 1 sibling, 1 reply; 13+ messages in thread From: Neil Horman @ 2009-06-30 14:51 UTC (permalink / raw) To: Sebastian Andrzej Siewior; +Cc: herbert, linux-crypto, davem, Eric Sesterhenn On Mon, Jun 29, 2009 at 11:45:08PM +0200, Sebastian Andrzej Siewior wrote: > From: Sebastian Andrzej Siewior <sebastian@breakpoint.cc> > > As reported by Eric Sesterhenn the re-allocation of the cipher in reset leads > to: > |BUG: sleeping function called from invalid context at kernel/rwsem.c:21 > |in_atomic(): 1, irqs_disabled(): 0, pid: 4926, name: modprobe > |INFO: lockdep is turned off. > |Pid: 4926, comm: modprobe Tainted: G M 2.6.31-rc1-22297-g5298976 #24 > |Call Trace: > | [<c011dd93>] __might_sleep+0xf9/0x101 > | [<c0777aa0>] down_read+0x16/0x68 > | [<c048bf04>] crypto_alg_lookup+0x16/0x34 > | [<c048bf52>] crypto_larval_lookup+0x30/0xf9 > | [<c048c038>] crypto_alg_mod_lookup+0x1d/0x62 > | [<c048c13e>] crypto_alloc_base+0x1e/0x64 > | [<c04bf991>] reset_prng_context+0xab/0x13f > | [<c04e5cfc>] ? __spin_lock_init+0x27/0x51 > | [<c04bfce1>] cprng_init+0x2a/0x42 > | [<c048bb4c>] __crypto_alloc_tfm+0xfa/0x128 > | [<c048c153>] crypto_alloc_base+0x33/0x64 > | [<c04933c9>] alg_test_cprng+0x30/0x1f4 > | [<c0493329>] alg_test+0x12f/0x19f > | [<c0177f1f>] ? __alloc_pages_nodemask+0x14d/0x481 > | [<d09219e2>] do_test+0xf9d/0x163f [tcrypt] > | [<d0920de6>] do_test+0x3a1/0x163f [tcrypt] > | [<d0926035>] tcrypt_mod_init+0x35/0x7c [tcrypt] > | [<c010113c>] _stext+0x54/0x12c > | [<d0926000>] ? tcrypt_mod_init+0x0/0x7c [tcrypt] > | [<c01398a3>] ? up_read+0x16/0x2b > | [<c0139fc4>] ? __blocking_notifier_call_chain+0x40/0x4c > | [<c014ee8d>] sys_init_module+0xa9/0x1bf > | [<c010292b>] sysenter_do_call+0x12/0x32 > > because a spin lock is held and crypto_alloc_base() may sleep. > There is no reason to re-allocate the cipher, the state is resetted in > ->setkey(). This move it to init. > > Signed-off-by: Sebastian Andrzej Siewior <sebastian@breakpoint.cc> NAK. Functionally its, ok. But in the conversion, you set ctx->tfm to NULL, and then return PTR_ERR(ctx->tfm), which is going to return success erroneously (NULL == 0 == success).. Grab the value of tfm before setting it to null and return that instead, please Regards Neil > --- > crypto/ansi_cprng.c | 18 +++++++----------- > 1 files changed, 7 insertions(+), 11 deletions(-) > > diff --git a/crypto/ansi_cprng.c b/crypto/ansi_cprng.c > index ff00b58..259d2de 100644 > --- a/crypto/ansi_cprng.c > +++ b/crypto/ansi_cprng.c > @@ -307,17 +307,6 @@ static int reset_prng_context(struct prng_context *ctx, > memset(ctx->rand_data, 0, DEFAULT_BLK_SZ); > memset(ctx->last_rand_data, 0, DEFAULT_BLK_SZ); > > - if (ctx->tfm) > - crypto_free_cipher(ctx->tfm); > - > - ctx->tfm = crypto_alloc_cipher("aes", 0, 0); > - if (IS_ERR(ctx->tfm)) { > - dbgprint(KERN_CRIT "Failed to alloc tfm for context %p\n", > - ctx); > - ctx->tfm = NULL; > - goto out; > - } > - > ctx->rand_data_valid = DEFAULT_BLK_SZ; > > ret = crypto_cipher_setkey(ctx->tfm, prng_key, klen); > @@ -342,6 +331,13 @@ static int cprng_init(struct crypto_tfm *tfm) > struct prng_context *ctx = crypto_tfm_ctx(tfm); > > spin_lock_init(&ctx->prng_lock); > + ctx->tfm = crypto_alloc_cipher("aes", 0, 0); > + if (IS_ERR(ctx->tfm)) { > + dbgprint(KERN_CRIT "Failed to alloc tfm for context %p\n", > + ctx); > + ctx->tfm = NULL; > + return PTR_ERR(ctx->tfm); ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Use after assignment is bad here :) > + } > > if (reset_prng_context(ctx, NULL, DEFAULT_PRNG_KSZ, NULL, NULL) < 0) > return -EINVAL; > -- > 1.6.3.3 > > ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH v2] crypto/ansi prng: alloc cipher just in in init() 2009-06-30 14:51 ` Neil Horman @ 2009-06-30 19:55 ` Sebastian Andrzej Siewior 2009-07-01 0:06 ` Neil Horman 0 siblings, 1 reply; 13+ messages in thread From: Sebastian Andrzej Siewior @ 2009-06-30 19:55 UTC (permalink / raw) To: Neil Horman; +Cc: herbert, linux-crypto, davem, Eric Sesterhenn As reported by Eric Sesterhenn the re-allocation of the cipher in reset leads to: |BUG: sleeping function called from invalid context at kernel/rwsem.c:21 |in_atomic(): 1, irqs_disabled(): 0, pid: 4926, name: modprobe |INFO: lockdep is turned off. |Pid: 4926, comm: modprobe Tainted: G M 2.6.31-rc1-22297-g5298976 #24 |Call Trace: | [<c011dd93>] __might_sleep+0xf9/0x101 | [<c0777aa0>] down_read+0x16/0x68 | [<c048bf04>] crypto_alg_lookup+0x16/0x34 | [<c048bf52>] crypto_larval_lookup+0x30/0xf9 | [<c048c038>] crypto_alg_mod_lookup+0x1d/0x62 | [<c048c13e>] crypto_alloc_base+0x1e/0x64 | [<c04bf991>] reset_prng_context+0xab/0x13f | [<c04e5cfc>] ? __spin_lock_init+0x27/0x51 | [<c04bfce1>] cprng_init+0x2a/0x42 | [<c048bb4c>] __crypto_alloc_tfm+0xfa/0x128 | [<c048c153>] crypto_alloc_base+0x33/0x64 | [<c04933c9>] alg_test_cprng+0x30/0x1f4 | [<c0493329>] alg_test+0x12f/0x19f | [<c0177f1f>] ? __alloc_pages_nodemask+0x14d/0x481 | [<d09219e2>] do_test+0xf9d/0x163f [tcrypt] | [<d0920de6>] do_test+0x3a1/0x163f [tcrypt] | [<d0926035>] tcrypt_mod_init+0x35/0x7c [tcrypt] | [<c010113c>] _stext+0x54/0x12c | [<d0926000>] ? tcrypt_mod_init+0x0/0x7c [tcrypt] | [<c01398a3>] ? up_read+0x16/0x2b | [<c0139fc4>] ? __blocking_notifier_call_chain+0x40/0x4c | [<c014ee8d>] sys_init_module+0xa9/0x1bf | [<c010292b>] sysenter_do_call+0x12/0x32 because a spin lock is held and crypto_alloc_base() may sleep. There is no reason to re-allocate the cipher, the state is resetted in ->setkey(). This patches makes the cipher allocation a one time thing and moves it to init. Reported-by: Eric Sesterhenn <eric.sesterhenn@lsexperts.de> Signed-off-by: Sebastian Andrzej Siewior <sebastian@breakpoint.cc> --- v2: - remove crypto_free_cipher() from reset - don'r return 0 in error case in reset v1: initial shot Neil, what about that one? Setting tfm to NULL and grabbing the return code earler would make the patch a little longer. crypto/ansi_cprng.c | 25 ++++++++----------------- 1 files changed, 8 insertions(+), 17 deletions(-) diff --git a/crypto/ansi_cprng.c b/crypto/ansi_cprng.c index ff00b58..5357ba7 100644 --- a/crypto/ansi_cprng.c +++ b/crypto/ansi_cprng.c @@ -283,7 +283,6 @@ static int reset_prng_context(struct prng_context *ctx, unsigned char *V, unsigned char *DT) { int ret; - int rc = -EINVAL; unsigned char *prng_key; spin_lock_bh(&ctx->prng_lock); @@ -307,34 +306,20 @@ static int reset_prng_context(struct prng_context *ctx, memset(ctx->rand_data, 0, DEFAULT_BLK_SZ); memset(ctx->last_rand_data, 0, DEFAULT_BLK_SZ); - if (ctx->tfm) - crypto_free_cipher(ctx->tfm); - - ctx->tfm = crypto_alloc_cipher("aes", 0, 0); - if (IS_ERR(ctx->tfm)) { - dbgprint(KERN_CRIT "Failed to alloc tfm for context %p\n", - ctx); - ctx->tfm = NULL; - goto out; - } - ctx->rand_data_valid = DEFAULT_BLK_SZ; ret = crypto_cipher_setkey(ctx->tfm, prng_key, klen); if (ret) { dbgprint(KERN_CRIT "PRNG: setkey() failed flags=%x\n", crypto_cipher_get_flags(ctx->tfm)); - crypto_free_cipher(ctx->tfm); goto out; } - rc = 0; + ret = 0; ctx->flags &= ~PRNG_NEED_RESET; out: spin_unlock_bh(&ctx->prng_lock); - - return rc; ^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH v2] crypto/ansi prng: alloc cipher just in in init() 2009-06-30 19:55 ` [PATCH v2] " Sebastian Andrzej Siewior @ 2009-07-01 0:06 ` Neil Horman [not found] ` <20090701072517.GA9583@Chamillionaire.breakpoint.cc> 0 siblings, 1 reply; 13+ messages in thread From: Neil Horman @ 2009-07-01 0:06 UTC (permalink / raw) To: Sebastian Andrzej Siewior; +Cc: herbert, linux-crypto, davem, Eric Sesterhenn On Tue, Jun 30, 2009 at 09:55:18PM +0200, Sebastian Andrzej Siewior wrote: > As reported by Eric Sesterhenn the re-allocation of the cipher in reset leads > to: > |BUG: sleeping function called from invalid context at kernel/rwsem.c:21 > |in_atomic(): 1, irqs_disabled(): 0, pid: 4926, name: modprobe > |INFO: lockdep is turned off. > |Pid: 4926, comm: modprobe Tainted: G M 2.6.31-rc1-22297-g5298976 #24 > |Call Trace: > | [<c011dd93>] __might_sleep+0xf9/0x101 > | [<c0777aa0>] down_read+0x16/0x68 > | [<c048bf04>] crypto_alg_lookup+0x16/0x34 > | [<c048bf52>] crypto_larval_lookup+0x30/0xf9 > | [<c048c038>] crypto_alg_mod_lookup+0x1d/0x62 > | [<c048c13e>] crypto_alloc_base+0x1e/0x64 > | [<c04bf991>] reset_prng_context+0xab/0x13f > | [<c04e5cfc>] ? __spin_lock_init+0x27/0x51 > | [<c04bfce1>] cprng_init+0x2a/0x42 > | [<c048bb4c>] __crypto_alloc_tfm+0xfa/0x128 > | [<c048c153>] crypto_alloc_base+0x33/0x64 > | [<c04933c9>] alg_test_cprng+0x30/0x1f4 > | [<c0493329>] alg_test+0x12f/0x19f > | [<c0177f1f>] ? __alloc_pages_nodemask+0x14d/0x481 > | [<d09219e2>] do_test+0xf9d/0x163f [tcrypt] > | [<d0920de6>] do_test+0x3a1/0x163f [tcrypt] > | [<d0926035>] tcrypt_mod_init+0x35/0x7c [tcrypt] > | [<c010113c>] _stext+0x54/0x12c > | [<d0926000>] ? tcrypt_mod_init+0x0/0x7c [tcrypt] > | [<c01398a3>] ? up_read+0x16/0x2b > | [<c0139fc4>] ? __blocking_notifier_call_chain+0x40/0x4c > | [<c014ee8d>] sys_init_module+0xa9/0x1bf > | [<c010292b>] sysenter_do_call+0x12/0x32 > > because a spin lock is held and crypto_alloc_base() may sleep. > There is no reason to re-allocate the cipher, the state is resetted in > ->setkey(). This patches makes the cipher allocation a one time thing and > moves it to init. > > Reported-by: Eric Sesterhenn <eric.sesterhenn@lsexperts.de> > Signed-off-by: Sebastian Andrzej Siewior <sebastian@breakpoint.cc> I think this looks better, yeah, have you tested this? If not, give it a quick run please, and I'll ack it. Neil > ^ permalink raw reply [flat|nested] 13+ messages in thread
[parent not found: <20090701072517.GA9583@Chamillionaire.breakpoint.cc>]
* Re: [PATCH v2] crypto/ansi prng: alloc cipher just in in init() [not found] ` <20090701072517.GA9583@Chamillionaire.breakpoint.cc> @ 2009-07-01 10:36 ` Neil Horman 2009-07-03 4:11 ` Herbert Xu 0 siblings, 1 reply; 13+ messages in thread From: Neil Horman @ 2009-07-01 10:36 UTC (permalink / raw) To: Sebastian Andrzej Siewior; +Cc: herbert, linux-crypto, davem, Eric Sesterhenn On Wed, Jul 01, 2009 at 09:25:17AM +0200, Sebastian Andrzej Siewior wrote: > * Neil Horman | 2009-06-30 20:06:48 [-0400]: > > >I think this looks better, yeah, have you tested this? If not, give it a quick > >run please, and I'll ack it. > I've built it and started > | modprobe tcrypt mode=150 > and I ended up with: > | alg: No test for stdrng (ansi_cprng) > > So this should be fine I guess. > > >Neil > > Sebastian > Yeah, ok, that should be good, although I'll make a note and fix the aliasing issue in the testmgr code Acked-by: Neil Horman <nhorman@tuxdriver.com> Herbert, can you pull this into cryptodev please? ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v2] crypto/ansi prng: alloc cipher just in in init() 2009-07-01 10:36 ` Neil Horman @ 2009-07-03 4:11 ` Herbert Xu 0 siblings, 0 replies; 13+ messages in thread From: Herbert Xu @ 2009-07-03 4:11 UTC (permalink / raw) To: Neil Horman Cc: Sebastian Andrzej Siewior, linux-crypto, davem, Eric Sesterhenn On Wed, Jul 01, 2009 at 06:36:16AM -0400, Neil Horman wrote: > > Herbert, can you pull this into cryptodev please? Both patches applied. Thanks everyone! -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} <herbert@gondor.apana.org.au> Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt ^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2009-07-03 4:11 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-06-29 13:17 Bug when modprobing tcrypt Eric Sesterhenn
2009-06-29 14:07 ` Sebastian Andrzej Siewior
2009-06-29 15:20 ` Neil Horman
2009-06-29 21:44 ` [PATCH 1/2] crypto/ansi prng: use just a BH lock Sebastian Andrzej Siewior
2009-06-30 14:14 ` Neil Horman
2009-06-29 21:45 ` [PATCH 2/2] crypto/ansi prng: alloc cipher just in in init() Sebastian Andrzej Siewior
2009-06-29 21:48 ` Sebastian Andrzej Siewior
2009-06-29 21:54 ` Neil Horman
2009-06-30 14:51 ` Neil Horman
2009-06-30 19:55 ` [PATCH v2] " Sebastian Andrzej Siewior
2009-07-01 0:06 ` Neil Horman
[not found] ` <20090701072517.GA9583@Chamillionaire.breakpoint.cc>
2009-07-01 10:36 ` Neil Horman
2009-07-03 4:11 ` Herbert Xu
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox