Skip to content

Commit

Permalink
ehci: check for EHCI_ASYNC_FINISHED first in ehci_free_packet
Browse files Browse the repository at this point in the history
Otherwise we'll see the packet free twice in the trace log even though
it actually happens only once.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
  • Loading branch information
kraxel committed Sep 11, 2012
1 parent 4b63a0d commit 616789c
Showing 1 changed file with 6 additions and 6 deletions.
12 changes: 6 additions & 6 deletions hw/usb/hcd-ehci.c
Expand Up @@ -747,12 +747,6 @@ static EHCIPacket *ehci_alloc_packet(EHCIQueue *q)

static void ehci_free_packet(EHCIPacket *p)
{
trace_usb_ehci_packet_action(p->queue, p, "free");
if (p->async == EHCI_ASYNC_INFLIGHT) {
usb_cancel_packet(&p->packet);
usb_packet_unmap(&p->packet, &p->sgl);
qemu_sglist_destroy(&p->sgl);
}
if (p->async == EHCI_ASYNC_FINISHED) {
int state = ehci_get_state(p->queue->ehci, p->queue->async);
/* This is a normal, but rare condition (cancel racing completion) */
Expand All @@ -763,6 +757,12 @@ static void ehci_free_packet(EHCIPacket *p)
/* state_writeback recurses into us with async == EHCI_ASYNC_NONE!! */
return;
}
trace_usb_ehci_packet_action(p->queue, p, "free");
if (p->async == EHCI_ASYNC_INFLIGHT) {
usb_cancel_packet(&p->packet);
usb_packet_unmap(&p->packet, &p->sgl);
qemu_sglist_destroy(&p->sgl);
}
QTAILQ_REMOVE(&p->queue->packets, p, next);
usb_packet_cleanup(&p->packet);
g_free(p);
Expand Down

0 comments on commit 616789c

Please sign in to comment.