Accepting request 986227 from home:lin_ma:branches:Virtualization
Fix usb ehci boot failure (bsc#1192115) OBS-URL: https://build.opensuse.org/request/show/986227 OBS-URL: https://build.opensuse.org/package/show/Virtualization/qemu?expand=0&rev=723
This commit is contained in:
parent
c39ad145aa
commit
356a2ed499
64
hw-usb-hcd-ehci-fix-writeback-order.patch
Normal file
64
hw-usb-hcd-ehci-fix-writeback-order.patch
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
From e4ad2b63e748643e12306d61aea7aaf5a41a0d3c Mon Sep 17 00:00:00 2001
|
||||||
|
From: Arnout Engelen <arnout@bzzt.net>
|
||||||
|
Date: Sun, 8 May 2022 17:32:22 +0200
|
||||||
|
Subject: [PATCH] hw/usb/hcd-ehci: fix writeback order
|
||||||
|
|
||||||
|
Git-commit: f471e8b060798f26a7fc339c6152f82f22a7b33d
|
||||||
|
References: bsc#1192115
|
||||||
|
|
||||||
|
The 'active' bit passes control over a qTD between the guest and the
|
||||||
|
controller: set to 1 by guest to enable execution by the controller,
|
||||||
|
and the controller sets it to '0' to hand back control to the guest.
|
||||||
|
|
||||||
|
ehci_state_writeback write two dwords to main memory using DMA:
|
||||||
|
the third dword of the qTD (containing dt, total bytes to transfer,
|
||||||
|
cpage, cerr and status) and the fourth dword of the qTD (containing
|
||||||
|
the offset).
|
||||||
|
|
||||||
|
This commit makes sure the fourth dword is written before the third,
|
||||||
|
avoiding a race condition where a new offset written into the qTD
|
||||||
|
by the guest after it observed the status going to go to '0' gets
|
||||||
|
overwritten by a 'late' DMA writeback of the previous offset.
|
||||||
|
|
||||||
|
This race condition could lead to 'cpage out of range (5)' errors,
|
||||||
|
and reproduced by:
|
||||||
|
|
||||||
|
./qemu-system-x86_64 -enable-kvm -bios $SEABIOS/bios.bin -m 4096 -device usb-ehci -blockdev driver=file,read-only=on,filename=/home/aengelen/Downloads/openSUSE-Tumbleweed-DVD-i586-Snapshot20220428-Media.iso,node-name=iso -device usb-storage,drive=iso,bootindex=0 -chardev pipe,id=shell,path=/tmp/pipe -device virtio-serial -device virtconsole,chardev=shell -device virtio-rng-pci -serial mon:stdio -nographic
|
||||||
|
|
||||||
|
(press a key, select 'Installation' (2), and accept the default
|
||||||
|
values. On my machine the 'cpage out of range' is reproduced while
|
||||||
|
loading the Linux Kernel about once per 7 attempts. With the fix in
|
||||||
|
this commit it no longer fails)
|
||||||
|
|
||||||
|
This problem was previously reported as a seabios problem in
|
||||||
|
https://mail.coreboot.org/hyperkitty/list/seabios@seabios.org/thread/OUTHT5ISSQJGXPNTUPY3O5E5EPZJCHM3/
|
||||||
|
and as a nixos CI build failure in
|
||||||
|
https://github.com/NixOS/nixpkgs/issues/170803
|
||||||
|
|
||||||
|
Signed-off-by: Arnout Engelen <arnout@bzzt.net>
|
||||||
|
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
|
||||||
|
(cherry picked from commit f471e8b060798f26a7fc339c6152f82f22a7b33d)
|
||||||
|
Signed-off-by: Lin Ma <lma@suse.com>
|
||||||
|
---
|
||||||
|
hw/usb/hcd-ehci.c | 5 ++++-
|
||||||
|
1 file changed, 4 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/hw/usb/hcd-ehci.c b/hw/usb/hcd-ehci.c
|
||||||
|
index 6caa7ac6c2..3464b2406e 100644
|
||||||
|
--- a/hw/usb/hcd-ehci.c
|
||||||
|
+++ b/hw/usb/hcd-ehci.c
|
||||||
|
@@ -2009,7 +2009,10 @@ static int ehci_state_writeback(EHCIQueue *q)
|
||||||
|
ehci_trace_qtd(q, NLPTR_GET(p->qtdaddr), (EHCIqtd *) &q->qh.next_qtd);
|
||||||
|
qtd = (uint32_t *) &q->qh.next_qtd;
|
||||||
|
addr = NLPTR_GET(p->qtdaddr);
|
||||||
|
- put_dwords(q->ehci, addr + 2 * sizeof(uint32_t), qtd + 2, 2);
|
||||||
|
+ /* First write back the offset */
|
||||||
|
+ put_dwords(q->ehci, addr + 3 * sizeof(uint32_t), qtd + 3, 1);
|
||||||
|
+ /* Then write back the token, clearing the 'active' bit */
|
||||||
|
+ put_dwords(q->ehci, addr + 2 * sizeof(uint32_t), qtd + 2, 1);
|
||||||
|
ehci_free_packet(p);
|
||||||
|
|
||||||
|
/*
|
||||||
|
--
|
||||||
|
2.34.1
|
||||||
|
|
@ -1,3 +1,10 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
Fri Jul 1 11:46:41 UTC 2022 - Lin Ma <lma@suse.com>
|
||||||
|
|
||||||
|
- Fix usb ehci boot failure (bsc#1192115)
|
||||||
|
* Patches added:
|
||||||
|
hw-usb-hcd-ehci-fix-writeback-order.patch
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Tue Jun 21 07:30:46 UTC 2022 - Dario Faggioli <dfaggioli@suse.com>
|
Tue Jun 21 07:30:46 UTC 2022 - Dario Faggioli <dfaggioli@suse.com>
|
||||||
|
|
||||||
|
@ -250,6 +250,7 @@ Patch00106: python-aqmp-drop-_bind_hack.patch
|
|||||||
Patch00107: block-qdict-Fix-Werror-maybe-uninitializ.patch
|
Patch00107: block-qdict-Fix-Werror-maybe-uninitializ.patch
|
||||||
Patch00108: pci-fix-overflow-in-snprintf-string-form.patch
|
Patch00108: pci-fix-overflow-in-snprintf-string-form.patch
|
||||||
Patch00109: sphinx-change-default-language-to-en.patch
|
Patch00109: sphinx-change-default-language-to-en.patch
|
||||||
|
Patch00110: hw-usb-hcd-ehci-fix-writeback-order.patch
|
||||||
# Patches applied in roms/seabios/:
|
# Patches applied in roms/seabios/:
|
||||||
Patch01000: seabios-use-python2-explicitly-as-needed.patch
|
Patch01000: seabios-use-python2-explicitly-as-needed.patch
|
||||||
Patch01001: seabios-switch-to-python3-as-needed.patch
|
Patch01001: seabios-switch-to-python3-as-needed.patch
|
||||||
@ -1282,6 +1283,7 @@ This package records qemu testsuite results and represents successful testing.
|
|||||||
%patch00107 -p1
|
%patch00107 -p1
|
||||||
%patch00108 -p1
|
%patch00108 -p1
|
||||||
%patch00109 -p1
|
%patch00109 -p1
|
||||||
|
%patch00110 -p1
|
||||||
%patch01000 -p1
|
%patch01000 -p1
|
||||||
%patch01001 -p1
|
%patch01001 -p1
|
||||||
%patch01002 -p1
|
%patch01002 -p1
|
||||||
|
Loading…
Reference in New Issue
Block a user