netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* de4x5 hangs with SMP: synchronize_irq() in interrupt handler?
@ 2010-09-21 20:30 Ondrej Zary
  2010-09-25  4:27 ` David Miller
  0 siblings, 1 reply; 2+ messages in thread
From: Ondrej Zary @ 2010-09-21 20:30 UTC (permalink / raw)
  To: netdev; +Cc: Kernel development list

Hello,
I'm trying to get two Compex FreedomLine 32 PnP-PCI2 cards to work (21041-AA 
and 21041-PA) - there are problems with de2104x driver (one of the cards does 
not work at all and the other one switches to non-existing AUI port when the 
link goes down and never switches back to RJ45) and I know that de4x5 driver 
worked for me in past.

Loading de4x5 causes the machine to hang immediately. It hangs at 
synchronize_irq() call from de4x5_interrupt(). Commenting out this allows the 
driver to work. Without SMP, synchronize_irq() is redefined to barrier() so 
it works.

I don't have a clue how to fix this properly - does anyone know?

-- 
Ondrej Zary

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: de4x5 hangs with SMP: synchronize_irq() in interrupt handler?
  2010-09-21 20:30 de4x5 hangs with SMP: synchronize_irq() in interrupt handler? Ondrej Zary
@ 2010-09-25  4:27 ` David Miller
  0 siblings, 0 replies; 2+ messages in thread
From: David Miller @ 2010-09-25  4:27 UTC (permalink / raw)
  To: linux; +Cc: netdev, linux-kernel

From: Ondrej Zary <linux@rainbow-software.org>
Date: Tue, 21 Sep 2010 22:30:49 +0200

> I'm trying to get two Compex FreedomLine 32 PnP-PCI2 cards to work (21041-AA 
> and 21041-PA) - there are problems with de2104x driver (one of the cards does 
> not work at all and the other one switches to non-existing AUI port when the 
> link goes down and never switches back to RJ45) and I know that de4x5 driver 
> worked for me in past.
> 
> Loading de4x5 causes the machine to hang immediately. It hangs at 
> synchronize_irq() call from de4x5_interrupt(). Commenting out this allows the 
> driver to work. Without SMP, synchronize_irq() is redefined to barrier() so 
> it works.
> 
> I don't have a clue how to fix this properly - does anyone know?

This driver is an enormous mess.

Someone half-converted the driver over to use a spinlock to protect
the interrupt handler and other parts of the driver, but that
conversion is so obvsiously buggy that I can't see how it was
ever tested.

All of the tests on lp->interrupt are racy, nothing protects the
setting and testing of that value.  It is set with lp->lock held
but tested asynchronously by the driver's ->ndo_start_xmit
method.

It uses this value to determine if it should queue the packet into
a software queue that gets processed at the end of the interrupt
processing.

Problem is, that code path deadlocks, the end of de4x5_interrupt
pulls the packets out of that queue in a loop, and sends them
to the function named de4x5_queue_pkt().

Which tries to take the lp->lock spinlock, which is already held
by de4x5_interrupt().

This driver needs major surgery to get into a working state on
SMP.

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2010-09-25  4:26 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-09-21 20:30 de4x5 hangs with SMP: synchronize_irq() in interrupt handler? Ondrej Zary
2010-09-25  4:27 ` David Miller

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).