From: Rusty Russell Subject: Re: [PATCH 1/5] hwrng: core - Use struct completion for cleanup_done Date: Wed, 24 Dec 2014 09:49:10 +1030 Message-ID: <87tx0mgdjl.fsf@rustcorp.com.au> References: <20141223053909.GA28001@gondor.apana.org.au> Mime-Version: 1.0 Content-Type: text/plain To: Herbert Xu , Fengguang Wu , LKP , linux-kernel@vger.kernel.org, Linux Crypto Mailing List , Amos Kong , m@bues.ch, mpm@selenic.com, amit.shah@redhat.com Return-path: In-Reply-To: Sender: linux-kernel-owner@vger.kernel.org List-Id: linux-crypto.vger.kernel.org Herbert Xu writes: > There is no point in doing a manual completion for cleanup_done > when struct completion fits in perfectly. > > Signed-off-by: Herbert Xu Indeed. Acked-by: Rusty Russell Thanks, Rusty. > --- > > drivers/char/hw_random/core.c | 12 +++--------- > include/linux/hw_random.h | 3 ++- > 2 files changed, 5 insertions(+), 10 deletions(-) > > diff --git a/drivers/char/hw_random/core.c b/drivers/char/hw_random/core.c > index 6ec4225..3dba2cf 100644 > --- a/drivers/char/hw_random/core.c > +++ b/drivers/char/hw_random/core.c > @@ -60,7 +60,6 @@ static DEFINE_MUTEX(rng_mutex); > static DEFINE_MUTEX(reading_mutex); > static int data_avail; > static u8 *rng_buffer, *rng_fillbuf; > -static DECLARE_WAIT_QUEUE_HEAD(rng_done); > static unsigned short current_quality; > static unsigned short default_quality; /* = 0; default to "off" */ > > @@ -100,10 +99,7 @@ static inline void cleanup_rng(struct kref *kref) > if (rng->cleanup) > rng->cleanup(rng); > > - /* cleanup_done should be updated after cleanup finishes */ > - smp_wmb(); > - rng->cleanup_done = true; > - wake_up_all(&rng_done); > + complete(&rng->cleanup_done); > } > > static void set_current_rng(struct hwrng *rng) > @@ -498,7 +494,7 @@ int hwrng_register(struct hwrng *rng) > add_early_randomness(rng); > } > > - rng->cleanup_done = false; > + init_completion(&rng->cleanup_done); > > out_unlock: > mutex_unlock(&rng_mutex); > @@ -532,9 +528,7 @@ void hwrng_unregister(struct hwrng *rng) > } else > mutex_unlock(&rng_mutex); > > - /* Just in case rng is reading right now, wait. */ > - wait_event(rng_done, rng->cleanup_done && > - atomic_read(&rng->ref.refcount) == 0); > + wait_for_completion(&rng->cleanup_done); > } > EXPORT_SYMBOL_GPL(hwrng_unregister); > > diff --git a/include/linux/hw_random.h b/include/linux/hw_random.h > index 7832e50..eb7b414 100644 > --- a/include/linux/hw_random.h > +++ b/include/linux/hw_random.h > @@ -12,6 +12,7 @@ > #ifndef LINUX_HWRANDOM_H_ > #define LINUX_HWRANDOM_H_ > > +#include > #include > #include > #include > @@ -46,7 +47,7 @@ struct hwrng { > /* internal. */ > struct list_head list; > struct kref ref; > - bool cleanup_done; > + struct completion cleanup_done; > }; > > /** Register a new Hardware Random Number Generator driver. */