And an apology for a ping using the wrong mail handler, and the top post...
Would love to know if this has gotten any cycles.
On 8/15/19 5:31 PM, Gary R Hook wrote:
> Context:
> We've run into a possible locking issue when using the AMD CCP device
> for crypto offload, with the new extra tests, and with lock debugging
> enabled.
>
> Pre-reqs:
> Enable the crypto self-tests and extra tests
> Build the crypto testing module (tcrypt)
> Enable the kernel hacking/lock debugging option
> "prove locking correctness" (CONFIG_PROVE_LOCKING=y)
>
> Problem:
> After booting this kernel, and loading our ccp-crypto module, run the
> tests with "modprobe tcrypt" and we get the dmesg output shown following.
>
> With some investigation we discovered that in the situation being
> reported here, the callback is executed as a tasklet, where we're not
> allowed to sleep. The called routine began its crypto operation with the
> MAY_SLEEP flag set, and allocates memory using GFP_KERNEL.
>
> The test itself runs in a typical context, and may sleep; the callback,
> however, runs as a tasklet yet thinks it can sleep based on the
> CRYPTO_TFM_REQ_MAY_SLEEP flag set in the request.
>
> Drivers for crypto are required (as we understand it) to use a tasklet
> approach for callbacks, which is needed (for one example) to support
> IPSec. (N.B. we did some poking around in other, similar crypto
> drivers, and all appear to be using tasklets.)
>
> We're looking for the best approach to resolve this. Thoughts?
>
> Gary
>
> [ 58.815592] alg: skcipher: skipping comparison tests for ofb(aes)
> because ofb(aes-generic) is unavailable
> [ 59.105437] alg: skcipher: skipping comparison tests for cfb(aes)
> because cfb(aes-generic) is unavailable
> [ 64.024347] alg: hash: failed to allocate transform for streebog256: -2
> [ 64.039851] alg: hash: failed to allocate transform for streebog512: -2
> [ 67.698789] alg: hash: failed to allocate transform for
> hmac(streebog256): -2
> [ 67.720735] alg: hash: failed to allocate transform for
> hmac(streebog512): -2
>
> [ 68.803745] ================================
> [ 68.808515] WARNING: inconsistent lock state
> [ 68.813284] 5.3.0-rc2-oopschk+ #62 Tainted: G E
> [ 68.819796] --------------------------------
> [ 68.824565] inconsistent {SOFTIRQ-ON-W} -> {IN-SOFTIRQ-W} usage.
> [ 68.831272] ksoftirqd/56/299 [HC0[0]:SC1[1]:HE1:SE0] takes:
> [ 68.837496] 00000000334d2af0 (fs_reclaim){+.?.}, at:
> fs_reclaim_acquire.part.101+0x5/0x30
> [ 68.846637] {SOFTIRQ-ON-W} state was registered at:
> [ 68.852078] lock_acquire+0xa3/0x180
> [ 68.856167] fs_reclaim_acquire.part.101+0x29/0x30
> [ 68.861614] fs_reclaim_acquire+0x19/0x20
> [ 68.866187] slab_pre_alloc_hook+0x19/0x70
> [ 68.870847] __kmalloc_node+0x51/0x1f0
> [ 68.875134] alloc_cpumask_var_node+0x1f/0x30
> [ 68.880096] zalloc_cpumask_var+0x14/0x20
> [ 68.884673] native_smp_prepare_cpus+0xd7/0x28e
> [ 68.889829] kernel_init_freeable+0x136/0x2d0
> [ 68.894791] kernel_init+0xe/0x110
> [ 68.898690] ret_from_fork+0x27/0x50
> [ 68.902776] irq event stamp: 53764
> [ 68.906577] hardirqs last enabled at (53764): [<ffffffff8e4d1b37>]
> slab_free_freelist_hook+0xd7/0x1c0
> [ 68.916968] hardirqs last disabled at (53763): [<ffffffff8e4d1b18>]
> slab_free_freelist_hook+0xb8/0x1c0
> [ 68.927363] softirqs last enabled at (53752): [<ffffffff8f00035e>]
> __do_softirq+0x35e/0x3fe
> [ 68.936791] softirqs last disabled at (53757): [<ffffffff8e2a0465>]
> run_ksoftirqd+0x35/0x50
> [ 68.946115]
> other info that might help us debug this:
> [ 68.953403] Possible unsafe locking scenario:
>
> [ 68.960004] CPU0
> [ 68.962732] ----
> [ 68.965463] lock(fs_reclaim);
> [ 68.968963] <Interrupt>
> [ 68.971888] lock(fs_reclaim);
> [ 68.975585]
> *** DEADLOCK ***
>
> [ 68.982197] no locks held by ksoftirqd/56/299.
> [ 68.987157]
> stack backtrace:
> [ 68.992025] CPU: 56 PID: 299 Comm: ksoftirqd/56 Tainted: G E
> 5.3.0-rc2-oopschk+ #62
> [ 69.002026] Hardware name: AMD Corporation Diesel/Diesel, BIOS
> RDL100BB 11/14/2018
> [ 69.010480] Call Trace:
> [ 69.013212] dump_stack+0x8e/0xd5
> [ 69.016915] print_usage_bug+0x1dd/0x1f0
> [ 69.021298] mark_lock+0x454/0x4f0
> [ 69.025094] ? find_held_lock+0x35/0xa0
> [ 69.029376] ? check_usage_backwards+0x180/0x180
> [ 69.034526] __lock_acquire+0x586/0x1470
> [ 69.038909] ? trace_hardirqs_off+0x3b/0xe0
> [ 69.043584] lock_acquire+0xa3/0x180
> [ 69.047577] ? fs_reclaim_acquire.part.101+0x5/0x30
> [ 69.053023] fs_reclaim_acquire.part.101+0x29/0x30
> [ 69.058373] ? fs_reclaim_acquire.part.101+0x5/0x30
> [ 69.063819] fs_reclaim_acquire+0x19/0x20
> [ 69.068299] slab_pre_alloc_hook+0x19/0x70
> [ 69.072875] __kmalloc+0x4e/0x270
> [ 69.076578] ? skcipher_walk_next+0x1c9/0x570
> [ 69.081444] skcipher_walk_next+0x1c9/0x570
> [ 69.086115] skcipher_walk_first+0x46/0x110
> [ 69.090788] skcipher_walk_skcipher+0xb7/0xd0
> [ 69.095656] skcipher_walk_virt+0x2b/0x60
> [ 69.100145] cbc_decrypt+0x4d/0xe0 [aesni_intel]
> [ 69.105310] crypto_skcipher_decrypt+0x1b/0x30
> [ 69.110273] ? crypto_skcipher_decrypt+0x1b/0x30
> [ 69.115431] simd_skcipher_decrypt+0xbe/0xd0 [crypto_simd]
> [ 69.121557] crypto_skcipher_decrypt+0x1b/0x30
> [ 69.126525] crypto_authenc_decrypt_tail.isra.2+0xee/0x110
> [ 69.132654] authenc_verify_ahash_done+0x2e/0x40
> [ 69.137812] ccp_crypto_complete+0xde/0x190
> [ 69.142488] ccp_do_cmd_complete+0x27/0x40
> [ 69.147067] tasklet_action_common.isra.21+0x81/0x1a0
> [ 69.152709] tasklet_action+0x22/0x30
> [ 69.156796] __do_softirq+0xcd/0x3fe
> [ 69.160790] ? lockdep_hardirqs_on+0xfb/0x190
> [ 69.165655] run_ksoftirqd+0x35/0x50
> [ 69.169649] smpboot_thread_fn+0xfc/0x170
> [ 69.174130] kthread+0x121/0x140
> [ 69.177735] ? sort_range+0x30/0x30
> [ 69.181630] ? kthread_park+0xb0/0xb0
> [ 69.185720] ret_from_fork+0x27/0x50
> [ 70.850617] alg: skcipher: failed to allocate transform for ecb(sm4): -2
> [ 70.866302] alg: skcipher: failed to allocate transform for cbc(sm4): -2
> [ 70.881646] alg: skcipher: failed to allocate transform for ctr(sm4): -2
> [ 70.889161] tcrypt: one or more tests failed!