add usb_add_bus() function for usb bus list
PATCH 1/1 add usb_add_bus() function for usb bus list
Hi,
This patch makes usbcore driver sort usb bus on the usb_bus_list by busnum when registering a new bus instance.
In current implementation a new bus instance is simply added in front of existing busses. Although there is nothing wrong with it in kernel code, reloading HCD may break bus order of /proc/bus/usb/devices as it makes usbcore re-register the bus to the list as shown in the example below. and it doesn't look good or it may confuse some users.
# lsmod | grep hcd uhci_hcd 19324 0 ehci_hcd 39109 0 # grep "Bus=" /proc/bus/usb/devices T: Bus=05 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=12 MxCh= 2 T: Bus=04 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=12 MxCh= 2 T: Bus=03 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=12 MxCh= 2 T: Bus=02 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=12 MxCh= 2 T: Bus=02 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 2 Spd=1.5 MxCh= 0 T: Bus=02 Lev=01 Prnt=01 Port=01 Cnt=02 Dev#= 3 Spd=12 MxCh= 0 T: Bus=01 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=480 MxCh= 8 T: Bus=01 Lev=01 Prnt=01 Port=02 Cnt=01 Dev#= 4 Spd=480 MxCh= 4 # rmmod ehci-hcd; modprobe ehci-hcd # grep "Bus=" /proc/bus/usb/devices T: Bus=01 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=480 MxCh= 8 T: Bus=01 Lev=01 Prnt=01 Port=02 Cnt=01 Dev#= 4 Spd=480 MxCh= 4 T: Bus=05 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=12 MxCh= 2 T: Bus=04 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=12 MxCh= 2 T: Bus=03 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=12 MxCh= 2 T: Bus=02 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=12 MxCh= 2 T: Bus=02 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 4 Spd=1.5 MxCh= 0 T: Bus=02 Lev=01 Prnt=01 Port=01 Cnt=02 Dev#= 5 Spd=12 MxCh= 0
With this patch, bus instances on the usb_bus_list is kept in busnum order (from large to small busnum). As a result /proc/bus/usb/devices prints devices in busnum order regardless of HCD reloading. Although a few applications (eg.lsusb) use /proc/bus/usb/devices, this patch has no effect to them.
# lsmod | grep hcd uhci_hcd 19324 0 ehci_hcd 39109 0 # grep "Bus=" /proc/bus/usb/devices T: Bus=05 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=12 MxCh= 2 T: Bus=04 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=12 MxCh= 2 T: Bus=03 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=12 MxCh= 2 T: Bus=02 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=12 MxCh= 2 T: Bus=02 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 2 Spd=1.5 MxCh= 0 T: Bus=02 Lev=01 Prnt=01 Port=01 Cnt=02 Dev#= 3 Spd=12 MxCh= 0 T: Bus=01 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=480 MxCh= 8 T: Bus=01 Lev=01 Prnt=01 Port=02 Cnt=01 Dev#= 4 Spd=480 MxCh= 4 # rmmod ehci-hcd; modprobe ehci-hcd # grep "Bus=" /proc/bus/usb/devices T: Bus=05 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=12 MxCh= 2 T: Bus=04 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=12 MxCh= 2 T: Bus=03 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=12 MxCh= 2 T: Bus=02 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=12 MxCh= 2 T: Bus=02 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 4 Spd=1.5 MxCh= 0 T: Bus=02 Lev=01 Prnt=01 Port=01 Cnt=02 Dev#= 5 Spd=12 MxCh= 0 T: Bus=01 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=480 MxCh= 8 T: Bus=01 Lev=01 Prnt=01 Port=02 Cnt=01 Dev#= 4 Spd=480 MxCh= 4
Thanks,
Tomohiro Kusumi
---
drivers/usb/core/hcd.c +18 -1
@@ -877,6 +877,23 @@/*-------------------------------------------------------------------------*/ /** +* usb_add_bus - register the bus to the usb_bus_list, +* caller need to hold usb_bus_list_lock +* @bus: pointer to the bus to register +*/ +static void usb_add_bus (struct usb_bus *bus) +{ +struct usb_bus *b; +list_for_each_entry (b, &usb_bus_list, bus_list) { +if (bus->busnum > b->busnum) { +list_add_tail (&bus->bus_list, &b->bus_list); +return ; + } + } +list_add_tail (&bus->bus_list, &usb_bus_list); +} + +/** * usb_register_bus - registers the USB host controller with the usb core * @bus: pointer to the bus to register * Context: !in_interrupt()
@@ -899,7 +916,7 @@ bus->busnum = busnum;/* Add it to the local list of buses */ -list_add (&bus->bus_list, &usb_bus_list); +usb_add_bus (bus);mutex_unlock (&usb_bus_list_lock);usb_notify_add_bus (bus);
Quoted 4 lines · Tomohiro Kusumi
Hi,
This patch makes usbcore driver sort usb bus on the
usb_bus_listby busnum when registering a new bus instance.
No one should care about this.
Quoted 4 lines
In current implementation a new bus instance is simply added in front of existing busses. Although there is nothing wrong with it in kernel code, reloading HCD may break bus order of
/proc/bus/usb/devicesas it makes usbcore re-register the bus to the list as shown in the example below. and it doesn't look good or it may confuse some users.
How does it confuse anyone? (also note that /proc/bus/usb/devices is not used in modern distros, it's in a different location now.)
Why not fix your tools to report things in the correct order if you really care about it? The bus number means nothing except a unique id, it does not matter if things are sorted or not in the debug file.
Actually, in the lsusb-rewrite I am doing, the userspace tool does the sorting, no need to change the kernel.
So, sorry, I'm not going to accept this change.
greg k-h