[PATCH] USB: convert a bunch of USB semaphores to mutexes
the patch below converts a bunch of semaphores-used-as-mutex in the USB code to mutexes Signed-off-by: Arjan van de Ven <arjan@infradead.org> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
35cce732d9
commit
4186ecf8ad
@@ -57,6 +57,7 @@
|
||||
#include <linux/usb.h>
|
||||
#include <linux/smp_lock.h>
|
||||
#include <linux/usbdevice_fs.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <asm/uaccess.h>
|
||||
|
||||
#include "usb.h"
|
||||
@@ -570,7 +571,7 @@ static ssize_t usb_device_read(struct file *file, char __user *buf, size_t nbyte
|
||||
if (!access_ok(VERIFY_WRITE, buf, nbytes))
|
||||
return -EFAULT;
|
||||
|
||||
down (&usb_bus_list_lock);
|
||||
mutex_lock(&usb_bus_list_lock);
|
||||
/* print devices for all busses */
|
||||
list_for_each_entry(bus, &usb_bus_list, bus_list) {
|
||||
/* recurse through all children of the root hub */
|
||||
@@ -580,12 +581,12 @@ static ssize_t usb_device_read(struct file *file, char __user *buf, size_t nbyte
|
||||
ret = usb_device_dump(&buf, &nbytes, &skip_bytes, ppos, bus->root_hub, bus, 0, 0, 0);
|
||||
usb_unlock_device(bus->root_hub);
|
||||
if (ret < 0) {
|
||||
up(&usb_bus_list_lock);
|
||||
mutex_unlock(&usb_bus_list_lock);
|
||||
return ret;
|
||||
}
|
||||
total_written += ret;
|
||||
}
|
||||
up (&usb_bus_list_lock);
|
||||
mutex_unlock(&usb_bus_list_lock);
|
||||
return total_written;
|
||||
}
|
||||
|
||||
|
@@ -34,6 +34,7 @@
|
||||
#include <asm/scatterlist.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/byteorder.h>
|
||||
|
||||
@@ -93,7 +94,7 @@ struct usb_busmap {
|
||||
static struct usb_busmap busmap;
|
||||
|
||||
/* used when updating list of hcds */
|
||||
DECLARE_MUTEX (usb_bus_list_lock); /* exported only for usbfs */
|
||||
DEFINE_MUTEX(usb_bus_list_lock); /* exported only for usbfs */
|
||||
EXPORT_SYMBOL_GPL (usb_bus_list_lock);
|
||||
|
||||
/* used for controlling access to virtual root hubs */
|
||||
@@ -761,14 +762,14 @@ static int usb_register_bus(struct usb_bus *bus)
|
||||
{
|
||||
int busnum;
|
||||
|
||||
down (&usb_bus_list_lock);
|
||||
mutex_lock(&usb_bus_list_lock);
|
||||
busnum = find_next_zero_bit (busmap.busmap, USB_MAXBUS, 1);
|
||||
if (busnum < USB_MAXBUS) {
|
||||
set_bit (busnum, busmap.busmap);
|
||||
bus->busnum = busnum;
|
||||
} else {
|
||||
printk (KERN_ERR "%s: too many buses\n", usbcore_name);
|
||||
up(&usb_bus_list_lock);
|
||||
mutex_unlock(&usb_bus_list_lock);
|
||||
return -E2BIG;
|
||||
}
|
||||
|
||||
@@ -776,7 +777,7 @@ static int usb_register_bus(struct usb_bus *bus)
|
||||
bus->controller, "usb_host%d", busnum);
|
||||
if (IS_ERR(bus->class_dev)) {
|
||||
clear_bit(busnum, busmap.busmap);
|
||||
up(&usb_bus_list_lock);
|
||||
mutex_unlock(&usb_bus_list_lock);
|
||||
return PTR_ERR(bus->class_dev);
|
||||
}
|
||||
|
||||
@@ -784,7 +785,7 @@ static int usb_register_bus(struct usb_bus *bus)
|
||||
|
||||
/* Add it to the local list of buses */
|
||||
list_add (&bus->bus_list, &usb_bus_list);
|
||||
up (&usb_bus_list_lock);
|
||||
mutex_unlock(&usb_bus_list_lock);
|
||||
|
||||
usb_notify_add_bus(bus);
|
||||
|
||||
@@ -809,9 +810,9 @@ static void usb_deregister_bus (struct usb_bus *bus)
|
||||
* controller code, as well as having it call this when cleaning
|
||||
* itself up
|
||||
*/
|
||||
down (&usb_bus_list_lock);
|
||||
mutex_lock(&usb_bus_list_lock);
|
||||
list_del (&bus->bus_list);
|
||||
up (&usb_bus_list_lock);
|
||||
mutex_unlock(&usb_bus_list_lock);
|
||||
|
||||
usb_notify_remove_bus(bus);
|
||||
|
||||
@@ -844,14 +845,14 @@ static int register_root_hub (struct usb_device *usb_dev,
|
||||
set_bit (devnum, usb_dev->bus->devmap.devicemap);
|
||||
usb_set_device_state(usb_dev, USB_STATE_ADDRESS);
|
||||
|
||||
down (&usb_bus_list_lock);
|
||||
mutex_lock(&usb_bus_list_lock);
|
||||
usb_dev->bus->root_hub = usb_dev;
|
||||
|
||||
usb_dev->ep0.desc.wMaxPacketSize = __constant_cpu_to_le16(64);
|
||||
retval = usb_get_device_descriptor(usb_dev, USB_DT_DEVICE_SIZE);
|
||||
if (retval != sizeof usb_dev->descriptor) {
|
||||
usb_dev->bus->root_hub = NULL;
|
||||
up (&usb_bus_list_lock);
|
||||
mutex_unlock(&usb_bus_list_lock);
|
||||
dev_dbg (parent_dev, "can't read %s device descriptor %d\n",
|
||||
usb_dev->dev.bus_id, retval);
|
||||
return (retval < 0) ? retval : -EMSGSIZE;
|
||||
@@ -863,7 +864,7 @@ static int register_root_hub (struct usb_device *usb_dev,
|
||||
dev_err (parent_dev, "can't register root hub for %s, %d\n",
|
||||
usb_dev->dev.bus_id, retval);
|
||||
}
|
||||
up (&usb_bus_list_lock);
|
||||
mutex_unlock(&usb_bus_list_lock);
|
||||
|
||||
if (retval == 0) {
|
||||
spin_lock_irq (&hcd_root_hub_lock);
|
||||
@@ -1891,9 +1892,9 @@ void usb_remove_hcd(struct usb_hcd *hcd)
|
||||
hcd->rh_registered = 0;
|
||||
spin_unlock_irq (&hcd_root_hub_lock);
|
||||
|
||||
down(&usb_bus_list_lock);
|
||||
mutex_lock(&usb_bus_list_lock);
|
||||
usb_disconnect(&hcd->self.root_hub);
|
||||
up(&usb_bus_list_lock);
|
||||
mutex_unlock(&usb_bus_list_lock);
|
||||
|
||||
hcd->poll_rh = 0;
|
||||
del_timer_sync(&hcd->rh_timer);
|
||||
|
@@ -364,7 +364,7 @@ extern void usb_set_device_state(struct usb_device *udev,
|
||||
/* exported only within usbcore */
|
||||
|
||||
extern struct list_head usb_bus_list;
|
||||
extern struct semaphore usb_bus_list_lock;
|
||||
extern struct mutex usb_bus_list_lock;
|
||||
extern wait_queue_head_t usb_kill_urb_queue;
|
||||
|
||||
extern struct usb_bus *usb_bus_get (struct usb_bus *bus);
|
||||
|
@@ -22,6 +22,7 @@
|
||||
#include <linux/usb.h>
|
||||
#include <linux/usbdevice_fs.h>
|
||||
#include <linux/kthread.h>
|
||||
#include <linux/mutex.h>
|
||||
|
||||
#include <asm/semaphore.h>
|
||||
#include <asm/uaccess.h>
|
||||
@@ -2162,7 +2163,7 @@ static int
|
||||
hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1,
|
||||
int retry_counter)
|
||||
{
|
||||
static DECLARE_MUTEX(usb_address0_sem);
|
||||
static DEFINE_MUTEX(usb_address0_mutex);
|
||||
|
||||
struct usb_device *hdev = hub->hdev;
|
||||
int i, j, retval;
|
||||
@@ -2183,7 +2184,7 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1,
|
||||
if (oldspeed == USB_SPEED_LOW)
|
||||
delay = HUB_LONG_RESET_TIME;
|
||||
|
||||
down(&usb_address0_sem);
|
||||
mutex_lock(&usb_address0_mutex);
|
||||
|
||||
/* Reset the device; full speed may morph to high speed */
|
||||
retval = hub_port_reset(hub, port1, udev, delay);
|
||||
@@ -2381,7 +2382,7 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1,
|
||||
fail:
|
||||
if (retval)
|
||||
hub_port_disable(hub, port1, 0);
|
||||
up(&usb_address0_sem);
|
||||
mutex_unlock(&usb_address0_mutex);
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
@@ -13,16 +13,17 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/notifier.h>
|
||||
#include <linux/usb.h>
|
||||
#include <linux/mutex.h>
|
||||
#include "usb.h"
|
||||
|
||||
|
||||
static struct notifier_block *usb_notifier_list;
|
||||
static DECLARE_MUTEX(usb_notifier_lock);
|
||||
static DEFINE_MUTEX(usb_notifier_lock);
|
||||
|
||||
static void usb_notifier_chain_register(struct notifier_block **list,
|
||||
struct notifier_block *n)
|
||||
{
|
||||
down(&usb_notifier_lock);
|
||||
mutex_lock(&usb_notifier_lock);
|
||||
while (*list) {
|
||||
if (n->priority > (*list)->priority)
|
||||
break;
|
||||
@@ -30,13 +31,13 @@ static void usb_notifier_chain_register(struct notifier_block **list,
|
||||
}
|
||||
n->next = *list;
|
||||
*list = n;
|
||||
up(&usb_notifier_lock);
|
||||
mutex_unlock(&usb_notifier_lock);
|
||||
}
|
||||
|
||||
static void usb_notifier_chain_unregister(struct notifier_block **nl,
|
||||
struct notifier_block *n)
|
||||
{
|
||||
down(&usb_notifier_lock);
|
||||
mutex_lock(&usb_notifier_lock);
|
||||
while ((*nl)!=NULL) {
|
||||
if ((*nl)==n) {
|
||||
*nl = n->next;
|
||||
@@ -45,7 +46,7 @@ static void usb_notifier_chain_unregister(struct notifier_block **nl,
|
||||
nl=&((*nl)->next);
|
||||
}
|
||||
exit:
|
||||
up(&usb_notifier_lock);
|
||||
mutex_unlock(&usb_notifier_lock);
|
||||
}
|
||||
|
||||
static int usb_notifier_call_chain(struct notifier_block **n,
|
||||
@@ -54,7 +55,7 @@ static int usb_notifier_call_chain(struct notifier_block **n,
|
||||
int ret=NOTIFY_DONE;
|
||||
struct notifier_block *nb = *n;
|
||||
|
||||
down(&usb_notifier_lock);
|
||||
mutex_lock(&usb_notifier_lock);
|
||||
while (nb) {
|
||||
ret = nb->notifier_call(nb,val,v);
|
||||
if (ret&NOTIFY_STOP_MASK) {
|
||||
@@ -63,7 +64,7 @@ static int usb_notifier_call_chain(struct notifier_block **n,
|
||||
nb = nb->next;
|
||||
}
|
||||
exit:
|
||||
up(&usb_notifier_lock);
|
||||
mutex_unlock(&usb_notifier_lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@@ -33,6 +33,7 @@
|
||||
#include <linux/errno.h>
|
||||
#include <linux/smp_lock.h>
|
||||
#include <linux/usb.h>
|
||||
#include <linux/mutex.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/scatterlist.h>
|
||||
@@ -639,7 +640,7 @@ struct usb_device *usb_find_device(u16 vendor_id, u16 product_id)
|
||||
struct usb_bus *bus;
|
||||
struct usb_device *dev = NULL;
|
||||
|
||||
down(&usb_bus_list_lock);
|
||||
mutex_lock(&usb_bus_list_lock);
|
||||
for (buslist = usb_bus_list.next;
|
||||
buslist != &usb_bus_list;
|
||||
buslist = buslist->next) {
|
||||
@@ -653,7 +654,7 @@ struct usb_device *usb_find_device(u16 vendor_id, u16 product_id)
|
||||
goto exit;
|
||||
}
|
||||
exit:
|
||||
up(&usb_bus_list_lock);
|
||||
mutex_unlock(&usb_bus_list_lock);
|
||||
return dev;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user