use GFP_ATOMIC to allocate crypt_virt
BUG: sleeping function called from invalid context at mm/page_alloc.c:1470
in_atomic(): 0, irqs_disabled(): 128, pid: 1376, name: cryptomgr_test
1 lock held by cryptomgr_test/1376:
#0: (&desc_lock){....}, at: [<bf147050>] get_crypt_desc+0x14/0xe8
[ixp4xx_crypto]
[<c0028954>] (dump_stack+0x0/0x14) from [<c0030f2c>] (__might_sleep+0xcc/0xe8)
[<c0030e60>] (__might_sleep+0x0/0xe8) from [<c00676e4>]
(__alloc_pages_internal+0xa4/0x430)
r4:000000d0
[<c0067640>] (__alloc_pages_internal+0x0/0x430) from [<c0029ea8>]
(__dma_alloc+0x180/0x3e8)
[<c0029d28>] (__dma_alloc+0x0/0x3e8) from [<c002a198>]
(dma_alloc_coherent+0x58/0x64)
[<c002a140>] (dma_alloc_coherent+0x0/0x64) from [<bf147078>]
(get_crypt_desc+0x3c/0xe8 [ixp4xx_crypto])
r7:c3bc3ce8 r6:c3bc3cc0 r5:20000013 r4:bf14a81c
[<bf14703c>] (get_crypt_desc+0x0/0xe8 [ixp4xx_crypto]) from [<bf147788>]
(ablk_perform+0x68/0x248 [ixp4xx_crypto])
r7:c3bc3ce8 r6:c3bc3cc0 r5:c2cefc2c r4:00000000
[<bf147720>] (ablk_perform+0x0/0x248 [ixp4xx_crypto]) from [<bf1479f0>]
(ablk_encrypt+0x14/0x18 [ixp4xx_crypto])
[<bf1479dc>] (ablk_encrypt+0x0/0x18 [ixp4xx_crypto]) from [<c012bf4c>]
(test_skcipher+0x1bc/0x668)
[<c012bd90>] (test_skcipher+0x0/0x668) from [<c012d428>]
(alg_test_skcipher+0x60/0xa0)
[<c012d3c8>] (alg_test_skcipher+0x0/0xa0) from [<c012ce84>]
(alg_test+0x128/0x160)
r7:00000000 r6:00000286 r5:c39ddd80 r4:c39dddc0
[<c012cd5c>] (alg_test+0x0/0x160) from [<c012bb0c>] (cryptomgr_test+0x38/0x58)
[<c012bad4>] (cryptomgr_test+0x0/0x58) from [<c004bc7c>] (kthread+0x58/0x90)
r4:c2e38000
[<c004bc24>] (kthread+0x0/0x90) from [<c0039ed4>] (do_exit+0x0/0x6d0)
r6:00000000 r5:00000000 r4:00000000
Note this is somewhat hard to reproduce, but can be reproduced under memory
pressure when you first initialize ixp4xx_crypto.
Signed-off-by: Karl Hiramoto <[email protected]>
---
drivers/crypto/ixp4xx_crypto.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/drivers/crypto/ixp4xx_crypto.c b/drivers/crypto/ixp4xx_crypto.c
index 6c6656d..564d68f 100644
--- a/drivers/crypto/ixp4xx_crypto.c
+++ b/drivers/crypto/ixp4xx_crypto.c
@@ -246,7 +246,7 @@ static int setup_crypt_desc(void)
BUILD_BUG_ON(sizeof(struct crypt_ctl) != 64);
crypt_virt = dma_alloc_coherent(dev,
NPE_QLEN * sizeof(struct crypt_ctl),
- &crypt_phys, GFP_KERNEL);
+ &crypt_phys, GFP_ATOMIC);
if (!crypt_virt)
return -ENOMEM;
memset(crypt_virt, 0, NPE_QLEN * sizeof(struct crypt_ctl));
--
1.6.4.4
--
To unsubscribe from this list: send the line "unsubscribe linux-crypto" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html