I'm getting various oopses in 2.6 due to actconfig being NULL
unexpectedly in devio.c, namely in these releaseintf and findintif:
static int releaseintf(struct dev_state *ps, unsigned int intf)
{
struct usb_device *dev;
struct usb_interface *iface;
int err;
if (intf >= 8*sizeof(ps->ifclaimed))
return -EINVAL;
err = -EINVAL;
dev = ps->dev;
down(&dev->serialize);
if (test_and_clear_bit(intf, &ps->ifclaimed)) {
iface = dev->actconfig->interface[intf]; <== actconfig is NULL
usb_driver_release_interface(&usbdevfs_driver, iface);
err = 0;
}
up(&dev->serialize);
return err;
}
static int findintfif(struct usb_device *dev, unsigned int ifn)
{
unsigned int i, j;
struct usb_interface *iface;
struct usb_host_interface *alts;
if (ifn & ~0xff)
return -EINVAL;
for (i = 0; i < dev->actconfig->desc.bNumInterfaces; i++) { <= actconfig is
NULL
iface = dev->actconfig->interface[i];
for (j = 0; j < iface->num_altsetting; j++) {
alts = &iface->altsetting[j];
if (alts->desc.bInterfaceNumber == ifn)
return i;
}
}
return -ENOENT;
}
Unable to handle kernel NULL pointer dereference at virtual address 0000000c
printing eip:
e0bfaa5a
*pde = 00000000
Oops: 0000 [#1]
CPU: 0
EIP: 0060:[<e0bfaa5a>] Not tainted
EFLAGS: 00010286
EIP is at releaseintf+0x7a/0xa0 [usbcore]
eax: 00000000 ebx: d92d2c1c ecx: d92d2c1c edx: daae3f38
esi: d92d2bf8 edi: 00000000 ebp: db2f7ecc esp: db2f7eb4
ds: 007b es: 007b ss: 0068
Process modem_run (pid: 3791, threadinfo=db2f6000 task=d9010960)
Stack: e0c0180c 00000077 ffffffea 00000000 daae3f38 dffc6194 db2f7ef8 e0bfb173
daae3f38 00000000 c0177993 c3b59000 dffccf78 00000282 db3e5f60 db3e5f60
00000000 db2f7f1c c01779ec db2afe3c db3e5f60 db2afe3c db290f38 db3e5f60
Call Trace:
[<e0bfb173>] usbdev_release+0x1c3/0x220 [usbcore]
[<c0177993>] __fput+0xb3/0x120
[<c01779ec>] __fput+0x10c/0x120
[<c01759a7>] filp_close+0x57/0x80
[<c012a3f7>] put_files_struct+0x67/0xd0
[<c012b728>] do_exit+0x2b8/0x970
[<c0297727>] sys_socketcall+0x167/0x290
[<c012be90>] do_group_exit+0x40/0x220
[<c010a3af>] syscall_call+0x7/0xb
Code: 8b 44 b8 0c c7 04 24 60 ba c0 e0 89 44 24 04 e8 b2 2c ff ff
Unable to handle kernel NULL pointer dereference at virtual address 00000004
printing eip:
e0bfabd5
*pde = 00000000
Oops: 0000 [#1]
CPU: 0
EIP: 0060:[<e0bfabd5>] Not tainted
EFLAGS: 00010246
EIP is at findintfif+0x25/0x70 [usbcore]
eax: 00000000 ebx: dba45f38 ecx: fffffff2 edx: 00000002
esi: ffffffea edi: 00000000 ebp: dbe51ef4 esp: dbe51ee0
ds: 007b es: 007b ss: 0068
Process modem_run (pid: 3612, threadinfo=dbe50000 task=dbe02960)
Stack: 00000000 e0bfacc3 dba45f38 8004550f dba45f40 dbe51f08 e0bfd0cc db92fbf8
00000002 dba45f38 dbe51f58 e0bfdcfe dba45f38 bffff924 ffffffe7 dffc6194
dbe51f4c c0196763 d92f4f38 c037d2b0 c0177993 dc7b6000 dffccf78 00000292
Call Trace:
[<e0bfacc3>] usbdev_open+0x23/0x310 [usbcore]
[<e0bfd0cc>] proc_claiminterface+0x2c/0x50 [usbcore]
[<e0bfdcfe>] usbdev_ioctl+0x36e/0x3a0 [usbcore]
[<c0196763>] dput+0x23/0x6f0
[<c0177993>] __fput+0xb3/0x120
[<c0190365>] file_ioctl+0x65/0x1d0
[<c01906f0>] sys_ioctl+0x220/0x3f0
[<c017692f>] sys_read+0x3f/0x60
[<c010a3af>] syscall_call+0x7/0xb
Code: 0f b6 50 04 39 d7 73 30 89 55 f0 8b 44 b8 0c 31 c9 8b 58 08
The first oops occurs always at system shutdown. The second oops occurs
sometimes at system startup. I can "fix" the first one by replacing
down(&dev->serialize);
with
lock_kernel();
and
up(&dev->serialize);
with
unlock_kernel();
in releasintf. The logic here is that although usbdev_release takes the BKL,
it can lose it while sleeping in the down(&dev->serialize) in releaseintf,
which is not what is intended I guess (and since it eliminates the first oops,
there must be some truth to this theory). However things are more complicated
because usb_driver_release_interface(&usbdevfs_driver, iface) can also sleep,
which might also cause problems. I haven't analysed this yet. Maybe this
change also fixed the second oops, but since that one only occurs about one
time in four, it is hard to be sure.
I will of course look into this further, but I thought I would mention it now in
case anyone has any ideas.
Ciao,
Duncan.
-------------------------------------------------------
This SF.Net email sponsored by: ApacheCon 2003,
16-19 November in Las Vegas. Learn firsthand the latest
developments in Apache, PHP, Perl, XML, Java, MySQL,
WebDAV, and more! http://www.apachecon.com/
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel