[SLOF] [PATCH v2 1/2] virtio-serial: Make read and write methods report failure
Jordan Niethe
jniethe5 at gmail.com
Fri Sep 8 16:43:03 AEST 2023
On Thu, Sep 7, 2023 at 1:37 PM Alexey Kardashevskiy <aik at ozlabs.ru> wrote:
>
>
> On 04/09/2023 15:19, Jordan Niethe wrote:
> > On Mon, Sep 4, 2023 at 3:08 PM Alexey Kardashevskiy <aik at ozlabs.ru> wrote:
> >>
> >>
> >> On 29/08/2023 10:12, Jordan Niethe wrote:
> >>> From: Kautuk Consul <kconsul at linux.vnet.ibm.com>
> >>>
> >>> The read and write methods return successfully even if the virtio device
> >>> is closed (virtiodev is 0) and it is not able to send or receive any
> >>> characters.
> >>>
> >>> Make the read and write methods return 0 to indicate they did not
> >>> succeed in this case.
> >>>
> >>> This also fixes an invalid stack access in the read method.
> >>>
> >>> Fixes: 8174acd ("virtio-serial: Close device completely")
> >>> Signed-off-by: Kautuk Consul <kconsul at linux.vnet.ibm.com>
> >>> Signed-off-by: Jordan Niethe <jniethe5 at gmail.com>
> >>> ---
> >>> v2:
> >>> - Rework commit message slightly
> >>> ---
> >>> board-qemu/slof/virtio-serial.fs | 4 ++--
> >>> 1 file changed, 2 insertions(+), 2 deletions(-)
> >>>
> >>> diff --git a/board-qemu/slof/virtio-serial.fs b/board-qemu/slof/virtio-serial.fs
> >>> index 82868e2..41e2e04 100644
> >>> --- a/board-qemu/slof/virtio-serial.fs
> >>> +++ b/board-qemu/slof/virtio-serial.fs
> >>> @@ -67,7 +67,7 @@ virtiodev virtio-serial-init drop
> >>> ;
> >>>
> >>> : write ( addr len -- actual )
> >>> - virtiodev 0= IF nip EXIT THEN
> >>> + virtiodev 0= IF 2drop 0 EXIT THEN
> >>> tuck
> >>> 0 ?DO
> >>> dup c@ virtiodev SWAP virtio-serial-putchar
> >>> @@ -78,7 +78,7 @@ virtiodev virtio-serial-init drop
> >>>
> >>> : read ( addr len -- actual )
> >>> 0= IF drop 0 EXIT THEN
> >>> - virtiodev 0= IF nip EXIT THEN
> >>> + virtiodev 0= IF drop 0 EXIT THEN
> >>
> >>
> >> This is going to leave @addr on stack, no? The write gets it right though.
> >
> > The read method begins with 0= which consumes top of stack.
> > The write method does not have that which is why they are different.
>
> ah, you're right. I dislike forth :)
>
> btw since now these do report failures (or, to be precise, 0 chars
> written/read which is not exactly an error),
I think it can be described as reporting failure based on the ieee1275
descriptions of
read and write:
- "If actual is zero or negative, the read operation did not succeed"
- "If actual is less than len, the write did not succeed"
> what effect does it have?
> For example, something is writing a buffer in a loop to a device and
> incrementing some counter by the value returned by "write" and now it
> returns 0 instead of passed "len", or there is nothing like this?
I was worried about that too. The v1 of the series fixed the stack
misaccess but still reported success.
AFAICS, that only callers of the read and write methods are
term-io-key and term-io-emit.
term-io-emit ignores the return value of the write method.
term-io-key will call read until it returns >= 0.
So if "read" is called with the virtiodev == 0 it will loop forever.
prom_init closes stdin prior to quiescing so it won't happen there,
but it is conceivable of a client that calls quiesce and then tries to
read from stdin and then gets trapped.
We could add some circuit breaker to term-io-key?
Or just keep the read and write methods reporting success?
>
> >
> >>
> >>
> >>> virtiodev virtio-serial-haschar 0= IF 0 swap c! -2 EXIT THEN
> >>> virtiodev virtio-serial-getchar swap c! 1
> >>> ;
> >>
> >> --
> >> Alexey
> >>
> >>
>
> --
> Alexey
>
>
More information about the SLOF
mailing list