mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-07-10 08:33:14 +00:00
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>
This commit is contained in:
parent
d69e75deff
commit
77584ee574
2 changed files with 5 additions and 10 deletions
|
@ -60,7 +60,6 @@ static DEFINE_MUTEX(rng_mutex);
|
||||||
static DEFINE_MUTEX(reading_mutex);
|
static DEFINE_MUTEX(reading_mutex);
|
||||||
static int data_avail;
|
static int data_avail;
|
||||||
static u8 *rng_buffer, *rng_fillbuf;
|
static u8 *rng_buffer, *rng_fillbuf;
|
||||||
static DECLARE_WAIT_QUEUE_HEAD(rng_done);
|
|
||||||
static unsigned short current_quality;
|
static unsigned short current_quality;
|
||||||
static unsigned short default_quality; /* = 0; default to "off" */
|
static unsigned short default_quality; /* = 0; default to "off" */
|
||||||
|
|
||||||
|
@ -100,10 +99,7 @@ static inline void cleanup_rng(struct kref *kref)
|
||||||
if (rng->cleanup)
|
if (rng->cleanup)
|
||||||
rng->cleanup(rng);
|
rng->cleanup(rng);
|
||||||
|
|
||||||
/* cleanup_done should be updated after cleanup finishes */
|
complete(&rng->cleanup_done);
|
||||||
smp_wmb();
|
|
||||||
rng->cleanup_done = true;
|
|
||||||
wake_up_all(&rng_done);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void set_current_rng(struct hwrng *rng)
|
static void set_current_rng(struct hwrng *rng)
|
||||||
|
@ -498,7 +494,7 @@ int hwrng_register(struct hwrng *rng)
|
||||||
add_early_randomness(rng);
|
add_early_randomness(rng);
|
||||||
}
|
}
|
||||||
|
|
||||||
rng->cleanup_done = false;
|
init_completion(&rng->cleanup_done);
|
||||||
|
|
||||||
out_unlock:
|
out_unlock:
|
||||||
mutex_unlock(&rng_mutex);
|
mutex_unlock(&rng_mutex);
|
||||||
|
@ -532,9 +528,7 @@ void hwrng_unregister(struct hwrng *rng)
|
||||||
} else
|
} else
|
||||||
mutex_unlock(&rng_mutex);
|
mutex_unlock(&rng_mutex);
|
||||||
|
|
||||||
/* Just in case rng is reading right now, wait. */
|
wait_for_completion(&rng->cleanup_done);
|
||||||
wait_event(rng_done, rng->cleanup_done &&
|
|
||||||
atomic_read(&rng->ref.refcount) == 0);
|
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(hwrng_unregister);
|
EXPORT_SYMBOL_GPL(hwrng_unregister);
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
#ifndef LINUX_HWRANDOM_H_
|
#ifndef LINUX_HWRANDOM_H_
|
||||||
#define LINUX_HWRANDOM_H_
|
#define LINUX_HWRANDOM_H_
|
||||||
|
|
||||||
|
#include <linux/completion.h>
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/list.h>
|
#include <linux/list.h>
|
||||||
#include <linux/kref.h>
|
#include <linux/kref.h>
|
||||||
|
@ -46,7 +47,7 @@ struct hwrng {
|
||||||
/* internal. */
|
/* internal. */
|
||||||
struct list_head list;
|
struct list_head list;
|
||||||
struct kref ref;
|
struct kref ref;
|
||||||
bool cleanup_done;
|
struct completion cleanup_done;
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Register a new Hardware Random Number Generator driver. */
|
/** Register a new Hardware Random Number Generator driver. */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue