USB: get rid of urb->lock
Now that urb->status isn't used, urb->lock doesn't protect anything. This patch (as980) removes it and replaces it with a private mutex in the one remaining place it was still used: usb_kill_urb. Signed-off-by: Alan Stern <stern@rowland.harvard.edu> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
4a00027dcb
commit
1431d2a44c
|
@ -39,7 +39,6 @@ void usb_init_urb(struct urb *urb)
|
||||||
if (urb) {
|
if (urb) {
|
||||||
memset(urb, 0, sizeof(*urb));
|
memset(urb, 0, sizeof(*urb));
|
||||||
kref_init(&urb->kref);
|
kref_init(&urb->kref);
|
||||||
spin_lock_init(&urb->lock);
|
|
||||||
INIT_LIST_HEAD(&urb->anchor_list);
|
INIT_LIST_HEAD(&urb->anchor_list);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -541,19 +540,21 @@ int usb_unlink_urb(struct urb *urb)
|
||||||
*/
|
*/
|
||||||
void usb_kill_urb(struct urb *urb)
|
void usb_kill_urb(struct urb *urb)
|
||||||
{
|
{
|
||||||
|
static DEFINE_MUTEX(reject_mutex);
|
||||||
|
|
||||||
might_sleep();
|
might_sleep();
|
||||||
if (!(urb && urb->dev && urb->ep))
|
if (!(urb && urb->dev && urb->ep))
|
||||||
return;
|
return;
|
||||||
spin_lock_irq(&urb->lock);
|
mutex_lock(&reject_mutex);
|
||||||
++urb->reject;
|
++urb->reject;
|
||||||
spin_unlock_irq(&urb->lock);
|
mutex_unlock(&reject_mutex);
|
||||||
|
|
||||||
usb_hcd_unlink_urb(urb, -ENOENT);
|
usb_hcd_unlink_urb(urb, -ENOENT);
|
||||||
wait_event(usb_kill_urb_queue, atomic_read(&urb->use_count) == 0);
|
wait_event(usb_kill_urb_queue, atomic_read(&urb->use_count) == 0);
|
||||||
|
|
||||||
spin_lock_irq(&urb->lock);
|
mutex_lock(&reject_mutex);
|
||||||
--urb->reject;
|
--urb->reject;
|
||||||
spin_unlock_irq(&urb->lock);
|
mutex_unlock(&reject_mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1241,7 +1241,6 @@ struct urb
|
||||||
{
|
{
|
||||||
/* private: usb core and host controller only fields in the urb */
|
/* private: usb core and host controller only fields in the urb */
|
||||||
struct kref kref; /* reference count of the URB */
|
struct kref kref; /* reference count of the URB */
|
||||||
spinlock_t lock; /* lock for the URB */
|
|
||||||
void *hcpriv; /* private data for host controller */
|
void *hcpriv; /* private data for host controller */
|
||||||
atomic_t use_count; /* concurrent submissions counter */
|
atomic_t use_count; /* concurrent submissions counter */
|
||||||
u8 reject; /* submissions will fail */
|
u8 reject; /* submissions will fail */
|
||||||
|
@ -1299,7 +1298,6 @@ static inline void usb_fill_control_urb (struct urb *urb,
|
||||||
usb_complete_t complete_fn,
|
usb_complete_t complete_fn,
|
||||||
void *context)
|
void *context)
|
||||||
{
|
{
|
||||||
spin_lock_init(&urb->lock);
|
|
||||||
urb->dev = dev;
|
urb->dev = dev;
|
||||||
urb->pipe = pipe;
|
urb->pipe = pipe;
|
||||||
urb->setup_packet = setup_packet;
|
urb->setup_packet = setup_packet;
|
||||||
|
@ -1330,7 +1328,6 @@ static inline void usb_fill_bulk_urb (struct urb *urb,
|
||||||
usb_complete_t complete_fn,
|
usb_complete_t complete_fn,
|
||||||
void *context)
|
void *context)
|
||||||
{
|
{
|
||||||
spin_lock_init(&urb->lock);
|
|
||||||
urb->dev = dev;
|
urb->dev = dev;
|
||||||
urb->pipe = pipe;
|
urb->pipe = pipe;
|
||||||
urb->transfer_buffer = transfer_buffer;
|
urb->transfer_buffer = transfer_buffer;
|
||||||
|
@ -1366,7 +1363,6 @@ static inline void usb_fill_int_urb (struct urb *urb,
|
||||||
void *context,
|
void *context,
|
||||||
int interval)
|
int interval)
|
||||||
{
|
{
|
||||||
spin_lock_init(&urb->lock);
|
|
||||||
urb->dev = dev;
|
urb->dev = dev;
|
||||||
urb->pipe = pipe;
|
urb->pipe = pipe;
|
||||||
urb->transfer_buffer = transfer_buffer;
|
urb->transfer_buffer = transfer_buffer;
|
||||||
|
|
Loading…
Reference in New Issue