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 <pr...@mit.edu> --- 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 majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/