Skip to content

Commit

Permalink
Merge remote-tracking branch 'remotes/amit/tags/vser-for-2.3-3' into …
Browse files Browse the repository at this point in the history
…staging

virtio-serial api: guest_writable callback for users

# gpg: Signature made Thu Mar 19 12:06:55 2015 GMT using RSA key ID 854083B6
# gpg: Good signature from "Amit Shah <amit@amitshah.net>"
# gpg:                 aka "Amit Shah <amit@kernel.org>"
# gpg:                 aka "Amit Shah <amitshah@gmx.net>"

* remotes/amit/tags/vser-for-2.3-3:
  virtio: serial: expose a 'guest_writable' callback for users

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
  • Loading branch information
pm215 committed Mar 19, 2015
2 parents 7a9a5e7 + 4add73a commit 33a8d5b
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 0 deletions.
31 changes: 31 additions & 0 deletions hw/char/virtio-serial-bus.c
Original file line number Diff line number Diff line change
Expand Up @@ -465,6 +465,37 @@ static void handle_output(VirtIODevice *vdev, VirtQueue *vq)

static void handle_input(VirtIODevice *vdev, VirtQueue *vq)
{
/*
* Users of virtio-serial would like to know when guest becomes
* writable again -- i.e. if a vq had stuff queued up and the
* guest wasn't reading at all, the host would not be able to
* write to the vq anymore. Once the guest reads off something,
* we can start queueing things up again. However, this call is
* made for each buffer addition by the guest -- even though free
* buffers existed prior to the current buffer addition. This is
* done so as not to maintain previous state, which will need
* additional live-migration-related changes.
*/
VirtIOSerial *vser;
VirtIOSerialPort *port;
VirtIOSerialPortClass *vsc;

vser = VIRTIO_SERIAL(vdev);
port = find_port_by_vq(vser, vq);

if (!port) {
return;
}
vsc = VIRTIO_SERIAL_PORT_GET_CLASS(port);

/*
* If guest_connected is false, this call is being made by the
* early-boot queueing up of descriptors, which is just noise for
* the host apps -- don't disturb them in that case.
*/
if (port->guest_connected && port->host_connected && vsc->guest_writable) {
vsc->guest_writable(port);
}
}

static uint32_t get_features(VirtIODevice *vdev, uint32_t features)
Expand Down
11 changes: 11 additions & 0 deletions include/hw/virtio/virtio-serial.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,17 @@ typedef struct VirtIOSerialPortClass {
/* Guest is now ready to accept data (virtqueues set up). */
void (*guest_ready)(VirtIOSerialPort *port);

/*
* Guest has enqueued a buffer for the host to write into.
* Called each time a buffer is enqueued by the guest;
* irrespective of whether there already were free buffers the
* host could have consumed.
*
* This is dependent on both the guest and host end being
* connected.
*/
void (*guest_writable)(VirtIOSerialPort *port);

/*
* Guest wrote some data to the port. This data is handed over to
* the app via this callback. The app can return a size less than
Expand Down

0 comments on commit 33a8d5b

Please sign in to comment.