char: introduce tx queue to enable Unix style flow control
commitb7d3b99372c0d34f9b94ad36fa4ec811d9a7d753
authorAnthony Liguori <aliguori@us.ibm.com>
Fri, 29 Jul 2011 16:12:47 +0000 (29 11:12 -0500)
committerAnthony Liguori <aliguori@us.ibm.com>
Sun, 14 Aug 2011 16:55:51 +0000 (14 11:55 -0500)
tree5977f05310eb78f05e65acd621ebc34cc778d19a
parentd399e75b396cfe82e9c6f6b6c483c691fc2e69a4
char: introduce tx queue to enable Unix style flow control

The char layer tries very hard to avoid using an intermediate buffer.  The
implication of this is that when the backend does a write(), the data for that
write must be immediately passed to the front end.

Flow control is needed to handle the likely event that the front end is not
able to handle the data at this point in time.  We implement flow control
today by allowing the front ends to register a polling function.  The polling
function returns non-zero when it is able to receive data.

This works okay because most backends are tied to some sort of file descriptor
and our main loop allows polling to be included with file descriptor
registration.

This falls completely apart when dealing with the front end writing to the
back end though because the front end (devices) don't have an obvious place to
integrate polling.

Short summary: we're broken by design.  A way to fix this is to eliminate
polling entirely and use a Unix style flow control mechanism.  This involves
using an intermediate buffer and allowing registration of notifications when
the buffer either has data in it (readability) or is not full (writability).

This patch introduces a queue and uses it for front end -> back end writes.

Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
qemu-char.c
qemu-char.h