[PATCH 1/5] check for proper registration with device core
Russell King
rmk+pcmcia at arm.linux.org.uk
Tue May 11 23:49:05 BST 2004
On Tue, May 11, 2004 at 09:28:29PM +0200, Dominik Brodowski wrote:
> Fail if registration of socket with driver core failed. This is necessary
> so that socket-related sysfs entries will appear always if a socket thread
> is up and running.
Ok, if we're going to make this change, I want to hear _success_ reports
for each of the following cases (and I shall be ticking them off):
- non-modular, pcmcia card in socket during boot
- non-modular, pcmcia card inserted after boot
- non-modular, cardbus card in socket during boot
- non-modular, cardbus card inserted after boot
- modular, pcmcia card in socket during boot/module insertion
- modular, pcmcia card inserted after boot/module insertion
- modular, cardbus card in socket during boot/module insertion
- modular, cardbus card inserted after boot/module insertion
In the past, we've had _lots_ of problems with this and I want to make
reasonably sure that we don't re-introduce either the PCMCIA vs SYSFS
deadlocks or the PCMCIA card initialisation race condition.
Here's the original problem:
http://lists.infradead.org/pipermail/linux-pcmcia/2003-September/000232.html
and the fix for this was to introduce skt_sem into pcmcia_register_client
(cs.c 1.58). However, this promptly caused the following deadlock:
insmod D C003AC98 28008860 446 422 (NOTLB)
[<c003a9fc>] (schedule+0x0/0x368)
[<c002b4a0>] (__down+0x0/0x108)
[<bf0059bc>] (pcmcia_register_client+0x0/0x288 [pcmcia_core])
[<bf012458>] (pcmcia_bus_add_socket+0x0/0x168 [ds])
[<c00f5c48>] (class_device_add+0x0/0x10c)
[<bf00395c>] (pcmcia_register_socket+0x0/0x160 [pcmcia_core])
[<bf016558>] (yenta_probe+0x0/0x238 [yenta_socket])
[<c00cbc14>] (pci_device_probe_static+0x0/0x68)
[<c00cbd64>] (__pci_device_probe+0x0/0x58)
[<c00cbdbc>] (pci_device_probe+0x0/0x44)
[<c00f50b8>] (bus_match+0x0/0x70)
[<c00f51b8>] (driver_attach+0x0/0x80)
[<c00f53d0>] (bus_add_driver+0x0/0x84)
[<c00f5710>] (driver_register+0x0/0x40)
[<c00cc018>] (pci_register_driver+0x0/0x88)
[<c0053a00>] (sys_init_module+0x0/0x308)
pccardd D C003AC98 4290282060 448 1 418 (L-TLB)
[<c003a9fc>] (schedule+0x0/0x368)
[<c00c3de8>] (__down_write+0x0/0x98)
[<c00f52e0>] (bus_add_device+0x0/0x7c)
[<c00f4454>] (device_add+0x0/0xe4)
[<c00c8800>] (pci_bus_add_devices+0x0/0xf4)
[<bf0092e8>] (cb_alloc+0x0/0xd0 [pcmcia_core])
[<bf0042b0>] (socket_insert+0x0/0x1ec [pcmcia_core])
[<bf004694>] (socket_detect_change+0x0/0x90 [pcmcia_core])
[<bf004724>] (pccardd+0x0/0x178 [pcmcia_core])
The insmod process has inserted yenta. Since it's a PCI driver, the
pci_bus_type semaphore is locked while the driver initialises. It
called pcmcia_register_socket, which in turn has called class_device_add.
This passed control over to ds which registered itself as a client for
the socket, sleeping on skt->sem.
Meanwhile, pccardd was spawned, and successfully claimed skt->sem. It
found a cardbus card in the socket, and attempted to register it with
the PCI subsystem. The PCI subsystem tried to take the pci_bus_type
semaphore.
*DEADLOCK*.
I want to be sure that we're not introducing a deadlock like this in
with a change which alters the initialisation behaviour.
--
Russell King
Linux kernel 2.6 ARM Linux - http://www.arm.linux.org.uk/
maintainer of: 2.6 PCMCIA - http://pcmcia.arm.linux.org.uk/
2.6 Serial core
More information about the linux-pcmcia
mailing list