Messages in this thread | | | Date | Wed, 28 Dec 2011 16:14:39 +0100 | Subject | Re: [PATCH 1/1] via-rhine: Fix hanging with high CPU load on low-end broads. | From | Bjarke Istrup Pedersen <> |
| |
2011/12/28 Ben Hutchings <bhutchings@solarflare.com>: > On Wed, 2011-12-28 at 12:28 +0000, Bjarke Istrup Pedersen wrote: >> Working around problem causing high CPU load and hanging system when >> there is alot of network trafic. >> >> It is kind of an ugly way to work around it, but it allows the Soekris >> net5501 to have trafic between two of it's NICs without hanging so much >> that the watchdog kicks in and does a hard reboot of the system. >> >> There is more info on the problem here: >> http://http://lists.soekris.com/pipermail/soekris-tech/2010-October/016889.html >> >> Tested with positive results on two Soekris net5501-70 boxes. > > This is completely wrong. In a UP configuration the extra spinlock > calls have no effect (except perhaps a small delay). In an SMP > configuration they will cause rhine_tx() to deadlock when it also tries > to acquire the spinlock. > > Ben.
Okay, the Soekris net5501-70 boxes are single-core, and I haven't got any SMP boxes with that nic. Is there a better solution for the problem then, to avoid it hanging the box on a non-smp machine with a slow (500mhz) cpu?
/Bjarke
> [...] >> diff --git a/drivers/net/ethernet/via/via-rhine.c b/drivers/net/ethernet/via/via-rhine.c >> index f34dd99..8c77dcd 100644 >> --- a/drivers/net/ethernet/via/via-rhine.c >> +++ b/drivers/net/ethernet/via/via-rhine.c >> @@ -1567,6 +1567,9 @@ static irqreturn_t rhine_interrupt(int irq, void *dev_instance) >> int boguscnt = max_interrupt_work; >> int handled = 0; >> >> + if (!spin_trylock(&rp->lock)) >> + return IRQ_RETVAL(handled); >> + >> while ((intr_status = get_intr_status(dev))) { >> handled = 1; >> >> @@ -1616,6 +1619,8 @@ static irqreturn_t rhine_interrupt(int irq, void *dev_instance) >> } >> } >> >> + spin_unlock(&rp->lock); >> + >> if (debug > 3) >> netdev_dbg(dev, "exiting interrupt, status=%08x\n", >> ioread16(ioaddr + IntrStatus)); > > -- > Ben Hutchings, Staff Engineer, Solarflare > Not speaking for my employer; that's the marketing department's job. > They asked us to note that Solarflare product names are trademarked. > -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |