xen: convert "-machine igd-passthru" to an accelerator property

The first machine property to fall is Xen's Intel integrated graphics
passthrough.  The "-machine igd-passthru" option does not set anymore
a property on the machine object, but desugars to a GlobalProperty on
accelerator objects.

The setter is very simple, since the value ends up in a
global variable, so this patch also provides an example before the more
complicated cases that follow it.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Paolo Bonzini 2019-11-13 10:56:53 +01:00
parent fe17413247
commit 46472d8232
6 changed files with 28 additions and 34 deletions

View File

@ -417,20 +417,6 @@ static void machine_set_graphics(Object *obj, bool value, Error **errp)
ms->enable_graphics = value; ms->enable_graphics = value;
} }
static bool machine_get_igd_gfx_passthru(Object *obj, Error **errp)
{
MachineState *ms = MACHINE(obj);
return ms->igd_gfx_passthru;
}
static void machine_set_igd_gfx_passthru(Object *obj, bool value, Error **errp)
{
MachineState *ms = MACHINE(obj);
ms->igd_gfx_passthru = value;
}
static char *machine_get_firmware(Object *obj, Error **errp) static char *machine_get_firmware(Object *obj, Error **errp)
{ {
MachineState *ms = MACHINE(obj); MachineState *ms = MACHINE(obj);
@ -867,12 +853,6 @@ static void machine_class_init(ObjectClass *oc, void *data)
object_class_property_set_description(oc, "graphics", object_class_property_set_description(oc, "graphics",
"Set on/off to enable/disable graphics emulation", &error_abort); "Set on/off to enable/disable graphics emulation", &error_abort);
object_class_property_add_bool(oc, "igd-passthru",
machine_get_igd_gfx_passthru, machine_set_igd_gfx_passthru,
&error_abort);
object_class_property_set_description(oc, "igd-passthru",
"Set on/off to enable/disable igd passthrou", &error_abort);
object_class_property_add_str(oc, "firmware", object_class_property_add_str(oc, "firmware",
machine_get_firmware, machine_set_firmware, machine_get_firmware, machine_set_firmware,
&error_abort); &error_abort);

View File

@ -11,7 +11,9 @@
#include "qemu/osdep.h" #include "qemu/osdep.h"
#include "qemu/error-report.h" #include "qemu/error-report.h"
#include "qemu/module.h" #include "qemu/module.h"
#include "qapi/error.h"
#include "hw/xen/xen-legacy-backend.h" #include "hw/xen/xen-legacy-backend.h"
#include "hw/xen/xen_pt.h"
#include "chardev/char.h" #include "chardev/char.h"
#include "sysemu/accel.h" #include "sysemu/accel.h"
#include "sysemu/runstate.h" #include "sysemu/runstate.h"
@ -124,6 +126,16 @@ static void xen_change_state_handler(void *opaque, int running,
} }
} }
static bool xen_get_igd_gfx_passthru(Object *obj, Error **errp)
{
return has_igd_gfx_passthru;
}
static void xen_set_igd_gfx_passthru(Object *obj, bool value, Error **errp)
{
has_igd_gfx_passthru = value;
}
static void xen_setup_post(MachineState *ms, AccelState *accel) static void xen_setup_post(MachineState *ms, AccelState *accel)
{ {
int rc; int rc;
@ -177,6 +189,12 @@ static void xen_accel_class_init(ObjectClass *oc, void *data)
ac->compat_props = g_ptr_array_new(); ac->compat_props = g_ptr_array_new();
compat_props_add(ac->compat_props, compat, G_N_ELEMENTS(compat)); compat_props_add(ac->compat_props, compat, G_N_ELEMENTS(compat));
object_class_property_add_bool(oc, "igd-passthru",
xen_get_igd_gfx_passthru, xen_set_igd_gfx_passthru,
&error_abort);
object_class_property_set_description(oc, "igd-passthru",
"Set on/off to enable/disable igd passthrou", &error_abort);
} }
#define TYPE_XEN_ACCEL ACCEL_CLASS_NAME("xen") #define TYPE_XEN_ACCEL ACCEL_CLASS_NAME("xen")

View File

@ -65,6 +65,8 @@
#include "qemu/range.h" #include "qemu/range.h"
#include "exec/address-spaces.h" #include "exec/address-spaces.h"
bool has_igd_gfx_passthru;
#define XEN_PT_NR_IRQS (256) #define XEN_PT_NR_IRQS (256)
static uint8_t xen_pt_mapped_machine_irq[XEN_PT_NR_IRQS] = {0}; static uint8_t xen_pt_mapped_machine_irq[XEN_PT_NR_IRQS] = {0};

View File

@ -287,7 +287,6 @@ struct MachineState {
bool mem_merge; bool mem_merge;
bool usb; bool usb;
bool usb_disabled; bool usb_disabled;
bool igd_gfx_passthru;
char *firmware; char *firmware;
bool iommu; bool iommu;
bool suppress_vmdesc; bool suppress_vmdesc;

View File

@ -37,7 +37,6 @@ DEF("machine", HAS_ARG, QEMU_OPTION_machine, \
" kvm_shadow_mem=size of KVM shadow MMU in bytes\n" " kvm_shadow_mem=size of KVM shadow MMU in bytes\n"
" dump-guest-core=on|off include guest memory in a core dump (default=on)\n" " dump-guest-core=on|off include guest memory in a core dump (default=on)\n"
" mem-merge=on|off controls memory merge support (default: on)\n" " mem-merge=on|off controls memory merge support (default: on)\n"
" igd-passthru=on|off controls IGD GFX passthrough support (default=off)\n"
" aes-key-wrap=on|off controls support for AES key wrapping (default=on)\n" " aes-key-wrap=on|off controls support for AES key wrapping (default=on)\n"
" dea-key-wrap=on|off controls support for DEA key wrapping (default=on)\n" " dea-key-wrap=on|off controls support for DEA key wrapping (default=on)\n"
" suppress-vmdesc=on|off disables self-describing migration (default=off)\n" " suppress-vmdesc=on|off disables self-describing migration (default=off)\n"
@ -71,8 +70,6 @@ more than one accelerator specified, the next one is used if the previous one
fails to initialize. fails to initialize.
@item kernel_irqchip=on|off @item kernel_irqchip=on|off
Controls in-kernel irqchip support for the chosen accelerator when available. Controls in-kernel irqchip support for the chosen accelerator when available.
@item gfx_passthru=on|off
Enables IGD GFX passthrough support for the chosen machine when available.
@item vmport=on|off|auto @item vmport=on|off|auto
Enables emulation of VMWare IO port, for vmmouse etc. auto says to select the Enables emulation of VMWare IO port, for vmmouse etc. auto says to select the
value based on accel. For accel=xen the default is off otherwise the default value based on accel. For accel=xen the default is off otherwise the default
@ -120,6 +117,7 @@ ETEXI
DEF("accel", HAS_ARG, QEMU_OPTION_accel, DEF("accel", HAS_ARG, QEMU_OPTION_accel,
"-accel [accel=]accelerator[,prop[=value][,...]]\n" "-accel [accel=]accelerator[,prop[=value][,...]]\n"
" select accelerator (kvm, xen, hax, hvf, whpx or tcg; use 'help' for a list)\n" " select accelerator (kvm, xen, hax, hvf, whpx or tcg; use 'help' for a list)\n"
" igd-passthru=on|off (enable Xen integrated Intel graphics passthrough, default=off)\n"
" tb-size=n (TCG translation block cache size)\n" " tb-size=n (TCG translation block cache size)\n"
" thread=single|multi (enable multi-threaded TCG)\n", QEMU_ARCH_ALL) " thread=single|multi (enable multi-threaded TCG)\n", QEMU_ARCH_ALL)
STEXI STEXI
@ -130,6 +128,9 @@ kvm, xen, hax, hvf, whpx or tcg can be available. By default, tcg is used. If th
more than one accelerator specified, the next one is used if the previous one more than one accelerator specified, the next one is used if the previous one
fails to initialize. fails to initialize.
@table @option @table @option
@item igd-passthru=on|off
When Xen is in use, this option controls whether Intel integrated graphics
devices can be passed through to the guest (default=off)
@item tb-size=@var{n} @item tb-size=@var{n}
Controls the size (in MiB) of the TCG translation block cache. Controls the size (in MiB) of the TCG translation block cache.
@item thread=single|multi @item thread=single|multi

14
vl.c
View File

@ -1133,13 +1133,6 @@ static void configure_msg(QemuOpts *opts)
} }
/* Now we still need this for compatibility with XEN. */
bool has_igd_gfx_passthru;
static void igd_gfx_passthru(void)
{
has_igd_gfx_passthru = current_machine->igd_gfx_passthru;
}
/***********************************************************/ /***********************************************************/
/* USB devices */ /* USB devices */
@ -2517,6 +2510,10 @@ static int machine_set_property(void *opaque,
if (g_str_equal(qom_name, "accel")) { if (g_str_equal(qom_name, "accel")) {
return 0; return 0;
} }
if (g_str_equal(qom_name, "igd-passthru")) {
object_register_sugar_prop(ACCEL_CLASS_NAME("xen"), qom_name, value);
return 0;
}
return object_parse_property_opt(opaque, name, value, "type", errp); return object_parse_property_opt(opaque, name, value, "type", errp);
} }
@ -4297,9 +4294,6 @@ int main(int argc, char **argv, char **envp)
exit(1); exit(1);
} }
/* Check if IGD GFX passthrough. */
igd_gfx_passthru();
/* init generic devices */ /* init generic devices */
rom_set_order_override(FW_CFG_ORDER_OVERRIDE_DEVICE); rom_set_order_override(FW_CFG_ORDER_OVERRIDE_DEVICE);
qemu_opts_foreach(qemu_find_opts("device"), qemu_opts_foreach(qemu_find_opts("device"),