On Thu, 2007-05-10 at 14:06 +0800, Zhang, Yanmin wrote: > On Sun, 2007-05-06 at 16:00 +0100, Richard Kennedy wrote: > > On Fri, 2007-05-04 at 23:32 +0900, Komuro wrote: > > > On Thu, 03 May 2007 15:29:19 +0100 > > > Richard Kennedy <richard@xxxxxxxxxxxxxxx> wrote: > > > > > > > > > IDE bugs should be posted to the linux-ide mailing list. > > > > > > > > > > Hi all, > > > > I have a JVC MP-CDX1 cdrom drive that came with my laptop which used to > > > > work with ide-cs but stopped working with newer kernels. > > > > > > > > I added its ident to ide-cs.c (see patch below) and the drive now is > > > > detected and gets mounted when plugged in and seems to work correctly. > > > > > > > > But when I eject the card, pccardctl eject 0, the laptop locks up > > > > completely, there are no messages in the log, and the fan goes to full > > > > speed so I guess the cpu is running at 100%. > > > > Any ideas what's going wrong or how to debug it ? > > > > Is there anything else I need to patch to get this working ? > > > > > > > > Thanks > > > > Richard > > > > > > > > card info :- > > > > > > > > May 3 11:22:52 mininote kernel: pccard: PCMCIA card inserted into slot 0 > > > > May 3 11:22:52 mininote kernel: cs: memory probe 0xa0000000-0xa0ffffff: clean. > > > > May 3 11:22:52 mininote kernel: pcmcia: registering new device pcmcia0.0 > > > > May 3 11:22:53 mininote kernel: hdc: UJDB130, ATAPI CD/DVD-ROM drive > > > > May 3 11:22:53 mininote kernel: ide1 at 0x190-0x197,0x396 on irq 3 > > > > May 3 11:22:53 mininote kernel: ide-cs: hdc: Vpp = 0.0 > > > > May 3 11:22:54 mininote kernel: hdc: ATAPI 20X CD-ROM drive, 128kB Cache > > > > May 3 11:22:54 mininote kernel: Uniform CD-ROM driver Revision: 3.20 > > > > May 3 11:23:04 mininote hald: mounted /dev/hdc on behalf of uid 500 > > > > May 3 11:23:34 mininote hald: unmounted /dev/hdc from '/media/FC_4 i386 ftp #1' on behalf of uid 500 > > > > May 3 11:24:17 mininote kernel: pccard: card ejected from slot 0 > > > > << lockup happened here >> > > > I rebuilt the kernel with the lock dependency checking turned on, which > > shows up 2 problems (and also breaks the deadlock). > > > > kernel: pccard: card ejected from slot 0 > > kernel: > > > kernel: BUG: sleeping function called from invalid context at kernel/rwsem.c:20 > > kernel: in_atomic():0, irqs_disabled():1 > > kernel: INFO: lockdep is turned off. > > kernel: irq event stamp: 2258 > > kernel: hardirqs last enabled at (2257): [<c0462050>] kfree+0x78/0x7f > > kernel: hardirqs last disabled at (2258): [<c0600db5>] _spin_lock_irq+0xc/0x3a > > kernel: softirqs last enabled at (2252): [<c0406b41>] do_softirq+0x4d/0xb6 > > kernel: softirqs last disabled at (2243): [<c0406b41>] do_softirq+0x4d/0xb6 > > kernel: [<c042fda6>] down_read+0x15/0x4d > > kernel: [<c04e2498>] pci_get_subsys+0x68/0xea > > kernel: [<c04e2530>] pci_get_device+0x16/0x19 > > kernel: [<c054b6f6>] init_hwif_default+0x28/0xf0 > > kernel: [<c054c3d5>] ide_unregister+0x242/0x573 > > kernel: [<d7b68018>] ide_release+0x18/0x28 [ide_cs] > > kernel: [<d7b68030>] ide_detach+0x8/0x14 [ide_cs] > > kernel: [<c055cd0c>] pcmcia_device_remove+0x50/0xb5 > > kernel: [<c0543c50>] __device_release_driver+0x71/0x8e > > kernel: [<c05440a5>] device_release_driver+0x31/0x46 > > kernel: [<c0543678>] bus_remove_device+0x70/0x80 > > kernel: [<c0541d87>] device_del+0x162/0x1c6 > > kernel: [<c0541df3>] device_unregister+0x8/0x10 > > kernel: [<c055c95c>] pcmcia_card_remove+0x58/0x77 > > kernel: [<c055d4da>] ds_event+0x56/0x87 > > kernel: [<c04d5181>] kobject_get+0xf/0x13 > > kernel: [<c05590e2>] send_event+0x31/0x49 > > kernel: [<c05592c1>] socket_shutdown+0xc/0xb3 > > kernel: [<c0559384>] socket_remove+0x1c/0x26 > > kernel: [<c05593cd>] pcmcia_eject_card+0x3f/0x4c > > kernel: [<c055bcfc>] pccard_store_eject+0x1b/0x22 > > kernel: [<c055bce1>] pccard_store_eject+0x0/0x22 > > kernel: [<c054172b>] dev_attr_store+0x27/0x2c > > kernel: [<c049b74b>] sysfs_write_file+0xbf/0xe8 > > kernel: [<c049b68c>] sysfs_write_file+0x0/0xe8 > > kernel: [<c0465ef1>] vfs_write+0xa8/0x154 > > kernel: [<c0466430>] sys_write+0x41/0x67 > > kernel: [<c0404c1a>] sysenter_past_esp+0x5f/0x99 > > kernel: ======================= > Before calling init_hwif_default, ide_unregister gets lock ide_lock and disables irq. > init_hwif_default calls ide_default_io_base which calls pci_get_device and later > pci_get_subsys tries to apply for semaphore pci_bus_sem and goes to sleep. > > Mostly, pci_get_device should be called when irq is turned on. > > I still don't understand an issue. If you test it on a mobile, mostly, the process won't > sleep when applying for pci_bus_sem because there is no too many opportunities for 2 processes > to apply for the semaphore at the same time. > > As just needing know if pci is initiated, ide_default_io_base just needs find if list > pci_devices is empty. > > Could you try below patch against 2.6.21? > > Signed-off-by: Zhang Yanmin <yanmin.zhang@xxxxxxxxx> > > --- > > diff -Nraup linux-2.6.21/drivers/pci/probe.c linux-2.6.21_fix/drivers/pci/probe.c > --- linux-2.6.21/drivers/pci/probe.c 2007-05-10 11:35:06.000000000 +0800 > +++ linux-2.6.21_fix/drivers/pci/probe.c 2007-05-10 13:33:57.000000000 +0800 > @@ -22,6 +22,18 @@ EXPORT_SYMBOL(pci_root_buses); > > LIST_HEAD(pci_devices); > > +/* > + * Some device drivers need know if pci is initiated. > + * Basically, we think pci is not initiated when there > + * is no device in list of pci_devices. > + */ > +int no_pci_devices(void) > +{ > + return list_empty(&pci_devices); > +} > + > +EXPORT_SYMBOL(no_pci_devices); > + > #ifdef HAVE_PCI_LEGACY > /** > * pci_create_legacy_files - create legacy I/O port and memory files > diff -Nraup linux-2.6.21/include/asm-i386/ide.h linux-2.6.21_fix/include/asm-i386/ide.h > --- linux-2.6.21/include/asm-i386/ide.h 2007-02-05 02:44:54.000000000 +0800 > +++ linux-2.6.21_fix/include/asm-i386/ide.h 2007-05-10 13:15:57.000000000 +0800 > @@ -40,14 +40,13 @@ static __inline__ int ide_default_irq(un > > static __inline__ unsigned long ide_default_io_base(int index) > { > - struct pci_dev *pdev; > /* > * If PCI is present then it is not safe to poke around > * the other legacy IDE ports. Only 0x1f0 and 0x170 are > * defined compatibility mode ports for PCI. A user can > * override this using ide= but we must default safe. > */ > - if ((pdev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, NULL)) == NULL) { > + if (no_pci_devices()) { > switch(index) { > case 2: return 0x1e8; > case 3: return 0x168; > @@ -55,7 +54,6 @@ static __inline__ unsigned long ide_defa > case 5: return 0x160; > } > } > - pci_dev_put(pdev); > switch (index) { > case 0: return 0x1f0; > case 1: return 0x170; > diff -Nraup linux-2.6.21/include/linux/pci.h linux-2.6.21_fix/include/linux/pci.h > --- linux-2.6.21/include/linux/pci.h 2007-05-10 11:35:07.000000000 +0800 > +++ linux-2.6.21_fix/include/linux/pci.h 2007-05-10 13:33:43.000000000 +0800 > @@ -424,6 +424,8 @@ extern struct bus_type pci_bus_type; > * code, or pci core code. */ > extern struct list_head pci_root_buses; /* list of all known PCI buses */ > extern struct list_head pci_devices; /* list of all devices */ > +/* Some device drivers need know if pci is initiated */ > +extern int no_pci_devices(void); > > void pcibios_fixup_bus(struct pci_bus *); > int __must_check pcibios_enable_device(struct pci_dev *, int mask); > @@ -709,6 +711,7 @@ static inline struct pci_dev *pci_get_cl > { return NULL; } > > #define pci_dev_present(ids) (0) > +#define no_pci_devices() (1) > #define pci_find_present(ids) (NULL) > #define pci_dev_put(dev) do { } while (0) > Yes that works for me. there's no lockup, nothing unusual in the logs, and the CD works correctly. I didn't turn on the lock dependency checks, but I can if you think it will tell you anything useful. Cheers Richard - To unsubscribe from this list: send the line "unsubscribe linux-ide" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html