Virtio-serial API: Difference between revisions
From KVM
No edit summary |
No edit summary |
||
Line 9: | Line 9: | ||
|symlinks from <code> /dev/virtio-port/<portname> </code> to <code> /dev/vportNpn </code> as mentioned in [http://www.linux-kvm.org/page/VMchannel_Requirements#Invocation Invocation] and [http://fedoraproject.org/wiki/Features/VirtioSerial#How_To_Test How To Test] | |symlinks from <code> /dev/virtio-port/<portname> </code> to <code> /dev/vportNpn </code> as mentioned in [http://www.linux-kvm.org/page/VMchannel_Requirements#Invocation Invocation] and [http://fedoraproject.org/wiki/Features/VirtioSerial#How_To_Test How To Test] | ||
|In Windows, port enumeration can be done using SetupAPI functions. For | |In Windows, port enumeration can be done using SetupAPI functions. For | ||
more information please | more information please see [http://git.kernel.org/?p=virt/kvm/kvm-guest-drivers-windows.git;a=blob_plain;f=vioserial/app/device.cpp;hb=48b3a3f78fe4711d1561b32c9a1c0ca6471f85e3#GetDevicePath GetDevicePath] or visit [http://msdn.microsoft.com/en-us/library/cc185682%28VS.85%29.aspx#Setup_API Setup API] | ||
|- | |- | ||
|Opening port | |Opening port |
Revision as of 15:15, 27 September 2010
Guest API
Function | Linux guest | Windows guest |
---|---|---|
Port discovery | symlinks from /dev/virtio-port/<portname> to /dev/vportNpn as mentioned in Invocation and How To Test
|
In Windows, port enumeration can be done using SetupAPI functions. For
more information please see GetDevicePath or visit Setup API |
Opening port | open(2)
|
HANDLE WINAPI CreateFile(
|
Reading | read(2)
|
BOOL WINAPI ReadFile(
|
Writing | write(2)
|
BOOL WINAPI WriteFile(
|
Poll | poll()
| |
Asynchronous notifications | signal(7)
|
For an example of a C program that uses the virtio-serial Linux guest API, see auto-virtserial-guest.c
Host API
There's an in-qemu host API exposed by the virtio-serial code. The following is true for the in-qemu API for qemu version 0.13 and for the qemu version found in Red Hat Enterprise Linux 6.0, straight from hw/virtio-serial.h:
|
In addition to this, the VirtIOSerialPortInfo struct has a function pointer for a callback to be called when guest writes some data to the port:
|
For an example use of this API, see hw/virtio-console.c
Caveats
- Live Migration
- When a VM uses the qemu chardev interface to talk to guest virtio-serial ports, the chardev file will be closed on the source (and may be opened on the destination). Host applications have to be aware of such migration and either collaborate with libvirt or have their own mechanism to re-connect to the destination host and continue the communication.
- A future version of qemu may introduce 'migration notifiers' that may help chardevs let apps know of migration start / stop.
- qemu chardevs
- qemu's chardevs are notoriously out of date from the state-of-the-art and need a complete rewrite to be pleasurable to use.
- However respecting the return values from the various read/write calls to chardevs will help in ensuring data is never lost. The various backends (unix, tcp sockets, file, etc.) do work well when used with care.