public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH 7/9] USB usbfs: destroy submitted urbs only on the disconnected interface
@ 2004-04-14 10:45 Duncan Sands
  2004-04-14 13:30 ` [linux-usb-devel] " Oliver Neukum
  2004-04-14 16:48 ` Alan Stern
  0 siblings, 2 replies; 18+ messages in thread
From: Duncan Sands @ 2004-04-14 10:45 UTC (permalink / raw)
  To: Greg KH; +Cc: linux-usb-devel, linux-kernel, Frederic Detienne

The remaining three patches contain miscellaneous fixes to usbfs.
This one fixes up the disconnect callback to only shoot down urbs
on the disconnected interface, and not on all interfaces.  It also adds
a sanity check (this check is pointless because the interface could
never have been claimed in the first place if it failed, but I feel better
having it there).

 devio.c |    6 ++++--
 1 files changed, 4 insertions(+), 2 deletions(-)


diff -Nru a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c
--- a/drivers/usb/core/devio.c	Wed Apr 14 12:18:20 2004
+++ b/drivers/usb/core/devio.c	Wed Apr 14 12:18:20 2004
@@ -341,6 +341,7 @@
 static void driver_disconnect(struct usb_interface *intf)
 {
 	struct dev_state *ps = usb_get_intfdata (intf);
+	unsigned int ifnum = intf->altsetting->desc.bInterfaceNumber;
 
 	if (!ps)
 		return;
@@ -349,11 +350,12 @@
 	 * all pending I/O requests; 2.6 does that.
 	 */
 
-	clear_bit(intf->cur_altsetting->desc.bInterfaceNumber, &ps->ifclaimed);
+	if (ifnum < 8*sizeof(ps->ifclaimed))
+		clear_bit(ifnum, &ps->ifclaimed);
 	usb_set_intfdata (intf, NULL);
 
 	/* force async requests to complete */
-	destroy_all_async (ps);
+	destroy_async_on_interface(ps, ifnum);
 }
 
 struct usb_driver usbdevfs_driver = {

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

* Re: [linux-usb-devel] [PATCH 7/9] USB usbfs: destroy submitted urbs only on the disconnected interface
  2004-04-14 10:45 [PATCH 7/9] USB usbfs: destroy submitted urbs only on the disconnected interface Duncan Sands
@ 2004-04-14 13:30 ` Oliver Neukum
  2004-04-14 13:38   ` Duncan Sands
  2004-04-14 15:00   ` Duncan Sands
  2004-04-14 16:48 ` Alan Stern
  1 sibling, 2 replies; 18+ messages in thread
From: Oliver Neukum @ 2004-04-14 13:30 UTC (permalink / raw)
  To: Duncan Sands, Greg KH; +Cc: linux-usb-devel, linux-kernel, Frederic Detienne

Am Mittwoch, 14. April 2004 12:45 schrieb Duncan Sands:
> The remaining three patches contain miscellaneous fixes to usbfs.
> This one fixes up the disconnect callback to only shoot down urbs
> on the disconnected interface, and not on all interfaces.  It also adds
> a sanity check (this check is pointless because the interface could
> never have been claimed in the first place if it failed, but I feel better
> having it there).

Well, I don't. If you care about it, add a WARN_ON().
Checking without consequences is bad.

	Regards
		Oliver


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

* Re: [linux-usb-devel] [PATCH 7/9] USB usbfs: destroy submitted urbs only on the disconnected interface
  2004-04-14 13:30 ` [linux-usb-devel] " Oliver Neukum
@ 2004-04-14 13:38   ` Duncan Sands
  2004-04-14 15:00   ` Duncan Sands
  1 sibling, 0 replies; 18+ messages in thread
From: Duncan Sands @ 2004-04-14 13:38 UTC (permalink / raw)
  To: Oliver Neukum, Greg KH; +Cc: linux-usb-devel, linux-kernel, Frederic Detienne

On Wednesday 14 April 2004 15:30, Oliver Neukum wrote:
> Am Mittwoch, 14. April 2004 12:45 schrieb Duncan Sands:
> > The remaining three patches contain miscellaneous fixes to usbfs.
> > This one fixes up the disconnect callback to only shoot down urbs
> > on the disconnected interface, and not on all interfaces.  It also adds
> > a sanity check (this check is pointless because the interface could
> > never have been claimed in the first place if it failed, but I feel
> > better having it there).
>
> Well, I don't. If you care about it, add a WARN_ON().
> Checking without consequences is bad.

If the check fails then you are scribbling over kernel memory.  So the
consequences of the check failing are bad.  Also, it is in a slow path.
Thus I prefer to have the check even if it is supposed to never fail.  I
agree that a message should also be output.

Duncan.

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

* Re: [linux-usb-devel] [PATCH 7/9] USB usbfs: destroy submitted urbs only on the disconnected interface
  2004-04-14 13:30 ` [linux-usb-devel] " Oliver Neukum
  2004-04-14 13:38   ` Duncan Sands
@ 2004-04-14 15:00   ` Duncan Sands
  2004-04-14 15:33     ` Oliver Neukum
  1 sibling, 1 reply; 18+ messages in thread
From: Duncan Sands @ 2004-04-14 15:00 UTC (permalink / raw)
  To: Oliver Neukum, Greg KH; +Cc: linux-usb-devel, linux-kernel, Frederic Detienne

On Wednesday 14 April 2004 15:30, Oliver Neukum wrote:
> Am Mittwoch, 14. April 2004 12:45 schrieb Duncan Sands:
> > The remaining three patches contain miscellaneous fixes to usbfs.
> > This one fixes up the disconnect callback to only shoot down urbs
> > on the disconnected interface, and not on all interfaces.  It also adds
> > a sanity check (this check is pointless because the interface could
> > never have been claimed in the first place if it failed, but I feel
> > better having it there).
>
> Well, I don't. If you care about it, add a WARN_ON().
> Checking without consequences is bad.

Hi Oliver, how about this instead?

--- gregkh-2.6/drivers/usb/core/devio.c.orig	2004-04-14 16:02:44.000000000 +0200
+++ gregkh-2.6/drivers/usb/core/devio.c	2004-04-14 16:57:15.000000000 +0200
@@ -335,6 +341,7 @@
 static void driver_disconnect(struct usb_interface *intf)
 {
 	struct dev_state *ps = usb_get_intfdata (intf);
+	unsigned int ifnum = intf->altsetting->desc.bInterfaceNumber;
 
 	if (!ps)
 		return;
@@ -343,13 +350,15 @@
 	 * all pending I/O requests; 2.6 does that.
 	 */
 
-	/* prevent new I/O requests */
-	ps->dev = 0;
-	clear_bit(intf->cur_altsetting->desc.bInterfaceNumber, &ps->ifclaimed);
+	if (ifnum < 8*sizeof(ps->ifclaimed))
+		clear_bit(ifnum, &ps->ifclaimed);
+	else
+		warn("interface number %u out of range", ifnum);
+
 	usb_set_intfdata (intf, NULL);
 
 	/* force async requests to complete */
-	destroy_all_async (ps);
+	destroy_async_on_interface(ps, ifnum);
 }
 
 struct usb_driver usbdevfs_driver = {

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

* Re: [linux-usb-devel] [PATCH 7/9] USB usbfs: destroy submitted urbs only on the disconnected interface
  2004-04-14 15:00   ` Duncan Sands
@ 2004-04-14 15:33     ` Oliver Neukum
  2004-04-14 15:39       ` Duncan Sands
  0 siblings, 1 reply; 18+ messages in thread
From: Oliver Neukum @ 2004-04-14 15:33 UTC (permalink / raw)
  To: Duncan Sands, Greg KH; +Cc: linux-usb-devel, linux-kernel, Frederic Detienne


> > Well, I don't. If you care about it, add a WARN_ON().
> > Checking without consequences is bad.
>
> Hi Oliver, how about this instead?
>
[..]
> -	clear_bit(intf->cur_altsetting->desc.bInterfaceNumber, &ps->ifclaimed);
> +	if (ifnum < 8*sizeof(ps->ifclaimed))
> +		clear_bit(ifnum, &ps->ifclaimed);
> +	else
> +		warn("interface number %u out of range", ifnum);
> +

I would prefer a real WARN_ON() so that the imbedded people compiling
for size are not affected.

	Regards
		Oliver


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

* Re: [linux-usb-devel] [PATCH 7/9] USB usbfs: destroy submitted urbs only on the disconnected interface
  2004-04-14 15:33     ` Oliver Neukum
@ 2004-04-14 15:39       ` Duncan Sands
  2004-04-14 20:39         ` Oliver Neukum
  0 siblings, 1 reply; 18+ messages in thread
From: Duncan Sands @ 2004-04-14 15:39 UTC (permalink / raw)
  To: Oliver Neukum, Greg KH; +Cc: linux-usb-devel, linux-kernel, Frederic Detienne

On Wednesday 14 April 2004 17:33, Oliver Neukum wrote:
> > > Well, I don't. If you care about it, add a WARN_ON().
> > > Checking without consequences is bad.
> >
> > Hi Oliver, how about this instead?
>
> [..]
>
> > -	clear_bit(intf->cur_altsetting->desc.bInterfaceNumber, &ps->ifclaimed);
> > +	if (ifnum < 8*sizeof(ps->ifclaimed))
> > +		clear_bit(ifnum, &ps->ifclaimed);
> > +	else
> > +		warn("interface number %u out of range", ifnum);
> > +
>
> I would prefer a real WARN_ON() so that the imbedded people compiling
> for size are not affected.

What do you mean?  How is a real WARN_ON() better?

Duncan.

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

* Re: [linux-usb-devel] [PATCH 7/9] USB usbfs: destroy submitted urbs only on the disconnected interface
  2004-04-14 10:45 [PATCH 7/9] USB usbfs: destroy submitted urbs only on the disconnected interface Duncan Sands
  2004-04-14 13:30 ` [linux-usb-devel] " Oliver Neukum
@ 2004-04-14 16:48 ` Alan Stern
  2004-04-14 17:09   ` Duncan Sands
  2004-04-17 18:31   ` Duncan Sands
  1 sibling, 2 replies; 18+ messages in thread
From: Alan Stern @ 2004-04-14 16:48 UTC (permalink / raw)
  To: Duncan Sands; +Cc: Greg KH, linux-usb-devel, linux-kernel, Frederic Detienne

On Wed, 14 Apr 2004, Duncan Sands wrote:

> diff -Nru a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c
> --- a/drivers/usb/core/devio.c	Wed Apr 14 12:18:20 2004
> +++ b/drivers/usb/core/devio.c	Wed Apr 14 12:18:20 2004
> @@ -341,6 +341,7 @@
>  static void driver_disconnect(struct usb_interface *intf)
>  {
>  	struct dev_state *ps = usb_get_intfdata (intf);
> +	unsigned int ifnum = intf->altsetting->desc.bInterfaceNumber;
>  
>  	if (!ps)
>  		return;
> @@ -349,11 +350,12 @@
>  	 * all pending I/O requests; 2.6 does that.
>  	 */
>  
> -	clear_bit(intf->cur_altsetting->desc.bInterfaceNumber, &ps->ifclaimed);
> +	if (ifnum < 8*sizeof(ps->ifclaimed))
> +		clear_bit(ifnum, &ps->ifclaimed);
>  	usb_set_intfdata (intf, NULL);
>  
>  	/* force async requests to complete */
> -	destroy_all_async (ps);
> +	destroy_async_on_interface(ps, ifnum);
>  }
>  
>  struct usb_driver usbdevfs_driver = {


Quite apart from the stylistic questions about sanity tests and so on, 
this code contains a bug.  It wasn't introduced by your patch; it was 
there from before and I should have caught it earlier, along with a few 
others.

The real problem is that the code in devio.c doesn't make a clear visual
distinction between interface number (i.e., desc.bInterfaceNumber) and
interface index (i.e., dev->actconfig->interface[index]).  The two values
do not have to agree.

The claimintf(), releaseintf(), and checkintf() routines take an index as
argument, and the ifclaimed bitvector uses the same index.  findintfif()
takes a number and returns the corresponding index, duplicating much of
the functionality of usb_ifnum_to_if().  Likewise, findintfep() returns an 
index.

The code here in driver_disconnect() uses a number where it needs to use 
an index.

Similarly, there's a typo in proc_releaseinterface(); the second argument 
it passes to releaseintf() should be ret, not intf.

And in proc_submiturb(), the value stored in as->intf is an index when it 
should be an interface number.  Or possibly it could remain an index, but 
then the value passed to destroy_async_on_interface() by 
proc_releaseinterface() should be the index and not the number.

Alan Stern


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

* Re: [linux-usb-devel] [PATCH 7/9] USB usbfs: destroy submitted urbs only on the disconnected interface
  2004-04-14 16:48 ` Alan Stern
@ 2004-04-14 17:09   ` Duncan Sands
  2004-04-14 17:55     ` Alan Stern
  2004-04-17 18:31   ` Duncan Sands
  1 sibling, 1 reply; 18+ messages in thread
From: Duncan Sands @ 2004-04-14 17:09 UTC (permalink / raw)
  To: Alan Stern
  Cc: Greg KH, linux-usb-devel, linux-kernel, Frederic Detienne,
	David Brownell

> On Wed, 14 Apr 2004, Duncan Sands wrote:
> > diff -Nru a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c
> > --- a/drivers/usb/core/devio.c	Wed Apr 14 12:18:20 2004
> > +++ b/drivers/usb/core/devio.c	Wed Apr 14 12:18:20 2004
> > @@ -341,6 +341,7 @@
> >  static void driver_disconnect(struct usb_interface *intf)
> >  {
> >  	struct dev_state *ps = usb_get_intfdata (intf);
> > +	unsigned int ifnum = intf->altsetting->desc.bInterfaceNumber;
> >
> >  	if (!ps)
> >  		return;
> > @@ -349,11 +350,12 @@
> >  	 * all pending I/O requests; 2.6 does that.
> >  	 */
> >
> > -	clear_bit(intf->cur_altsetting->desc.bInterfaceNumber, &ps->ifclaimed);
> > +	if (ifnum < 8*sizeof(ps->ifclaimed))
> > +		clear_bit(ifnum, &ps->ifclaimed);
> >  	usb_set_intfdata (intf, NULL);
> >
> >  	/* force async requests to complete */
> > -	destroy_all_async (ps);
> > +	destroy_async_on_interface(ps, ifnum);
> >  }
> >
> >  struct usb_driver usbdevfs_driver = {
>
> Quite apart from the stylistic questions about sanity tests and so on,
> this code contains a bug.  It wasn't introduced by your patch; it was
> there from before and I should have caught it earlier, along with a few
> others.

Hi Alan, it was introduced after your last devio.c fixes by the patch
"fix xsane breakage, hangs on device scan at launch" by someone
who will remain nameless :)

> The real problem is that the code in devio.c doesn't make a clear visual
> distinction between interface number (i.e., desc.bInterfaceNumber) and
> interface index (i.e., dev->actconfig->interface[index]).  The two values
> do not have to agree.
>
> The claimintf(), releaseintf(), and checkintf() routines take an index as
> argument, and the ifclaimed bitvector uses the same index.  findintfif()
> takes a number and returns the corresponding index, duplicating much of
> the functionality of usb_ifnum_to_if().  Likewise, findintfep() returns an
> index.
>
> The code here in driver_disconnect() uses a number where it needs to use
> an index.
>
> Similarly, there's a typo in proc_releaseinterface(); the second argument
> it passes to releaseintf() should be ret, not intf.
>
> And in proc_submiturb(), the value stored in as->intf is an index when it
> should be an interface number.  Or possibly it could remain an index, but
> then the value passed to destroy_async_on_interface() by
> proc_releaseinterface() should be the index and not the number.

Good catch!  I guess the index and the interface differ because interfaces are
not always consecutively numbered.  Is that right?  When can it happen?

Thanks,

Duncan.

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

* Re: [linux-usb-devel] [PATCH 7/9] USB usbfs: destroy submitted urbs only on the disconnected interface
  2004-04-14 17:09   ` Duncan Sands
@ 2004-04-14 17:55     ` Alan Stern
  0 siblings, 0 replies; 18+ messages in thread
From: Alan Stern @ 2004-04-14 17:55 UTC (permalink / raw)
  To: Duncan Sands
  Cc: Greg KH, linux-usb-devel, linux-kernel, Frederic Detienne,
	David Brownell

On Wed, 14 Apr 2004, Duncan Sands wrote:

> > Quite apart from the stylistic questions about sanity tests and so on,
> > this code contains a bug.  It wasn't introduced by your patch; it was
> > there from before and I should have caught it earlier, along with a few
> > others.
> 
> Hi Alan, it was introduced after your last devio.c fixes by the patch
> "fix xsane breakage, hangs on device scan at launch" by someone
> who will remain nameless :)

Okay, that's a relief.  Of course there's still the other two places.  I 
did check for such things a while back, but apparently I forgot to look at 
all occurrences of "ifclaimed".


> > Similarly, there's a typo in proc_releaseinterface(); the second argument
> > it passes to releaseintf() should be ret, not intf.
> >
> > And in proc_submiturb(), the value stored in as->intf is an index when it
> > should be an interface number.  Or possibly it could remain an index, but
> > then the value passed to destroy_async_on_interface() by
> > proc_releaseinterface() should be the index and not the number.
> 
> Good catch!  I guess the index and the interface differ because interfaces are
> not always consecutively numbered.  Is that right?  When can it happen?

Yes.  Actually I spoke too strongly before; these aren't bugs, just things 
that need to be changed.

Right now the configuration parsing code doesn't allow devices to have
interfaces that aren't numbered consecutively starting from 0, so there's
no problem.  But I'm trying to update all the USB drivers to eliminate
such assumptions about device sanity.  When that's done we will accept
funny interface numbers.  There's a surprisingly large number of devices
that number their interfaces starting from 1, and we should be able to
handle them correctly.

Anyway, if you would like to fix these issues, my suggestion is to adopt a 
variable-name scheme that makes it clear which things are interface 
numbers and which are interface indices.  (I don't want to go so far as to 
advocate Hungarian notation, but the concept of using part of a variable's 
name to indicate its type goes back at least to early Fortran with its 
"names starting with letters from I-N are integers" convention.)

Alan Stern


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

* Re: [linux-usb-devel] [PATCH 7/9] USB usbfs: destroy submitted urbs only on the disconnected interface
  2004-04-14 15:39       ` Duncan Sands
@ 2004-04-14 20:39         ` Oliver Neukum
  2004-04-15  8:05           ` Duncan Sands
  0 siblings, 1 reply; 18+ messages in thread
From: Oliver Neukum @ 2004-04-14 20:39 UTC (permalink / raw)
  To: Duncan Sands, Greg KH; +Cc: linux-usb-devel, linux-kernel, Frederic Detienne


> > I would prefer a real WARN_ON() so that the imbedded people compiling
> > for size are not affected.
>
> What do you mean?  How is a real WARN_ON() better?

WARN_ON can be defined away to make a smaller kernel. Code that does
not use it takes away that option.

	Regards
		Oliver


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

* Re: [linux-usb-devel] [PATCH 7/9] USB usbfs: destroy submitted urbs only on the disconnected interface
  2004-04-14 20:39         ` Oliver Neukum
@ 2004-04-15  8:05           ` Duncan Sands
  2004-04-15  8:31             ` Oliver Neukum
  0 siblings, 1 reply; 18+ messages in thread
From: Duncan Sands @ 2004-04-15  8:05 UTC (permalink / raw)
  To: Oliver Neukum, Greg KH; +Cc: linux-usb-devel, linux-kernel, Frederic Detienne

On Wednesday 14 April 2004 22:39, Oliver Neukum wrote:
> > > I would prefer a real WARN_ON() so that the imbedded people compiling
> > > for size are not affected.
> >
> > What do you mean?  How is a real WARN_ON() better?
>
> WARN_ON can be defined away to make a smaller kernel. Code that does
> not use it takes away that option.

Hi Oliver, I thought you meant that CONFIG_EMBEDDED made WARN_ON go away
(or something like that).  If you just mean that it is easy to redefine WARN_ON by
hand, then all I can say is: it is also easy to redefine warn by hand!  Anyway, I made
you the following patch:

--- gregkh-2.6/include/linux/usb.h.orig	2004-04-15 09:52:36.000000000 +0200
+++ gregkh-2.6/include/linux/usb.h	2004-04-15 09:56:30.000000000 +0200
@@ -1073,9 +1073,15 @@
 #define dbg(format, arg...) do {} while (0)
 #endif
 
-#define err(format, arg...) printk(KERN_ERR "%s: " format "\n" , __FILE__ , ## arg)
+#if !defined(CONFIG_EMBEDDED) || defined(DEBUG)
 #define info(format, arg...) printk(KERN_INFO "%s: " format "\n" , __FILE__ , ## arg)
 #define warn(format, arg...) printk(KERN_WARNING "%s: " format "\n" , __FILE__ , ## arg)
+#else
+#define info(format, arg...) do {} while (0)
+#define warn(format, arg...) do {} while (0)
+#endif
+
+#define err(format, arg...) printk(KERN_ERR "%s: " format "\n" , __FILE__ , ## arg)
 
 
 #endif  /* __KERNEL__ */

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

* Re: [linux-usb-devel] [PATCH 7/9] USB usbfs: destroy submitted urbs only on the disconnected interface
  2004-04-15  8:05           ` Duncan Sands
@ 2004-04-15  8:31             ` Oliver Neukum
  2004-04-15  8:47               ` Duncan Sands
  0 siblings, 1 reply; 18+ messages in thread
From: Oliver Neukum @ 2004-04-15  8:31 UTC (permalink / raw)
  To: Duncan Sands, Greg KH; +Cc: linux-usb-devel, linux-kernel, Frederic Detienne

Am Donnerstag, 15. April 2004 10:05 schrieb Duncan Sands:
> On Wednesday 14 April 2004 22:39, Oliver Neukum wrote:
> > > > I would prefer a real WARN_ON() so that the imbedded people compiling
> > > > for size are not affected.
> > >
> > > What do you mean?  How is a real WARN_ON() better?
> >
> > WARN_ON can be defined away to make a smaller kernel. Code that does
> > not use it takes away that option.
>
> Hi Oliver, I thought you meant that CONFIG_EMBEDDED made WARN_ON go away
> (or something like that).  If you just mean that it is easy to redefine
> WARN_ON by hand, then all I can say is: it is also easy to redefine warn by
> hand!  Anyway, I made you the following patch:

Yes, but I don't trust gcc to optimise away the 'if' if you redefine warn().

But there is another point. The embedded people deserve a single switch
to remove assertion checks. The purpose of macros like WARN_ON() is
easy and _central_ choice of debugging output vs. kernel size.

	Regards
		Oliver


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

* Re: [linux-usb-devel] [PATCH 7/9] USB usbfs: destroy submitted urbs only on the disconnected interface
  2004-04-15  8:31             ` Oliver Neukum
@ 2004-04-15  8:47               ` Duncan Sands
  2004-04-15  9:08                 ` Oliver Neukum
  0 siblings, 1 reply; 18+ messages in thread
From: Duncan Sands @ 2004-04-15  8:47 UTC (permalink / raw)
  To: Oliver Neukum, Greg KH; +Cc: linux-usb-devel, linux-kernel, Frederic Detienne

> > Hi Oliver, I thought you meant that CONFIG_EMBEDDED made WARN_ON go away
> > (or something like that).  If you just mean that it is easy to redefine
> > WARN_ON by hand, then all I can say is: it is also easy to redefine warn
> > by hand!  Anyway, I made you the following patch:
>
> Yes, but I don't trust gcc to optimise away the 'if' if you redefine
> warn().

The "if" cannot be optimized away for the case in point, because it
does something (clears the bit) if it passes the test.  If I used WARN_ON
then it would have to be WARN_ON(1) in the else branch of the if.

> But there is another point. The embedded people deserve a single switch
> to remove assertion checks. The purpose of macros like WARN_ON() is
> easy and _central_ choice of debugging output vs. kernel size.

This is not an argument against using USB's warn, it is an argument for
building warn on top of a centralized macro like WARN_ON or a friend.

All the best,

Duncan.

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

* Re: [linux-usb-devel] [PATCH 7/9] USB usbfs: destroy submitted urbs only on the disconnected interface
  2004-04-15  8:47               ` Duncan Sands
@ 2004-04-15  9:08                 ` Oliver Neukum
  2004-04-15  9:21                   ` Duncan Sands
  0 siblings, 1 reply; 18+ messages in thread
From: Oliver Neukum @ 2004-04-15  9:08 UTC (permalink / raw)
  To: Duncan Sands, Greg KH; +Cc: linux-usb-devel, linux-kernel, Frederic Detienne

Am Donnerstag, 15. April 2004 10:47 schrieb Duncan Sands:
> > > Hi Oliver, I thought you meant that CONFIG_EMBEDDED made WARN_ON go
> > > away (or something like that).  If you just mean that it is easy to
> > > redefine WARN_ON by hand, then all I can say is: it is also easy to
> > > redefine warn by hand!  Anyway, I made you the following patch:
> >
> > Yes, but I don't trust gcc to optimise away the 'if' if you redefine
> > warn().
>
> The "if" cannot be optimized away for the case in point, because it
> does something (clears the bit) if it passes the test.  If I used WARN_ON
> then it would have to be WARN_ON(1) in the else branch of the if.

True. You should use BUG_ON().
If this ever happens the device tree is screwed. There's no use going on.

> > But there is another point. The embedded people deserve a single switch
> > to remove assertion checks. The purpose of macros like WARN_ON() is
> > easy and _central_ choice of debugging output vs. kernel size.
>
> This is not an argument against using USB's warn, it is an argument for
> building warn on top of a centralized macro like WARN_ON or a friend.

It is an argument against USB making its own constructs. There's nothing
terribly specific about USB that would justify it. If the usual debug statements
are inadequate, improve them.

	Regards
		Oliver


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

* Re: [linux-usb-devel] [PATCH 7/9] USB usbfs: destroy submitted urbs only on the disconnected interface
  2004-04-15  9:08                 ` Oliver Neukum
@ 2004-04-15  9:21                   ` Duncan Sands
  0 siblings, 0 replies; 18+ messages in thread
From: Duncan Sands @ 2004-04-15  9:21 UTC (permalink / raw)
  To: Oliver Neukum, Greg KH; +Cc: linux-usb-devel, linux-kernel, Frederic Detienne

> > The "if" cannot be optimized away for the case in point, because it
> > does something (clears the bit) if it passes the test.  If I used WARN_ON
> > then it would have to be WARN_ON(1) in the else branch of the if.
>
> True. You should use BUG_ON().
>
> If this ever happens the device tree is screwed. There's no use going on.

I'm not sure - isn't it more likely that someone stuffed up in usbfs?  BUG_ON
seems kind of harsh, since it will kill the hub thread.  If it wasn't for that I
wouldn't hesitate to use BUG_ON here.

> > > But there is another point. The embedded people deserve a single switch
> > > to remove assertion checks. The purpose of macros like WARN_ON() is
> > > easy and _central_ choice of debugging output vs. kernel size.
> >
> > This is not an argument against using USB's warn, it is an argument for
> > building warn on top of a centralized macro like WARN_ON or a friend.
>
> It is an argument against USB making its own constructs. There's nothing
> terribly specific about USB that would justify it. If the usual debug
> statements are inadequate, improve them.

I don't see that there is anything wrong with USB using it's own constructs even
if they were just defined to be equal to some centralized macro (as they probably
should be).  In fact there is an advantage: they can be modified for debugging
purposes (to add a backtrace for example) without disturbing the rest of the
kernel.

All the best,

Duncan.

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

* Re: [linux-usb-devel] [PATCH 7/9] USB usbfs: destroy submitted urbs only on the disconnected interface
  2004-04-14 16:48 ` Alan Stern
  2004-04-14 17:09   ` Duncan Sands
@ 2004-04-17 18:31   ` Duncan Sands
  2004-04-17 18:53     ` Duncan Sands
  1 sibling, 1 reply; 18+ messages in thread
From: Duncan Sands @ 2004-04-17 18:31 UTC (permalink / raw)
  To: Alan Stern; +Cc: Greg KH, linux-usb-devel, linux-kernel, Frederic Detienne

Alan, do you have a suggestion for how best to go from
a struct usb_interface to an index?

Thanks,

Duncan.

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

* Re: [linux-usb-devel] [PATCH 7/9] USB usbfs: destroy submitted urbs only on the disconnected interface
  2004-04-17 18:31   ` Duncan Sands
@ 2004-04-17 18:53     ` Duncan Sands
  2004-04-17 19:52       ` Alan Stern
  0 siblings, 1 reply; 18+ messages in thread
From: Duncan Sands @ 2004-04-17 18:53 UTC (permalink / raw)
  To: Alan Stern; +Cc: Greg KH, linux-usb-devel, linux-kernel, Frederic Detienne

On Saturday 17 April 2004 20:31, Duncan Sands wrote:
> Alan, do you have a suggestion for how best to go from
> a struct usb_interface to an index?

(though probably usbfs shouldn't use indices at all,
just interface numbers and struct usb_interface).

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

* Re: [linux-usb-devel] [PATCH 7/9] USB usbfs: destroy submitted urbs only on the disconnected interface
  2004-04-17 18:53     ` Duncan Sands
@ 2004-04-17 19:52       ` Alan Stern
  0 siblings, 0 replies; 18+ messages in thread
From: Alan Stern @ 2004-04-17 19:52 UTC (permalink / raw)
  To: Duncan Sands
  Cc: Greg KH, linux-usb-devel, Kernel development list,
	Frederic Detienne

On Sat, 17 Apr 2004, Duncan Sands wrote:

> On Saturday 17 April 2004 20:31, Duncan Sands wrote:
> > Alan, do you have a suggestion for how best to go from
> > a struct usb_interface to an index?

The only way is by searching the interface list.  That was part of the 
reason I left findintfif() alone rather than replacing it with a call to 
usb_ifnum_to_if().

> (though probably usbfs shouldn't use indices at all,
> just interface numbers and struct usb_interface).

It's true that code is generally cleaner using numbers rather than
indices, and that's how I've been modifying the USB drivers when they need
it.  In general I would expect an interface number to be not much larger 
than the index (i.e., normally not many numbers will be skipped), so the 
bitmask size should be adequate in either case.  We probably don't have to 
worry about trying to support devices with a single interface numbered 77 
-- but if you wanted to then you'd have to use the index.

Alan Stern


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

end of thread, other threads:[~2004-04-17 19:52 UTC | newest]

Thread overview: 18+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-04-14 10:45 [PATCH 7/9] USB usbfs: destroy submitted urbs only on the disconnected interface Duncan Sands
2004-04-14 13:30 ` [linux-usb-devel] " Oliver Neukum
2004-04-14 13:38   ` Duncan Sands
2004-04-14 15:00   ` Duncan Sands
2004-04-14 15:33     ` Oliver Neukum
2004-04-14 15:39       ` Duncan Sands
2004-04-14 20:39         ` Oliver Neukum
2004-04-15  8:05           ` Duncan Sands
2004-04-15  8:31             ` Oliver Neukum
2004-04-15  8:47               ` Duncan Sands
2004-04-15  9:08                 ` Oliver Neukum
2004-04-15  9:21                   ` Duncan Sands
2004-04-14 16:48 ` Alan Stern
2004-04-14 17:09   ` Duncan Sands
2004-04-14 17:55     ` Alan Stern
2004-04-17 18:31   ` Duncan Sands
2004-04-17 18:53     ` Duncan Sands
2004-04-17 19:52       ` Alan Stern

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