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 <k...@hiramoto.org>
---
 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 majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to