[RFC PATCH] libxl: support configuring paravirtualized keyboard

Marek Marczykowski-Górecki marmarek at invisiblethingslab.com
Fri Jan 17 21:18:06 UTC 2020

Xen since 4.13 allows to configure whether PV vkb device is created or
not - instead of always creating it. Plug it into <input/> device
configuration and give the user a choice - setting PS2 keyboard disables
PV one, and setting XEN keyboard enables PV.

There is one issue with this approach: there are implicit keyboard and
mouse device added with bus 'ps2'. This is at least done by the xen-xl
-> libvirt xml config converter (why?). When one use a config generated
this way, this commit will make behavior change - PV keyboard will get
disabled. I'm not sure if that's a big issue - both keyboards works.
Can it be this way? Or maybe some better idea how to represent
vkb_device option in libvirt xml?

Once the above is sorted out (or chosen to ignore), I'll send updated
patch with tests and config converter support.

Because the implicit keyboard is added, I also avoided to reject keybord
device on too old Xen versions. This means <input type='keyboard'
bus='xen'/> will be _silently_ ignored on older Xen.

Signed-off-by: Marek Marczykowski-Górecki <marmarek at invisiblethingslab.com>
 src/libxl/libxl_conf.c | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c
index 27de67d266..0999fb5678 100644
--- a/src/libxl/libxl_conf.c
+++ b/src/libxl/libxl_conf.c
@@ -637,6 +637,24 @@ libxlMakeDomBuildInfo(virDomainDefPtr def,
         for (i = 0; i < def->ninputs; i++) {
             char **usbdevice;
+            if (def->inputs[i]->type == VIR_DOMAIN_INPUT_TYPE_KBD) {
+                switch (def->inputs[i]->bus) {
+                    case VIR_DOMAIN_INPUT_BUS_PS2:
+                        libxl_defbool_set(&b_info->u.hvm.vkb_device, false);
+                        break;
+                    case VIR_DOMAIN_INPUT_BUS_XEN:
+                        libxl_defbool_set(&b_info->u.hvm.vkb_device, true);
+                        break;
+                    case VIR_DOMAIN_INPUT_BUS_VIRTIO:
+                    default:
+                        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                                _("libxenlight supports only ps2/xen keyboard device"));
+                        return -1;
+                }
+            }
             if (def->inputs[i]->bus != VIR_DOMAIN_INPUT_BUS_USB)

More information about the libvir-list mailing list