diff options
| author | Gerd Hoffmann <kraxel@redhat.com> | 2017-06-12 09:31:09 +0200 |
|---|---|---|
| committer | Gerd Hoffmann <kraxel@redhat.com> | 2017-06-13 12:17:33 +0200 |
| commit | ad3c5412f2704672bb212bb82035c9b1a72db782 (patch) | |
| tree | 854b200ff3b4d54bc44d7ee953cca0206ff4b0db /hw/usb/hcd-ehci.c | |
| parent | d54fddea989ba4aa2912d49583d86ce01c0d27ea (diff) | |
| download | focaccia-qemu-ad3c5412f2704672bb212bb82035c9b1a72db782.tar.gz focaccia-qemu-ad3c5412f2704672bb212bb82035c9b1a72db782.zip | |
ehci: stop recursive calls to ehci_work_bh
Can happen with usb-storage devices: ehci_work_bh calls usb-storage, usb-storage calls into block layer, block layer may run BHs. Add a simple bool and just do nothing in case we figure ehci_work_bh is active. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Message-id: 20170612073109.25930-1-kraxel@redhat.com
Diffstat (limited to 'hw/usb/hcd-ehci.c')
| -rw-r--r-- | hw/usb/hcd-ehci.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/hw/usb/hcd-ehci.c b/hw/usb/hcd-ehci.c index 17c572c55f..73090e01ad 100644 --- a/hw/usb/hcd-ehci.c +++ b/hw/usb/hcd-ehci.c @@ -2241,6 +2241,11 @@ static void ehci_work_bh(void *opaque) uint64_t uframes, skipped_uframes; int i; + if (ehci->working) { + return; + } + ehci->working = true; + t_now = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL); ns_elapsed = t_now - ehci->last_run_ns; uframes = ns_elapsed / UFRAME_TIMER_NS; @@ -2322,6 +2327,8 @@ static void ehci_work_bh(void *opaque) } timer_mod(ehci->frame_timer, expire_time); } + + ehci->working = false; } static void ehci_work_timer(void *opaque) |