Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3060d6fe authored by Yinghai Lu's avatar Yinghai Lu Committed by Ingo Molnar
Browse files

x86: put timer_rand_state pointer into irq_desc



irq_timer_state[] is a NR_IRQS sized array that is a side-by array to
the real irq_desc[] array.

Integrate that field into the (now dynamic) irq_desc dynamic array and
save some RAM.

v2: keep the old way to support arch not support irq_desc

Signed-off-by: default avatarYinghai Lu <yhlu.kernel@gmail.com>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent e5a53714
Loading
Loading
Loading
Loading
+61 −5
Original line number Diff line number Diff line
@@ -558,7 +558,7 @@ struct timer_rand_state {
	unsigned dont_count_entropy:1;
};

static struct timer_rand_state input_timer_state;
#ifndef CONFIG_HAVE_SPARSE_IRQ

#ifdef CONFIG_HAVE_DYN_ARRAY
static struct timer_rand_state **irq_timer_state;
@@ -567,6 +567,51 @@ DEFINE_DYN_ARRAY(irq_timer_state, sizeof(struct timer_rand_state *), nr_irqs, PA
static struct timer_rand_state *irq_timer_state[NR_IRQS];
#endif

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;
}

#else

static struct timer_rand_state *get_timer_rand_state(unsigned int irq)
{
	struct irq_desc *desc;

	desc = irq_to_desc(irq);

	if (!desc)
		return NULL;

	return desc->timer_rand_state;
}

static void set_timer_rand_state(unsigned int irq, struct timer_rand_state *state)
{
	struct irq_desc *desc;

	desc = irq_to_desc(irq);

	if (!desc)
		return;

	desc->timer_rand_state = state;
}
#endif

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
@@ -654,11 +699,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
@@ -918,7 +967,14 @@ void rand_initialize_irq(int irq)
{
	struct timer_rand_state *state;

	if (irq >= nr_irqs || irq_timer_state[irq])
#ifndef CONFIG_HAVE_SPARSE_IRQ
	if (irq >= nr_irqs)
		return;
#endif

	state = get_timer_rand_state(irq);

	if (state)
		return;

	/*
@@ -927,7 +983,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
+2 −0
Original line number Diff line number Diff line
@@ -127,6 +127,7 @@ struct irq_chip {
	const char	*typename;
};

struct timer_rand_state;
/**
 * struct irq_desc - interrupt descriptor
 *
@@ -155,6 +156,7 @@ struct irq_desc {
	unsigned int		irq;
#ifdef CONFIG_HAVE_SPARSE_IRQ
	struct irq_desc		*next;
	struct timer_rand_state *timer_rand_state;
#endif
	irq_flow_handler_t	handle_irq;
	struct irq_chip		*chip;