@@ -1809,7 +1809,26 @@ static int libxl__build_device_model_args_new(libxl__gc *gc,
flexarray_append(dm_args, b_info->extra_pv[i]);
break;
case LIBXL_DOMAIN_TYPE_HVM:
- if (!libxl_defbool_val(b_info->u.hvm.xen_platform_pci)) {
+ if (libxl_defbool_val(b_info->u.hvm.gfx_passthru)) {
+ enum libxl_gfx_passthru_kind gfx_passthru_kind =
+ libxl__detect_gfx_passthru_kind(gc, guest_config);
+ switch (gfx_passthru_kind) {
+ case LIBXL_GFX_PASSTHRU_KIND_IGD:
+ /*
+ * Using the machine "pc" because with the default machine "xenfv"
+ * the xen-platform device will be assigned to slot 2, but with
+ * GFX_PASSTHRU_KIND_IGD, slot 2 needs to be reserved for the Intel IGD.
+ */
+ machinearg = libxl__strdup(gc, "pc,accel=xen,suppress-vmdesc=on,igd-passthru=on");
+ break;
+ case LIBXL_GFX_PASSTHRU_KIND_DEFAULT:
+ LOGD(ERROR, guest_domid, "unable to detect required gfx_passthru_kind");
+ return ERROR_FAIL;
+ default:
+ LOGD(ERROR, guest_domid, "invalid value for gfx_passthru_kind");
+ return ERROR_INVAL;
+ }
+ } else if (!libxl_defbool_val(b_info->u.hvm.xen_platform_pci)) {
/* Switching here to the machine "pc" which does not add
* the xen-platform device instead of the default "xenfv" machine.
*/
@@ -1831,22 +1850,6 @@ static int libxl__build_device_model_args_new(libxl__gc *gc,
}
}
- if (libxl_defbool_val(b_info->u.hvm.gfx_passthru)) {
- enum libxl_gfx_passthru_kind gfx_passthru_kind =
- libxl__detect_gfx_passthru_kind(gc, guest_config);
- switch (gfx_passthru_kind) {
- case LIBXL_GFX_PASSTHRU_KIND_IGD:
- machinearg = GCSPRINTF("%s,igd-passthru=on", machinearg);
- break;
- case LIBXL_GFX_PASSTHRU_KIND_DEFAULT:
- LOGD(ERROR, guest_domid, "unable to detect required gfx_passthru_kind");
- return ERROR_FAIL;
- default:
- LOGD(ERROR, guest_domid, "invalid value for gfx_passthru_kind");
- return ERROR_INVAL;
- }
- }
-
flexarray_append(dm_args, machinearg);
for (i = 0; b_info->extra_hvm && b_info->extra_hvm[i] != NULL; i++)
flexarray_append(dm_args, b_info->extra_hvm[i]);
The default qemu upstream "xenfv" machine type that is used when an HVM guest is configured for Intel IGD passthrough assigns slot 2 to the xen platform pci device. It is a requirement that slot 2 be assigned to the Intel IGD when it is passed through as the primary graphics adapter. Using the "pc" machine type instead of the "xenfv" machine type in that case makes it possible for qemu upstream to assign slot 2 to the IGD. Using the qemu "pc" machine and adding the xen platform device on the qemu command line instead of using the qemu "xenfv" machine which automatically adds the xen platform device earlier in the guest creation process does come with some degredation of startup performance: startup is slower and some vga drivers in use during early boot are unable to display the screen at the native resolution of the monitor, but once the guest operating system (Windows or Linux) is fully loaded, there is no noticeable difference in the performance of the guest when using the "pc" machine type instead of the "xenfv" machine type. With this patch, libxl continues to use default "xenfv" machine type with the default settings of xen_platform_pci enabled and igd gfx_passthru disabled. The patch only affects machines configured with gfx_passthru enabled. Signed-off-by: Chuck Zmudzinski <brchuckz@aol.com> --- Reviewers might find this patch easier to review by looking at the resulting code in the patched file instead of looking at the diff because it is hard to follow the logical flow of the resulting code in the diff because the patch moves the check for igd gfx_passthru before the check for disabling the xen platform device. That change was made because it results in a more simplified logical flow in the resulting code. tools/libs/light/libxl_dm.c | 37 ++++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 17 deletions(-)