aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/char/hw_random
diff options
context:
space:
mode:
authorAmos Kong <akong@redhat.com>2014-12-08 16:50:36 +0800
committerHerbert Xu <herbert@gondor.apana.org.au>2014-12-22 23:02:38 +1100
commit1dacb395d68a14825ee48c0843335e3181aea675 (patch)
tree55b22c3c63081c224b168bd09e2dd19eb52d6fa8 /drivers/char/hw_random
parenthwrng: place mutex around read functions and buffers. (diff)
downloadlinux-dev-1dacb395d68a14825ee48c0843335e3181aea675.tar.xz
linux-dev-1dacb395d68a14825ee48c0843335e3181aea675.zip
hwrng: move some code out mutex_lock for avoiding underlying deadlock
In next patch, we use reference counting for each struct hwrng, changing reference count also needs to take mutex_lock. Before releasing the lock, if we try to stop a kthread that waits to take the lock to reduce the referencing count, deadlock will occur. Signed-off-by: Amos Kong <akong@redhat.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'drivers/char/hw_random')
-rw-r--r--drivers/char/hw_random/core.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/drivers/char/hw_random/core.c b/drivers/char/hw_random/core.c
index 2dd3144d69b1..b4c0e873d362 100644
--- a/drivers/char/hw_random/core.c
+++ b/drivers/char/hw_random/core.c
@@ -470,12 +470,12 @@ void hwrng_unregister(struct hwrng *rng)
}
}
if (list_empty(&rng_list)) {
+ mutex_unlock(&rng_mutex);
unregister_miscdev();
if (hwrng_fill)
kthread_stop(hwrng_fill);
- }
-
- mutex_unlock(&rng_mutex);
+ } else
+ mutex_unlock(&rng_mutex);
}
EXPORT_SYMBOL_GPL(hwrng_unregister);