linux/drivers/crypto
Giovanni Cabiddu a2ae48bd82 crypto: qat - fix deadlock in backlog processing
[ Upstream commit 203b01001c ]

If a request has the flag CRYPTO_TFM_REQ_MAY_BACKLOG set, the function
qat_alg_send_message_maybacklog(), enqueues it in a backlog list if
either (1) there is already at least one request in the backlog list, or
(2) the HW ring is nearly full or (3) the enqueue to the HW ring fails.
If an interrupt occurs right before the lock in qat_alg_backlog_req() is
taken and the backlog queue is being emptied, then there is no request
in the HW queues that can trigger a subsequent interrupt that can clear
the backlog queue. In addition subsequent requests are enqueued to the
backlog list and not sent to the hardware.

Fix it by holding the lock while taking the decision if the request
needs to be included in the backlog queue or not. This synchronizes the
flow with the interrupt handler that drains the backlog queue.

For performance reasons, the logic has been changed to try to enqueue
first without holding the lock.

Fixes: 3868238397 ("crypto: qat - add backlog mechanism")
Reported-by: Mikulas Patocka <mpatocka@redhat.com>
Closes: https://lore.kernel.org/all/af9581e2-58f9-cc19-428f-6f18f1f83d54@redhat.com/T/
Signed-off-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
Reviewed-by: Mikulas Patocka <mpatocka@redhat.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2023-11-20 11:08:24 +01:00
..
allwinner crypto: sun8i-ss - Fix a test in sun8i_ss_setup_ivs() 2023-05-17 11:50:20 +02:00
amcc crypto: crypto4xx - Call dma_unmap_page when done 2023-03-10 09:39:17 +01:00
amlogic crypto: amlogic - Remove kcalloc without check 2022-12-31 13:14:25 +01:00
axis
bcm
caam crypto: caam/jr - fix Chacha20 + Poly1305 self test failure 2023-11-20 11:08:22 +01:00
cavium crypto: nitrox - avoid double free on error path in nitrox_sriov_init() 2022-12-31 13:14:21 +01:00
ccp crypto: ccp - Clear PSP interrupt status register before calling handler 2023-05-17 11:50:13 +02:00
ccree crypto: ccree - Make cc_debugfs_global_fini() available for module init function 2022-12-31 13:14:24 +01:00
chelsio
gemini crypto: gemini - call finalize with bh disabled 2022-04-08 14:23:08 +02:00
hisilicon crypto: hisilicon/hpre - Fix a erroneous check after snprintf() 2023-11-20 11:08:22 +01:00
inside-secure crypto: safexcel - Cleanup ring IRQ workqueues on load failure 2023-05-11 23:00:17 +09:00
keembay
marvell crypto: marvell/cesa - Fix type mismatch warning 2023-07-23 13:47:15 +02:00
nx crypto: nx - fix build warnings when DEBUG_FS is not enabled 2023-07-23 13:47:15 +02:00
qat crypto: qat - fix deadlock in backlog processing 2023-11-20 11:08:24 +01:00
qce
rockchip crypto: rockchip - rework by using crypto_engine 2022-12-31 13:14:22 +01:00
stm32 crypto: stm32 - fix loop iterating through scatterlist for DMA 2023-09-19 12:22:52 +02:00
ux500
virtio
vmx crypto: vmx - add missing dependencies 2022-04-08 14:23:08 +02:00
xilinx
atmel-aes-regs.h
atmel-aes.c
atmel-authenc.h
atmel-ecc.c
atmel-i2c.c
atmel-i2c.h
atmel-sha204a.c
atmel-sha-regs.h
atmel-sha.c
atmel-tdes-regs.h
atmel-tdes.c
exynos-rng.c
geode-aes.c
geode-aes.h
hifn_795x.c
img-hash.c crypto: img-hash - Fix variable dereferenced before check 'hdev->req' 2022-12-31 13:14:26 +01:00
ixp4xx_crypto.c
Kconfig crypto: sa2ul - Select CRYPTO_DES 2023-05-11 23:00:27 +09:00
Makefile
mxs-dcp.c crypto: mxs-dcp - Fix scatterlist processing 2022-04-08 14:23:05 +02:00
n2_asm.S
n2_core.c crypto: n2 - add missing hash statesize 2023-01-12 11:58:58 +01:00
n2_core.h
omap-aes-gcm.c
omap-aes.c
omap-aes.h
omap-crypto.c
omap-crypto.h
omap-des.c
omap-sham.c crypto: omap-sham - Use pm_runtime_resume_and_get() in omap_sham_probe() 2022-12-31 13:14:26 +01:00
padlock-aes.c
padlock-sha.c
qcom-rng.c crypto: qcom-rng - fix infinite loop on requests not multiple of WORD_SZ 2022-05-25 09:57:28 +02:00
s5p-sss.c
sa2ul.c
sa2ul.h
sahara.c crypto: sahara - don't sleep when in softirq 2022-10-26 12:35:23 +02:00
talitos.c
talitos.h