[RFC PATCH] libxl: support configuring paravirtualized keyboard

Marek Marczykowski-Górecki posted 1 patch 4 years, 3 months ago
Test syntax-check failed
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/libvirt tags/patchew/20200117211806.1179-1-marmarek@invisiblethingslab.com
src/libxl/libxl_conf.c | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
[RFC PATCH] libxl: support configuring paravirtualized keyboard
Posted by Marek Marczykowski-Górecki 4 years, 3 months ago
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@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;
 
+#ifdef LIBXL_HAVE_BUILDINFO_VKB_DEVICE
+            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;
+                }
+            }
+#endif
+
             if (def->inputs[i]->bus != VIR_DOMAIN_INPUT_BUS_USB)
                 continue;
 
-- 
2.21.0