On Tue, May 29, 2007 at 12:46:14PM -0500, Matt Mackall wrote: > We might as well mix jiffies and cycles in at init time in a manner > similar to the above. Something like this (untested):
Scratch that one. Here's one that compiles and seems to work under lguest: Index: l/drivers/char/random.c =================================================================== --- l.orig/drivers/char/random.c 2007-05-29 12:45:00.000000000 -0500 +++ l/drivers/char/random.c 2007-05-29 12:50:02.000000000 -0500 @@ -559,6 +559,26 @@ static struct timer_rand_state input_tim static struct timer_rand_state *irq_timer_state[NR_IRQS]; /* + * Mix a sample of the current time into the pool with no entropy + * accounting + */ +static long __add_timer_randomness(unsigned num) +{ + struct { + cycles_t cycles; + long jiffies; + unsigned num; + } sample; + + sample.jiffies = jiffies; + sample.cycles = get_cycles(); + sample.num = num; + add_entropy_words(&input_pool, (u32 *)&sample, sizeof(sample)/4); + + return sample.jiffies; +} + +/* * This function adds entropy to the entropy "pool" by using timing * delays. It uses the timer_rand_state structure to make an estimate * of how many bits of entropy this call has added to the pool. @@ -570,12 +590,7 @@ static struct timer_rand_state *irq_time */ static void add_timer_randomness(struct timer_rand_state *state, unsigned num) { - struct { - cycles_t cycles; - long jiffies; - unsigned num; - } sample; - long delta, delta2, delta3; + long timestamp, delta, delta2, delta3; preempt_disable(); /* if over the trickle threshold, use only 1 in 4096 samples */ @@ -583,10 +598,7 @@ static void add_timer_randomness(struct (__get_cpu_var(trickle_count)++ & 0xfff)) goto out; - sample.jiffies = jiffies; - sample.cycles = get_cycles(); - sample.num = num; - add_entropy_words(&input_pool, (u32 *)&sample, sizeof(sample)/4); + timestamp = __add_timer_randomness(num); /* * Calculate number of bits of randomness we probably added. @@ -595,8 +607,8 @@ static void add_timer_randomness(struct */ if (!state->dont_count_entropy) { - delta = sample.jiffies - state->last_time; - state->last_time = sample.jiffies; + delta = timestamp - state->last_time; + state->last_time = timestamp; delta2 = delta - state->last_delta; state->last_delta = delta; @@ -899,6 +911,7 @@ static int __init rand_initialize(void) init_std_data(&input_pool); init_std_data(&blocking_pool); init_std_data(&nonblocking_pool); + __add_timer_randomness(0); return 0; } module_init(rand_initialize); @@ -1028,6 +1041,8 @@ random_write(struct file * file, const c const char __user *p = buffer; size_t c = count; + __add_timer_randomness(0); + while (c > 0) { bytes = min(c, sizeof(buf)); -- Mathematics is the supreme nostalgia of our time. - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/