aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJordan Niethe <jniethe5@gmail.com>2023-08-29 10:12:01 +1000
committerAlexey Kardashevskiy <aik@ozlabs.ru>2023-09-18 18:20:45 +1000
commitdd4d4ea0add97df078d571b48192adaf7c4b0d87 (patch)
treea4dbaadf652c32716f3e7583d260cca6c045ffed
parent63b66a5147069bda815989732442cb07790609db (diff)
downloadSLOF-dd4d4ea0add97df078d571b48192adaf7c4b0d87.zip
SLOF-dd4d4ea0add97df078d571b48192adaf7c4b0d87.tar.gz
SLOF-dd4d4ea0add97df078d571b48192adaf7c4b0d87.tar.bz2
virtio-serial: Do not close stdout on quiesce
Commit 76fee95 ("slof: Only close stdout for virtio-serial devices") says that commit cf28264 ("virtio-serial: Rework shutdown sequence") fixed a hang. The problem was believed to be that it was necessary to close stdout to shutdown the underlying virtio device. Commit cf28264 ("virtio-serial: Rework shutdown sequence") closed stdout on quiesce. This meant when prom_init() called write on stdout after quiesce, there is a use after free so this is unreliable, and can also hang (especially after reboots). Quiescing is intended to put hardware into a safe state for the client to take over. It is incorrect for SLOF to close ihandles that the client could still be using, even after a quiesce. Rather than closing the stdout device, all that needs to happen is to ensure virtio-serial-shutdown gets called. On quiesce, close the virtio device, but leave the stdout device itself open. Commit 8174acd ("virtio-serial: Close device completely") handles reads and writes as no-ops if the underlying virtio device is closed so there is no problem with the client calling "write" on stdout after this, but no output will be displayed. Fixes: cf28264 ("virtio-serial: Rework shutdown sequence") Debugged-by: Kautuk Consul <kconsul@linux.vnet.ibm.com> Co-developed-by: Kautuk Consul <kconsul@linux.vnet.ibm.com> Signed-off-by: Kautuk Consul <kconsul@linux.vnet.ibm.com> Signed-off-by: Jordan Niethe <jniethe5@gmail.com> Reviewed-by: Thomas Huth <thuth@redhat.com> Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
-rw-r--r--board-qemu/slof/virtio-serial.fs12
1 files changed, 5 insertions, 7 deletions
diff --git a/board-qemu/slof/virtio-serial.fs b/board-qemu/slof/virtio-serial.fs
index 41e2e04..de42cc7 100644
--- a/board-qemu/slof/virtio-serial.fs
+++ b/board-qemu/slof/virtio-serial.fs
@@ -33,16 +33,14 @@ virtio-setup-vd VALUE virtiodev
: virtio-serial-term-key? virtiodev virtio-serial-haschar ;
: virtio-serial-term-key BEGIN virtio-serial-term-key? UNTIL virtiodev virtio-serial-getchar ;
-: virtio-serial-close-stdout s" stdout" get-chosen IF decode-int nip nip close-dev THEN ;
-
\ Basic device initialization - which has only to be done once
: init ( -- )
virtiodev virtio-serial-init drop
TRUE to initialized?
- \ Linux closes stdin at some point in prom_init(). This internally triggers a
- \ quiesce in SLOF. We must ensure stdout gets closed as well otherwise the
- \ device cannot be reset properly and the boot will hang.
- ['] virtio-serial-close-stdout add-quiesce-xt
+ \ virtiodev must be shutdown at quiesce so the device is reset properly.
+ \ The read and write methods can be called after quiesce so must handle
+ \ virtiodev being closed.
+ ['] shutdown add-quiesce-xt
;
0 VALUE open-count
@@ -62,8 +60,8 @@ virtiodev virtio-serial-init drop
open-count 0> IF
open-count 1 - dup to open-count
0= IF shutdown THEN
+ close
THEN
- close
;
: write ( addr len -- actual )