Re: [PATCH v2 3/6] hw_random: use reference counts on each struct hwrng.
From: Amos Kong <hidden>
Date: 2014-10-20 04:00:23
Also in:
kvm, lkml
On Mon, Oct 20, 2014 at 10:42:11AM +1030, Rusty Russell wrote:
Amos Kong [off-list ref] writes:quoted
We got a warning in boot stage when above set_current_rng() is executed, it can be fixed by init rng->ref in hwrng_init().@@ -166,6 +169,8 @@ static inline int hwrng_init(struct hwrng *rng) if (current_quality > 0 && !hwrng_fill) start_khwrngd(); + kref_init(&rng->ref); + return 0; }OK, I folded this fix on.
Thanks. Reviewed-by: Amos Kong <redacted>
quoted hunk
Thanks, Rusty. hw_random: use reference counts on each struct hwrng. current_rng holds one reference, and we bump it every time we want to do a read from it. This means we only hold the rng_mutex to grab or drop a reference, so accessing /sys/devices/virtual/misc/hw_random/rng_current doesn't block on read of /dev/hwrng. Using a kref is overkill (we're always under the rng_mutex), but a standard pattern. This also solves the problem that the hwrng_fillfn thread was accessing current_rng without a lock, which could change (eg. to NULL) underneath it. v3: initialize kref (thanks Amos Kong) v2: fix missing put_rng() on exit path (thanks Amos Kong) Signed-off-by: Rusty Russell <redacted>diff --git a/drivers/char/hw_random/core.c b/drivers/char/hw_random/core.c index a0905c818e13..0ecac38da954 100644 --- a/drivers/char/hw_random/core.c +++ b/drivers/char/hw_random/core.c
....