Re: [PATCH] USB: EHCI: fix regression related to qh_refresh()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, 4 Jun 2013, Ming Lei wrote:

> > Index: usb-3.9/drivers/usb/host/ehci-sched.c
> > ===================================================================
> > --- usb-3.9.orig/drivers/usb/host/ehci-sched.c
> > +++ usb-3.9/drivers/usb/host/ehci-sched.c
> > @@ -646,6 +646,10 @@ static void end_unlink_intr(struct ehci_
> >         /* reschedule QH iff another request is queued */
> >         if (!list_empty(&qh->qtd_list) && ehci->rh_state == EHCI_RH_RUNNING) {
> >                 rc = qh_schedule(ehci, qh);
> > +               if (rc == 0) {
> > +                       qh_refresh(ehci, qh);
> > +                       qh_link_periodic(ehci, qh);
> > +               }
> 
> If one URB is just submitted during end_unlink_intr(), the qh may be scheduled
> and linked twice since intr_submit() has seen idle state of the qh already.

No, that can't happen.  The only time that ehci->lock is released while
end_unlink_intr() is running is during the giveback in qh_completions.  
During that time, qh->qh_state is temporarily set to
QH_STATE_COMPLETING.  Therefore the qh will not be linked before this 
new code runs.

Alan Stern

> I guess one interrupt URB is just submitted after starting unlink and before
> end unlinking on Oleksij's problem, this patch can addresses the problem
> but might cause issues on above case.
> 
> Looks one easy fix might be updating qh as idle after calling qh_completions().
> 
> Thanks,

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux