diff options
| author | Herbert Xu <herbert@gondor.apana.org.au> | 2014-12-23 00:40:17 -0500 |
|---|---|---|
| committer | Herbert Xu <herbert@gondor.apana.org.au> | 2014-12-25 16:33:34 -0500 |
| commit | 77584ee57434813b50fc85cde995a6271a5081b7 (patch) | |
| tree | 864924c83b987f586da1ee50ab4e49eac6bcafc0 /drivers/char/hw_random | |
| parent | d69e75deff2377b46b2b357ac3781cc93cd7ffd6 (diff) | |
hwrng: core - Use struct completion for cleanup_done
There is no point in doing a manual completion for cleanup_done
when struct completion fits in perfectly.
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.c | 12 |
1 files changed, 3 insertions, 9 deletions
diff --git a/drivers/char/hw_random/core.c b/drivers/char/hw_random/core.c index 6ec42252e46e..3dba2cf50241 100644 --- a/drivers/char/hw_random/core.c +++ b/drivers/char/hw_random/core.c | |||
| @@ -60,7 +60,6 @@ static DEFINE_MUTEX(rng_mutex); | |||
| 60 | static DEFINE_MUTEX(reading_mutex); | 60 | static DEFINE_MUTEX(reading_mutex); |
| 61 | static int data_avail; | 61 | static int data_avail; |
| 62 | static u8 *rng_buffer, *rng_fillbuf; | 62 | static u8 *rng_buffer, *rng_fillbuf; |
| 63 | static DECLARE_WAIT_QUEUE_HEAD(rng_done); | ||
| 64 | static unsigned short current_quality; | 63 | static unsigned short current_quality; |
| 65 | static unsigned short default_quality; /* = 0; default to "off" */ | 64 | static unsigned short default_quality; /* = 0; default to "off" */ |
| 66 | 65 | ||
| @@ -100,10 +99,7 @@ static inline void cleanup_rng(struct kref *kref) | |||
| 100 | if (rng->cleanup) | 99 | if (rng->cleanup) |
| 101 | rng->cleanup(rng); | 100 | rng->cleanup(rng); |
| 102 | 101 | ||
| 103 | /* cleanup_done should be updated after cleanup finishes */ | 102 | complete(&rng->cleanup_done); |
| 104 | smp_wmb(); | ||
| 105 | rng->cleanup_done = true; | ||
| 106 | wake_up_all(&rng_done); | ||
| 107 | } | 103 | } |
| 108 | 104 | ||
| 109 | static void set_current_rng(struct hwrng *rng) | 105 | static void set_current_rng(struct hwrng *rng) |
| @@ -498,7 +494,7 @@ int hwrng_register(struct hwrng *rng) | |||
| 498 | add_early_randomness(rng); | 494 | add_early_randomness(rng); |
| 499 | } | 495 | } |
| 500 | 496 | ||
| 501 | rng->cleanup_done = false; | 497 | init_completion(&rng->cleanup_done); |
| 502 | 498 | ||
| 503 | out_unlock: | 499 | out_unlock: |
| 504 | mutex_unlock(&rng_mutex); | 500 | mutex_unlock(&rng_mutex); |
| @@ -532,9 +528,7 @@ void hwrng_unregister(struct hwrng *rng) | |||
| 532 | } else | 528 | } else |
| 533 | mutex_unlock(&rng_mutex); | 529 | mutex_unlock(&rng_mutex); |
| 534 | 530 | ||
| 535 | /* Just in case rng is reading right now, wait. */ | 531 | wait_for_completion(&rng->cleanup_done); |
| 536 | wait_event(rng_done, rng->cleanup_done && | ||
| 537 | atomic_read(&rng->ref.refcount) == 0); | ||
| 538 | } | 532 | } |
| 539 | EXPORT_SYMBOL_GPL(hwrng_unregister); | 533 | EXPORT_SYMBOL_GPL(hwrng_unregister); |
| 540 | 534 | ||
