From: Jan Kiszka <jan.kiszka@web.de>
To: Anthony Liguori <anthony@codemonkey.ws>, Alexander Graf <agraf@suse.de>
Cc: Bastian Blank <waldi@debian.org>,
qemu-devel Developers <qemu-devel@nongnu.org>,
Aurelien Jarno <aurelien@aurel32.net>
Subject: [Qemu-devel] Re: [PATCH] [RESEND] Make char muxer more robust wrt small FIFOs
Date: Wed, 05 May 2010 09:33:40 +0200 [thread overview]
Message-ID: <4BE11F54.1030900@web.de> (raw)
In-Reply-To: <4BE05034.9060803@siemens.com>
[-- Attachment #1: Type: text/plain, Size: 4265 bytes --]
Jan Kiszka wrote:
> Anthony Liguori wrote:
>> On 05/04/2010 11:01 AM, Alexander Graf wrote:
>>> Am 04.05.2010 um 16:34 schrieb Anthony Liguori <anthony@codemonkey.ws>:
>>>
>>>> On 05/04/2010 09:30 AM, Alexander Graf wrote:
>>>>> Am 04.05.2010 um 15:44 schrieb Anthony Liguori <anthony@codemonkey.ws>:
>>>>>
>>>>>> On 04/20/2010 11:56 AM, Alexander Graf wrote:
>>>>>>> Virtio-Console can only process one character at a time. Using it
>>>>>>> on S390
>>>>>>> gave me strage "lags" where I got the character I pressed before when
>>>>>>> pressing one. So I typed in "abc" and only received "a", then
>>>>>>> pressed "d"
>>>>>>> but the guest received "b" and so on.
>>>>>>>
>>>>>>> While the stdio driver calls a poll function that just processes
>>>>>>> on its
>>>>>>> queue in case virtio-console can't take multiple characters at
>>>>>>> once, the
>>>>>>> muxer does not have such callbacks, so it can't empty its queue.
>>>>>>>
>>>>>>> To work around that limitation, I introduced a new timer that only
>>>>>>> gets
>>>>>>> active when the guest can not receive any more characters. In that
>>>>>>> case
>>>>>>> it polls again after a while to check if the guest is now
>>>>>>> receiving input.
>>>>>>>
>>>>>>> This patch fixes input when using -nographic on s390 for me.
>>>>>>>
>>>>>> I think this is really a kvm issue. I assume it's because s390
>>>>>> idles in the kernel so you never drop to userspace to repoll the
>>>>>> descriptor.
>>>>> There is no polling for the muxer. That's why it never knows when
>>>>> virtio-console can receive again.
>>>> Maybe I'm missing something simple, but it looks to me like the muxer
>>>> is polling. mux_chr_can_read() is going to eventually poll the muxed
>>>> devices to figure this out.
>>>>
>>>> If the root of the problem is that mux_chr_can_read() isn't being
>>>> invoked for a prolonged period of time, the real issue is the problem
>>>> I described.
>>> The problem is that the select list of fds includes the stdio fd, so
>>> that gets notified and is coupled with virtio-console, but there's
>>> nothing passing that on to mux and I don't think it'd be clever to
>>> expose internal data to the muxer to tell it about the backend fds.
>> When stdio is readable, it should invoke qemu_chr_read() with the read
>> data which in turn ought to invoke mux_chr_read().
>>
>> I'm not sure I understand what signalling is missing. Jan, does the
>> problem Alex describes ring a bell? I seem to recall you saying that
>> mux was still fundamentally broken but ought to work most of the time...
>
> That problem was (and still is) that the muxer needs to accept
> characters even if the active front-end device is not in order to filter
> out control sequences. Once its queue is full, it will start dropping
> those the active device would not if directly connected. Could only be
> solved via some peek service on pending front-end data.
>
> I think Alex' problem can be addressed by registering
> qemu_set_fd_handler2(..., backend->read_poll, mux_chr_read, ...). That
> means the backend has to tell us about its read poll handler (if any).
Nonsense.
In fact, the problem is the former issue: As the muxer reads the
character the front-end is currently unable to receive, polling may stop
until as the back-end has some further chars to deliver.
But interestingly, the stdio back-end has a (single-byte) fifo as well.
It just drives it a bit differently.
Alex, does this help as well?
diff --git a/qemu-char.c b/qemu-char.c
index ac65a1c..2b115a4 100644
--- a/qemu-char.c
+++ b/qemu-char.c
@@ -404,6 +404,8 @@ static int mux_chr_can_read(void *opaque)
MuxDriver *d = chr->opaque;
int m = d->focus;
+ mux_chr_accept_input(opaque);
+
if ((d->prod[m] - d->cons[m]) < MUX_BUFFER_SIZE)
return 1;
if (d->chr_can_read[m])
@@ -418,8 +420,6 @@ static void mux_chr_read(void *opaque, const uint8_t *buf, int size)
int m = d->focus;
int i;
- mux_chr_accept_input (opaque);
-
for(i = 0; i < size; i++)
if (mux_proc_byte(chr, d, buf[i])) {
if (d->prod[m] == d->cons[m] &&
I'm trying to reproduce in parallel.
Jan
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 257 bytes --]
next prev parent reply other threads:[~2010-05-05 7:33 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-04-20 16:56 [Qemu-devel] [PATCH] [RESEND] Make char muxer more robust wrt small FIFOs Alexander Graf
2010-05-04 13:44 ` Anthony Liguori
2010-05-04 14:30 ` Alexander Graf
2010-05-04 14:34 ` Anthony Liguori
2010-05-04 16:01 ` Alexander Graf
2010-05-04 16:25 ` Anthony Liguori
2010-05-04 16:49 ` Jan Kiszka
2010-05-05 7:33 ` Jan Kiszka [this message]
2010-05-05 8:08 ` [Qemu-devel] " Jan Kiszka
2010-05-05 12:46 ` Alexander Graf
2010-05-05 15:27 ` [Qemu-devel] [PATCH] char: Flush read buffer in mux_chr_can_read Jan Kiszka
2010-05-11 16:22 ` [Qemu-devel] " Alexander Graf
2010-05-11 16:29 ` Jan Kiszka
2010-05-11 16:35 ` Alexander Graf
2010-05-12 18:51 ` Jan Kiszka
2010-05-14 16:00 ` Alexander Graf
2010-05-14 16:17 ` Jan Kiszka
2010-05-15 5:31 ` Alexander Graf
2010-05-15 8:36 ` Jan Kiszka
2010-05-15 8:37 ` Alexander Graf
2010-05-15 8:54 ` Jan Kiszka
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4BE11F54.1030900@web.de \
--to=jan.kiszka@web.de \
--cc=agraf@suse.de \
--cc=anthony@codemonkey.ws \
--cc=aurelien@aurel32.net \
--cc=qemu-devel@nongnu.org \
--cc=waldi@debian.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.