public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* amd5536udc interrupts bug
@ 2009-01-07 23:10 Vadim Lobanov
  2009-01-08  2:32 ` Robert Hancock
  0 siblings, 1 reply; 16+ messages in thread
From: Vadim Lobanov @ 2009-01-07 23:10 UTC (permalink / raw)
  To: thomas.dahlmann; +Cc: linux-kernel

Hello,

>From perusing the code and playing with the module, it seems to me that 
the amd5536udc driver's handling of interrupts is currently "bustificated".

The long story:

During the amd5536udc initialization sequence within udc_pci_probe(), 
the code attempts to request a shared irq for the device thusly:
	request_irq(pdev->irq, udc_irq, IRQF_SHARED, name, dev)
where 'dev' is the internal state structure. By the time this call is made, 
the 'dev' structure is still not fully initialized and contains blank/zero 
data for many of the fields, in particular both 'dev->lock' and 'dev->regs' 
which are both clearly used within the udc_irq() handler. Those get 
initialized a bit later, namely inside the udc_probe() call at the bottom of 
udc_pci_probe().

It is my understanding that a handler for a shared interrupt can be 
invoked at any time after the corresponding request_irq() call is made, 
simply because some other device on the same interrupt may already 
be active. This leaves us with a very noticeable race condition, where 
udc_irq() can be invoked with uninitialized 'dev' data.

In particular, this effect is very noticeable when I try modprobing the 
amd5536udc driver on a kernel that is built with CONFIG_DEBUG_SHIRQ 
set. Given that the debug config option forces an invocation of the irq 
handler from within the request_irq() function, the immediate effect is a 
masterful kernel NULL-dereference OOPS within udc_irq().

The simple fix may be to say that amd5536udc does not support shared 
irqs, and to remove the IRQF_SHARED flag from the request_irq() call. A 
more complicated fix may be to try to shuffle all the code around to 
make sure that 'dev' is fully initialized before we request the irq, but I 
don't understand the code well enough (yet) to comfortably do this.

Comments? Thoughts?

On a side note, it occurs to me that the CONFIG_DEBUG_SHIRQ option 
went into the kernel a bit less than two years ago, and that it exposes a 
very immediate and reproducible OOPS in this driver. Does this mean 
that noone uses the 5536 UDC functionality with any recent kernels? 
Should I be worried? :)

-- Vadim Lobanov


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

end of thread, other threads:[~2009-01-19 12:24 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <49661E83.2070703@arcor.de>
2009-01-08 16:40 ` amd5536udc interrupts bug Thomas Dahlmann
2009-01-08 18:27   ` Vadim Lobanov
2009-01-09  2:02   ` Vadim Lobanov
2009-01-09 11:41     ` Thomas Dahlmann
2009-01-09 22:40       ` Vadim Lobanov
2009-01-10 20:28         ` Thomas Dahlmann
2009-01-12 19:02           ` Vadim Lobanov
2009-01-13 19:19           ` Vadim Lobanov
2009-01-14 12:43             ` Thomas Dahlmann
2009-01-14 22:49               ` Vadim Lobanov
2009-01-15  9:26                 ` Thomas Dahlmann
2009-01-17  0:17                   ` Vadim Lobanov
2009-01-19 12:23                     ` Thomas Dahlmann
2009-01-07 23:10 Vadim Lobanov
2009-01-08  2:32 ` Robert Hancock
2009-01-08  3:30   ` Vadim Lobanov

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox