[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH] xhci: only update dequeue ptr on completed tran
From: |
Laurent Vivier |
Subject: |
Re: [Qemu-devel] [PATCH] xhci: only update dequeue ptr on completed transfers |
Date: |
Thu, 8 Jun 2017 09:49:47 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.1.0 |
On 08/06/2017 09:41, Gerd Hoffmann wrote:
> The dequeue pointer should only be updated in case the transfer
> is actually completed. If we update it for inflight transfers
> we will not pick them up again after migration, which easily
> triggers with HID devices as they typically have a pending
> transfer, waiting for user input to happen.
>
> Fixes: 243afe858b95765b98d16a1f0dd50dca262858ad
> Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1451631
> Signed-off-by: Gerd Hoffmann <address@hidden>
Tested-by: Laurent Vivier <address@hidden>
> ---
> hw/usb/hcd-xhci.c | 6 ++++--
> 1 file changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c
> index a0c7960a7b..760135c0d2 100644
> --- a/hw/usb/hcd-xhci.c
> +++ b/hw/usb/hcd-xhci.c
> @@ -1912,6 +1912,8 @@ static void xhci_kick_epctx(XHCIEPContext *epctx,
> unsigned int streamid)
> }
> assert(!xfer->running_retry);
> if (xfer->complete) {
> + /* update ring dequeue ptr */
> + xhci_set_ep_state(xhci, epctx, stctx, epctx->state);
> xhci_ep_free_xfer(epctx->retry);
> }
> epctx->retry = NULL;
> @@ -1962,6 +1964,8 @@ static void xhci_kick_epctx(XHCIEPContext *epctx,
> unsigned int streamid)
> xhci_fire_transfer(xhci, xfer, epctx);
> }
> if (xfer->complete) {
> + /* update ring dequeue ptr */
> + xhci_set_ep_state(xhci, epctx, stctx, epctx->state);
> xhci_ep_free_xfer(xfer);
> xfer = NULL;
> }
> @@ -1979,8 +1983,6 @@ static void xhci_kick_epctx(XHCIEPContext *epctx,
> unsigned int streamid)
> break;
> }
> }
> - /* update ring dequeue ptr */
> - xhci_set_ep_state(xhci, epctx, stctx, epctx->state);
> epctx->kick_active--;
>
> ep = xhci_epid_to_usbep(epctx);
>