diff options
Diffstat (limited to 'drivers/char/random.c')
| -rw-r--r-- | drivers/char/random.c | 36 | 
1 files changed, 31 insertions, 5 deletions
diff --git a/drivers/char/random.c b/drivers/char/random.c index c8752eaad48..705a839f179 100644 --- a/drivers/char/random.c +++ b/drivers/char/random.c @@ -558,9 +558,26 @@ struct timer_rand_state {  	unsigned dont_count_entropy:1;  }; -static struct timer_rand_state input_timer_state;  static struct timer_rand_state *irq_timer_state[NR_IRQS]; +static struct timer_rand_state *get_timer_rand_state(unsigned int irq) +{ +	if (irq >= nr_irqs) +		return NULL; + +	return irq_timer_state[irq]; +} + +static void set_timer_rand_state(unsigned int irq, struct timer_rand_state *state) +{ +	if (irq >= nr_irqs) +		return; + +	irq_timer_state[irq] = state; +} + +static struct timer_rand_state input_timer_state; +  /*   * This function adds entropy to the entropy "pool" by using timing   * delays.  It uses the timer_rand_state structure to make an estimate @@ -648,11 +665,15 @@ EXPORT_SYMBOL_GPL(add_input_randomness);  void add_interrupt_randomness(int irq)  { -	if (irq >= NR_IRQS || irq_timer_state[irq] == NULL) +	struct timer_rand_state *state; + +	state = get_timer_rand_state(irq); + +	if (state == NULL)  		return;  	DEBUG_ENT("irq event %d\n", irq); -	add_timer_randomness(irq_timer_state[irq], 0x100 + irq); +	add_timer_randomness(state, 0x100 + irq);  }  #ifdef CONFIG_BLOCK @@ -912,7 +933,12 @@ void rand_initialize_irq(int irq)  {  	struct timer_rand_state *state; -	if (irq >= NR_IRQS || irq_timer_state[irq]) +	if (irq >= nr_irqs) +		return; + +	state = get_timer_rand_state(irq); + +	if (state)  		return;  	/* @@ -921,7 +947,7 @@ void rand_initialize_irq(int irq)  	 */  	state = kzalloc(sizeof(struct timer_rand_state), GFP_KERNEL);  	if (state) -		irq_timer_state[irq] = state; +		set_timer_rand_state(irq, state);  }  #ifdef CONFIG_BLOCK  |