[PATCH 11/14] random: separate entropy since auto-push fromentropy_total

From: Greg Price
Date: Sat Dec 14 2013 - 21:01:57 EST


We're using and updating the entropy_total field for different
purposes on input_pool and nonblocking_pool, only one of which
matches the name. This makes it hard to understand what the field
means.

Separate the computation on input_pool, which is of entropy since
the last auto-push, from the computation on nonblocking_pool.
Also compute 'initialized' only for nonblocking_pool, which is the
only place where the concept really makes sense.

Signed-off-by: Greg Price <price@xxxxxxx>
---
drivers/char/random.c | 17 +++++++++--------
include/trace/events/random.h | 24 ++++++++++++++----------
2 files changed, 23 insertions(+), 18 deletions(-)

diff --git a/drivers/char/random.c b/drivers/char/random.c
index ea389723f..1f9c69662 100644
--- a/drivers/char/random.c
+++ b/drivers/char/random.c
@@ -425,6 +425,7 @@ struct entropy_store {
unsigned short add_ptr;
unsigned short input_rotate;
int entropy_count;
+ int entropy_since_push;
int entropy_total;
unsigned int initialized:1;
unsigned int limit:1;
@@ -662,11 +663,10 @@ retry:
if (cmpxchg(&r->entropy_count, orig, entropy_count) != orig)
goto retry;

- r->entropy_total += nbits;
- if (!r->initialized && r->entropy_total > 128) {
- r->initialized = 1;
- r->entropy_total = 0;
- if (r == &nonblocking_pool) {
+ if (r == &nonblocking_pool) {
+ r->entropy_total += nbits;
+ if (!r->initialized && r->entropy_total > 128) {
+ r->initialized = 1;
prandom_reseed_late();
pr_notice("random: %s pool is initialized\n", r->name);
}
@@ -674,6 +674,7 @@ retry:

trace_credit_entropy_bits(r->name, nbits,
entropy_count >> ENTROPY_SHIFT,
+ r->entropy_since_push,
r->entropy_total, _RET_IP_);

if (r == &input_pool) {
@@ -689,9 +690,9 @@ retry:
* forth between them, until the output pools are 75%
* full.
*/
+ r->entropy_since_push += nbits;
if (entropy_bits > random_write_wakeup_bits &&
- r->initialized &&
- r->entropy_total >= 2*random_read_wakeup_bits) {
+ r->entropy_since_push >= 2*random_read_wakeup_bits) {
static struct entropy_store *last = &blocking_pool;
struct entropy_store *other = &blocking_pool;

@@ -703,7 +704,7 @@ retry:
if (last->entropy_count <=
3 * last->poolinfo->poolfracbits / 4) {
schedule_work(&last->push_work);
- r->entropy_total = 0;
+ r->entropy_since_push = 0;
}
}
}
diff --git a/include/trace/events/random.h b/include/trace/events/random.h
index 805af6db4..4edf5ceb5 100644
--- a/include/trace/events/random.h
+++ b/include/trace/events/random.h
@@ -61,29 +61,33 @@ DEFINE_EVENT(random__mix_pool_bytes, mix_pool_bytes_nolock,

TRACE_EVENT(credit_entropy_bits,
TP_PROTO(const char *pool_name, int bits, int entropy_count,
- int entropy_total, unsigned long IP),
+ int entropy_since_push, int entropy_total, unsigned long IP),

- TP_ARGS(pool_name, bits, entropy_count, entropy_total, IP),
+ TP_ARGS(pool_name, bits, entropy_count, entropy_since_push,
+ entropy_total, IP),

TP_STRUCT__entry(
__field( const char *, pool_name )
__field( int, bits )
__field( int, entropy_count )
+ __field( int, entropy_since_push )
__field( int, entropy_total )
__field(unsigned long, IP )
),

TP_fast_assign(
- __entry->pool_name = pool_name;
- __entry->bits = bits;
- __entry->entropy_count = entropy_count;
- __entry->entropy_total = entropy_total;
- __entry->IP = IP;
+ __entry->pool_name = pool_name;
+ __entry->bits = bits;
+ __entry->entropy_count = entropy_count;
+ __entry->entropy_since_push = entropy_since_push;
+ __entry->entropy_total = entropy_total;
+ __entry->IP = IP;
),

- TP_printk("%s pool: bits %d entropy_count %d entropy_total %d "
- "caller %pF", __entry->pool_name, __entry->bits,
- __entry->entropy_count, __entry->entropy_total,
+ TP_printk("%s pool: bits %d entropy_count %d entropy_since_push %d "
+ "entropy_total %d caller %pF", __entry->pool_name,
+ __entry->bits, __entry->entropy_count,
+ __entry->entropy_since_push, __entry->entropy_total,
(void *)__entry->IP)
);

--
1.8.3.2

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/