1. 24 10月, 2007 1 次提交
    • H
      Fix synchronize_irq races with IRQ handler · a98ce5c6
      Herbert Xu 提交于
      As it is some callers of synchronize_irq rely on memory barriers
      to provide synchronisation against the IRQ handlers.  For example,
      the tg3 driver does
      
      	tp->irq_sync = 1;
      	smp_mb();
      	synchronize_irq();
      
      and then in the IRQ handler:
      
      	if (!tp->irq_sync)
      		netif_rx_schedule(dev, &tp->napi);
      
      Unfortunately memory barriers only work well when they come in
      pairs.  Because we don't actually have memory barriers on the
      IRQ path, the memory barrier before the synchronize_irq() doesn't
      actually protect us.
      
      In particular, synchronize_irq() may return followed by the
      result of netif_rx_schedule being made visible.
      
      This patch (mostly written by Linus) fixes this by using spin
      locks instead of memory barries on the synchronize_irq() path.
      Signed-off-by: NHerbert Xu <herbert@gondor.apana.org.au>
      Acked-by: NBenjamin Herrenschmidt <benh@kernel.crashing.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      a98ce5c6
  2. 23 10月, 2007 39 次提交