kvm: convert "-machine kvm_shadow_mem" to an accelerator property

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

View File

@ -41,6 +41,7 @@
#include "hw/irq.h" #include "hw/irq.h"
#include "sysemu/sev.h" #include "sysemu/sev.h"
#include "sysemu/balloon.h" #include "sysemu/balloon.h"
#include "qapi/visitor.h"
#include "hw/boards.h" #include "hw/boards.h"
@ -92,6 +93,7 @@ struct KVMState
int max_nested_state_len; int max_nested_state_len;
int many_ioeventfds; int many_ioeventfds;
int intx_set_mask; int intx_set_mask;
int kvm_shadow_mem;
bool sync_mmu; bool sync_mmu;
bool manual_dirty_log_protect; bool manual_dirty_log_protect;
/* The man page (and posix) say ioctl numbers are signed int, but /* The man page (and posix) say ioctl numbers are signed int, but
@ -2954,6 +2956,40 @@ static bool kvm_accel_has_memory(MachineState *ms, AddressSpace *as,
return false; return false;
} }
static void kvm_get_kvm_shadow_mem(Object *obj, Visitor *v,
const char *name, void *opaque,
Error **errp)
{
KVMState *s = KVM_STATE(obj);
int64_t value = s->kvm_shadow_mem;
visit_type_int(v, name, &value, errp);
}
static void kvm_set_kvm_shadow_mem(Object *obj, Visitor *v,
const char *name, void *opaque,
Error **errp)
{
KVMState *s = KVM_STATE(obj);
Error *error = NULL;
int64_t value;
visit_type_int(v, name, &value, &error);
if (error) {
error_propagate(errp, error);
return;
}
s->kvm_shadow_mem = value;
}
static void kvm_accel_instance_init(Object *obj)
{
KVMState *s = KVM_STATE(obj);
s->kvm_shadow_mem = -1;
}
static void kvm_accel_class_init(ObjectClass *oc, void *data) static void kvm_accel_class_init(ObjectClass *oc, void *data)
{ {
AccelClass *ac = ACCEL_CLASS(oc); AccelClass *ac = ACCEL_CLASS(oc);
@ -2961,11 +2997,18 @@ static void kvm_accel_class_init(ObjectClass *oc, void *data)
ac->init_machine = kvm_init; ac->init_machine = kvm_init;
ac->has_memory = kvm_accel_has_memory; ac->has_memory = kvm_accel_has_memory;
ac->allowed = &kvm_allowed; ac->allowed = &kvm_allowed;
object_class_property_add(oc, "kvm-shadow-mem", "int",
kvm_get_kvm_shadow_mem, kvm_set_kvm_shadow_mem,
NULL, NULL, &error_abort);
object_class_property_set_description(oc, "kvm-shadow-mem",
"KVM shadow MMU size", &error_abort);
} }
static const TypeInfo kvm_accel_type = { static const TypeInfo kvm_accel_type = {
.name = TYPE_KVM_ACCEL, .name = TYPE_KVM_ACCEL,
.parent = TYPE_ACCEL, .parent = TYPE_ACCEL,
.instance_init = kvm_accel_instance_init,
.class_init = kvm_accel_class_init, .class_init = kvm_accel_class_init,
.instance_size = sizeof(KVMState), .instance_size = sizeof(KVMState),
}; };

View File

@ -216,33 +216,6 @@ static void machine_set_kernel_irqchip(Object *obj, Visitor *v,
} }
} }
static void machine_get_kvm_shadow_mem(Object *obj, Visitor *v,
const char *name, void *opaque,
Error **errp)
{
MachineState *ms = MACHINE(obj);
int64_t value = ms->kvm_shadow_mem;
visit_type_int(v, name, &value, errp);
}
static void machine_set_kvm_shadow_mem(Object *obj, Visitor *v,
const char *name, void *opaque,
Error **errp)
{
MachineState *ms = MACHINE(obj);
Error *error = NULL;
int64_t value;
visit_type_int(v, name, &value, &error);
if (error) {
error_propagate(errp, error);
return;
}
ms->kvm_shadow_mem = value;
}
static char *machine_get_kernel(Object *obj, Error **errp) static char *machine_get_kernel(Object *obj, Error **errp)
{ {
MachineState *ms = MACHINE(obj); MachineState *ms = MACHINE(obj);
@ -790,12 +763,6 @@ static void machine_class_init(ObjectClass *oc, void *data)
object_class_property_set_description(oc, "kernel-irqchip", object_class_property_set_description(oc, "kernel-irqchip",
"Configure KVM in-kernel irqchip", &error_abort); "Configure KVM in-kernel irqchip", &error_abort);
object_class_property_add(oc, "kvm-shadow-mem", "int",
machine_get_kvm_shadow_mem, machine_set_kvm_shadow_mem,
NULL, NULL, &error_abort);
object_class_property_set_description(oc, "kvm-shadow-mem",
"KVM shadow MMU size", &error_abort);
object_class_property_add_str(oc, "kernel", object_class_property_add_str(oc, "kernel",
machine_get_kernel, machine_set_kernel, &error_abort); machine_get_kernel, machine_set_kernel, &error_abort);
object_class_property_set_description(oc, "kernel", object_class_property_set_description(oc, "kernel",
@ -897,7 +864,6 @@ static void machine_initfn(Object *obj)
ms->kernel_irqchip_allowed = true; ms->kernel_irqchip_allowed = true;
ms->kernel_irqchip_split = mc->default_kernel_irqchip_split; ms->kernel_irqchip_split = mc->default_kernel_irqchip_split;
ms->kvm_shadow_mem = -1;
ms->dump_guest_core = true; ms->dump_guest_core = true;
ms->mem_merge = true; ms->mem_merge = true;
ms->enable_graphics = true; ms->enable_graphics = true;
@ -968,11 +934,6 @@ bool machine_kernel_irqchip_split(MachineState *machine)
return machine->kernel_irqchip_split; return machine->kernel_irqchip_split;
} }
int machine_kvm_shadow_mem(MachineState *machine)
{
return machine->kvm_shadow_mem;
}
int machine_phandle_start(MachineState *machine) int machine_phandle_start(MachineState *machine)
{ {
return machine->phandle_start; return machine->phandle_start;

View File

@ -66,7 +66,6 @@ bool machine_usb(MachineState *machine);
bool machine_kernel_irqchip_allowed(MachineState *machine); bool machine_kernel_irqchip_allowed(MachineState *machine);
bool machine_kernel_irqchip_required(MachineState *machine); bool machine_kernel_irqchip_required(MachineState *machine);
bool machine_kernel_irqchip_split(MachineState *machine); bool machine_kernel_irqchip_split(MachineState *machine);
int machine_kvm_shadow_mem(MachineState *machine);
int machine_phandle_start(MachineState *machine); int machine_phandle_start(MachineState *machine);
bool machine_dump_guest_core(MachineState *machine); bool machine_dump_guest_core(MachineState *machine);
bool machine_mem_merge(MachineState *machine); bool machine_mem_merge(MachineState *machine);
@ -278,7 +277,6 @@ struct MachineState {
bool kernel_irqchip_allowed; bool kernel_irqchip_allowed;
bool kernel_irqchip_required; bool kernel_irqchip_required;
bool kernel_irqchip_split; bool kernel_irqchip_split;
int kvm_shadow_mem;
char *dtb; char *dtb;
char *dumpdtb; char *dumpdtb;
int phandle_start; int phandle_start;

View File

@ -34,7 +34,6 @@ DEF("machine", HAS_ARG, QEMU_OPTION_machine, \
" supported accelerators are kvm, xen, hax, hvf, whpx or tcg (default: tcg)\n" " supported accelerators are kvm, xen, hax, hvf, whpx or tcg (default: tcg)\n"
" kernel_irqchip=on|off|split controls accelerated irqchip support (default=off)\n" " kernel_irqchip=on|off|split controls accelerated irqchip support (default=off)\n"
" vmport=on|off|auto controls emulation of vmport (default: auto)\n" " vmport=on|off|auto controls emulation of vmport (default: auto)\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"
" 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"
@ -74,8 +73,6 @@ Controls in-kernel irqchip support for the chosen accelerator when available.
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
is on. is on.
@item kvm_shadow_mem=size
Defines the size of the KVM shadow MMU.
@item dump-guest-core=on|off @item dump-guest-core=on|off
Include guest memory in a core dump. The default is on. Include guest memory in a core dump. The default is on.
@item mem-merge=on|off @item mem-merge=on|off
@ -118,6 +115,7 @@ 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" " igd-passthru=on|off (enable Xen integrated Intel graphics passthrough, default=off)\n"
" kvm-shadow-mem=size of KVM shadow MMU in bytes\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
@ -131,6 +129,8 @@ fails to initialize.
@item igd-passthru=on|off @item igd-passthru=on|off
When Xen is in use, this option controls whether Intel integrated graphics When Xen is in use, this option controls whether Intel integrated graphics
devices can be passed through to the guest (default=off) devices can be passed through to the guest (default=off)
@item kvm-shadow-mem=size
Defines the size of the KVM shadow MMU.
@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

View File

@ -2163,7 +2163,7 @@ int kvm_arch_init(MachineState *ms, KVMState *s)
} }
qemu_register_reset(kvm_unpoison_all, NULL); qemu_register_reset(kvm_unpoison_all, NULL);
shadow_mem = machine_kvm_shadow_mem(ms); shadow_mem = object_property_get_int(OBJECT(s), "kvm-shadow-mem", &error_abort);
if (shadow_mem != -1) { if (shadow_mem != -1) {
shadow_mem /= 4096; shadow_mem /= 4096;
ret = kvm_vm_ioctl(s, KVM_SET_NR_MMU_PAGES, shadow_mem); ret = kvm_vm_ioctl(s, KVM_SET_NR_MMU_PAGES, shadow_mem);

4
vl.c
View File

@ -2514,6 +2514,10 @@ static int machine_set_property(void *opaque,
object_register_sugar_prop(ACCEL_CLASS_NAME("xen"), qom_name, value); object_register_sugar_prop(ACCEL_CLASS_NAME("xen"), qom_name, value);
return 0; return 0;
} }
if (g_str_equal(qom_name, "kvm-shadow-mem")) {
object_register_sugar_prop(ACCEL_CLASS_NAME("kvm"), 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);
} }