Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 49367d8f authored by Ming Lei's avatar Ming Lei Committed by Greg Kroah-Hartman
Browse files

USB: mark "reject" field of struct urb as atomic_t



It is enough to protect accesses to reject field of urb
by marking it as atomic_t,also it is the only reason of
existence of usb_reject_lock,so remove the lock to make
code more clean.

Signed-off-by: default avatarMing Lei <tom.leiming@gmail.com>
Acked-off-by: default avatarAlan Stern <stern@rowland.harvard.edu>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 3b23dd6f
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -1010,7 +1010,7 @@ int usb_hcd_link_urb_to_ep(struct usb_hcd *hcd, struct urb *urb)
	spin_lock(&hcd_urb_list_lock);

	/* Check that the URB isn't being killed */
	if (unlikely(urb->reject)) {
	if (unlikely(atomic_read(&urb->reject))) {
		rc = -EPERM;
		goto done;
	}
@@ -1340,7 +1340,7 @@ int usb_hcd_submit_urb (struct urb *urb, gfp_t mem_flags)
		INIT_LIST_HEAD(&urb->urb_list);
		atomic_dec(&urb->use_count);
		atomic_dec(&urb->dev->urbnum);
		if (urb->reject)
		if (atomic_read(&urb->reject))
			wake_up(&usb_kill_urb_queue);
		usb_put_urb(urb);
	}
@@ -1444,7 +1444,7 @@ void usb_hcd_giveback_urb(struct usb_hcd *hcd, struct urb *urb, int status)
	urb->status = status;
	urb->complete (urb);
	atomic_dec (&urb->use_count);
	if (unlikely (urb->reject))
	if (unlikely(atomic_read(&urb->reject)))
		wake_up (&usb_kill_urb_queue);
	usb_put_urb (urb);
}
+5 −18
Original line number Diff line number Diff line
@@ -10,7 +10,6 @@

#define to_urb(d) container_of(d, struct urb, kref)

static DEFINE_SPINLOCK(usb_reject_lock);

static void urb_destroy(struct kref *kref)
{
@@ -131,9 +130,7 @@ void usb_anchor_urb(struct urb *urb, struct usb_anchor *anchor)
	urb->anchor = anchor;

	if (unlikely(anchor->poisoned)) {
		spin_lock(&usb_reject_lock);
		urb->reject++;
		spin_unlock(&usb_reject_lock);
		atomic_inc(&urb->reject);
	}

	spin_unlock_irqrestore(&anchor->lock, flags);
@@ -565,16 +562,12 @@ void usb_kill_urb(struct urb *urb)
	might_sleep();
	if (!(urb && urb->dev && urb->ep))
		return;
	spin_lock_irq(&usb_reject_lock);
	++urb->reject;
	spin_unlock_irq(&usb_reject_lock);
	atomic_inc(&urb->reject);

	usb_hcd_unlink_urb(urb, -ENOENT);
	wait_event(usb_kill_urb_queue, atomic_read(&urb->use_count) == 0);

	spin_lock_irq(&usb_reject_lock);
	--urb->reject;
	spin_unlock_irq(&usb_reject_lock);
	atomic_dec(&urb->reject);
}
EXPORT_SYMBOL_GPL(usb_kill_urb);

@@ -606,9 +599,7 @@ void usb_poison_urb(struct urb *urb)
	might_sleep();
	if (!(urb && urb->dev && urb->ep))
		return;
	spin_lock_irq(&usb_reject_lock);
	++urb->reject;
	spin_unlock_irq(&usb_reject_lock);
	atomic_inc(&urb->reject);

	usb_hcd_unlink_urb(urb, -ENOENT);
	wait_event(usb_kill_urb_queue, atomic_read(&urb->use_count) == 0);
@@ -617,14 +608,10 @@ EXPORT_SYMBOL_GPL(usb_poison_urb);

void usb_unpoison_urb(struct urb *urb)
{
	unsigned long flags;

	if (!urb)
		return;

	spin_lock_irqsave(&usb_reject_lock, flags);
	--urb->reject;
	spin_unlock_irqrestore(&usb_reject_lock, flags);
	atomic_dec(&urb->reject);
}
EXPORT_SYMBOL_GPL(usb_unpoison_urb);

+1 −1
Original line number Diff line number Diff line
@@ -1340,7 +1340,7 @@ struct urb {
	struct kref kref;		/* reference count of the URB */
	void *hcpriv;			/* private data for host controller */
	atomic_t use_count;		/* concurrent submissions counter */
	u8 reject;			/* submissions will fail */
	atomic_t reject;		/* submissions will fail */
	int unlinked;			/* unlink error code */

	/* public: documented fields in the urb that can be used by drivers */