Re: [PATCH 01/10] random: make 'add_interrupt_randomness()' dosomething sane

From: Theodore Ts'o
Date: Thu Jul 05 2012 - 18:01:08 EST


On Thu, Jul 05, 2012 at 02:47:52PM -0700, Linus Torvalds wrote:
> On Thu, Jul 5, 2012 at 2:39 PM, Matt Mackall <mpm@xxxxxxxxxxx> wrote:
> >
> > From my read, this code path gets called on timer interrupts too.
>
> That's hopefully never true for any normal cases (timers are *very*
> special - they tend to go through their own architecture-specific
> stuff). On modern PC's, for example, the timers happen through the
> local apic timers directly.
>
> In fact, with SMP, it's a really bad idea to use a normal irq for
> timer interrupts, since you really really want per-CPU-core timers.
>
> But yes, we should probably make sure that *if* the architecture uses
> regular interrupts for timers we don't count them. The problematic
> embedded platforms are often pretty crap hardware: even when they are
> SMP, they might use an external timer irq (and then we broadcast the
> thing). I think we have the IRQF_TIMER flag for that, so we could add
> a check for that.

Like this?

- Ted

diff --git a/kernel/irq/handle.c b/kernel/irq/handle.c
index 8270db0..0ce4863 100644
--- a/kernel/irq/handle.c
+++ b/kernel/irq/handle.c
@@ -133,7 +133,7 @@ irqreturn_t
handle_irq_event_percpu(struct irq_desc *desc, struct irqaction *action)
{
irqreturn_t retval = IRQ_NONE;
- unsigned int random = 0, irq = desc->irq_data.irq;
+ unsigned int random = 1, irq = desc->irq_data.irq;

do {
irqreturn_t res;
@@ -161,7 +161,8 @@ handle_irq_event_percpu(struct irq_desc *desc, struct irqaction *action)

/* Fall through to add to randomness */
case IRQ_HANDLED:
- random |= action->flags;
+ if (action->flags & __IRQF_TIMER)
+ random = 0;
break;

default:
@@ -172,7 +173,8 @@ handle_irq_event_percpu(struct irq_desc *desc, struct irqaction *action)
action = action->next;
} while (action);

- add_interrupt_randomness(irq);
+ if (random)
+ add_interrupt_randomness(irq);

if (!noirqdebug)
note_interrupt(irq, desc, retval);
--
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/