On Fri, 19 Mar 2004, Matthias Andree wrote:

> > On Thu, 18 Mar 2004, David Brownell wrote:
> > 
> > > Software that tries to change the device configuration would
> > > certainly cause lots of hotplugging.  Basically that's a bad
> > > idea.  There's a call to just _reset_ the configuration, that
> > > verges on reasonable ... for devices that only have a single
> > > driver on the device interfaces.

The problem is that usb_reset_configuration is so new that it's not 
exported to user programs via usbfs or libusb.  There's one possible 
solution in the patch below: Make the set_configuration call in usbfs do 
reset_configuration instead if the new config is the same as the existing 
one.

> I believe I've identified the trigger of the problem. Log attached
> (Linux 2.6), with usb.agent running with "set -x".
> 
> I don't understand why this hotplug version executes several processes
> of usb.agent for the same device at the same time, but that's probably
> off-topic for this list.

They are started at different times (all within a very short period), but
usb.agent includes a 3-second delay so they end up overlapping.  Each time 
usb_set_configuration is called, it generates a pair of hotplug events.  
And something is calling it several times within a single second.

> Hotplug's usb.agent runs usbmodules, and just sampling one of the
> usbmodules invocations from the log and feeding them through strace
> yields:
> 
> ...
> close(3)                                = 0
> munmap(0x40016000, 4096)                = 0
> open("/proc/bus/usb/003/002", O_RDWR)   = 3
> ioctl(3, USBDEVFS_CONTROL, 0xbfffefb0)  = 18
> ioctl(3, USBDEVFS_CONTROL, 0xbfffeb70)  = 9
> ioctl(3, USBDEVFS_CONTROL, 0xbfffeb70)  = 32
> close(3)                                = 0
> exit_group(0)                           = ?
> 
> So we do know that usbmodules run on behalf of hotplug issues
> USBDEVFS_CONTROL.

It sure looks as though usbmodules could stand a little rewriting.  The 
18-byte call is Get_Device_Descriptor, and the 9- and 32-byte calls are 
Get_Configuration_Descriptor.  All that information is already available 
through usbfs and sysfs; there's no reason at all to do I/O with the 
device.  Furthermore the timeouts are ridiculously low, but maybe that's 
been changed in a more recent version of the hotplug package.

Matthias, try using the patch below in place of the ones I sent earlier.  
It replaces the set_configuration call that's starting all the hotplug 
activity with reset_configuration, and it logs the pid and name of the 
process issuing the call so we can tell what program is the guilty party.

Alan Stern


===== devio.c 1.88 vs edited =====
--- 1.88/drivers/usb/core/devio.c       Wed Mar 17 14:16:46 2004
+++ edited/drivers/usb/core/devio.c     Fri Mar 19 10:41:57 2004
@@ -751,9 +751,15 @@
 {
        unsigned int u;
 
+       printk(KERN_DEBUG "usbfs: proc_setconfig: pid %d, %s\n",
+                       current->pid, current->comm);
        if (get_user(u, (unsigned int __user *)arg))
                return -EFAULT;
-       return usb_set_configuration(ps->dev, u);
+       if (ps->dev->actconfig &&
+                       ps->dev->actconfig->desc.bConfigurationValue == u)
+               return usb_reset_configuration(ps->dev);
+       else
+               return usb_set_configuration(ps->dev, u);
 }
 
 static int proc_submiturb(struct dev_state *ps, void __user *arg)



-------------------------------------------------------
This SF.Net email is sponsored by: IBM Linux Tutorials
Free Linux tutorial presented by Daniel Robbins, President and CEO of
GenToo technologies. Learn everything from fundamentals to system
administration.http://ads.osdn.com/?ad_id=1470&alloc_id=3638&op=click
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to