Messages in this thread Patch in this message | | | From | Kefeng Wang <> | Subject | [PATCH v2] crypto: pcrypt: Fix possible deadlock in padata_sysfs_release | Date | Sat, 1 Jun 2019 17:23:32 +0800 |
| |
There is a deadlock issue in pcrypt_init_padata(),
pcrypt_init_padata() cpus_read_lock() padata_free() padata_sysfs_release() cpus_read_lock()
Narrow rcu_read_lock/unlock() and move put_online_cpus() before padata_free() to fix it.
Reported-by: Hulk Robot <hulkci@huawei.com> Signed-off-by: Kefeng Wang <wangkefeng.wang@huawei.com> --- crypto/pcrypt.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/crypto/pcrypt.c b/crypto/pcrypt.c index 0e9ce329fd47..f3dacb714cd4 100644 --- a/crypto/pcrypt.c +++ b/crypto/pcrypt.c @@ -407,16 +407,19 @@ static int pcrypt_init_padata(struct padata_pcrypt *pcrypt, int ret = -ENOMEM; struct pcrypt_cpumask *mask; - get_online_cpus(); pcrypt->wq = alloc_workqueue("%s", WQ_MEM_RECLAIM | WQ_CPU_INTENSIVE, 1, name); if (!pcrypt->wq) goto err; + get_online_cpus(); + pcrypt->pinst = padata_alloc_possible(pcrypt->wq); - if (!pcrypt->pinst) + if (!pcrypt->pinst) { + put_online_cpus(); goto err_destroy_workqueue; + } mask = kmalloc(sizeof(*mask), GFP_KERNEL); if (!mask) @@ -448,12 +451,11 @@ static int pcrypt_init_padata(struct padata_pcrypt *pcrypt, free_cpumask_var(mask->mask); kfree(mask); err_free_padata: + put_online_cpus(); padata_free(pcrypt->pinst); err_destroy_workqueue: destroy_workqueue(pcrypt->wq); err: - put_online_cpus(); - return ret; } -- 2.20.1
| |