Message ID | 20200321113241.043380271@linutronix.de (mailing list archive) |
---|---|
State | Not Applicable |
Delegated to: | Johannes Berg |
Headers | show |
Series | Lock ordering documentation and annotation for lockdep | expand |
Thomas Gleixner <tglx@linutronix.de> writes: > From: Thomas Gleixner <tglx@linutronix.de> > > ep_io() uses a completion on stack and open codes the waiting with: > > wait_event_interruptible (done.wait, done.done); > and > wait_event (done.wait, done.done); > > This waits in non-exclusive mode for complete(), but there is no reason to > do so because the completion can only be waited for by the task itself and > complete() wakes exactly one exlusive waiter. > > Replace the open coded implementation with the corresponding > wait_for_completion*() functions. > > No functional change. > > Reported-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> > Signed-off-by: Thomas Gleixner <tglx@linutronix.de> > Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> > Cc: Felipe Balbi <balbi@kernel.org> > Cc: linux-usb@vger.kernel.org Do you want to carry it via your tree? If so: Acked-by: Felipe Balbi <balbi@kernel.org> Otherwise, let me know and I'll pick this patch.
On 2020-03-25 10:37:57 [+0200], Felipe Balbi wrote: > Do you want to carry it via your tree? If so: We would like to do so. > Acked-by: Felipe Balbi <balbi@kernel.org> Thank you. > Otherwise, let me know and I'll pick this patch. Sebastian
--- a/drivers/usb/gadget/legacy/inode.c +++ b/drivers/usb/gadget/legacy/inode.c @@ -344,7 +344,7 @@ ep_io (struct ep_data *epdata, void *buf spin_unlock_irq (&epdata->dev->lock); if (likely (value == 0)) { - value = wait_event_interruptible (done.wait, done.done); + value = wait_for_completion_interruptible(&done); if (value != 0) { spin_lock_irq (&epdata->dev->lock); if (likely (epdata->ep != NULL)) { @@ -353,7 +353,7 @@ ep_io (struct ep_data *epdata, void *buf usb_ep_dequeue (epdata->ep, epdata->req); spin_unlock_irq (&epdata->dev->lock); - wait_event (done.wait, done.done); + wait_for_completion(&done); if (epdata->status == -ECONNRESET) epdata->status = -EINTR; } else {