diff --git a/qemu-config.c b/qemu-config.c index b030205e23..95bf5e5202 100644 --- a/qemu-config.c +++ b/qemu-config.c @@ -535,6 +535,10 @@ static QemuOptsList qemu_machine_opts = { .name = "kernel_irqchip", .type = QEMU_OPT_BOOL, .help = "use KVM in-kernel irqchip", + }, { + .name = "kvm_shadow_mem", + .type = QEMU_OPT_SIZE, + .help = "KVM shadow MMU size", }, { /* End of list */ } }, diff --git a/qemu-options.hx b/qemu-options.hx index 19906e57e1..4ad1fc72fd 100644 --- a/qemu-options.hx +++ b/qemu-options.hx @@ -32,7 +32,8 @@ DEF("machine", HAS_ARG, QEMU_OPTION_machine, \ " selects emulated machine (-machine ? for list)\n" " property accel=accel1[:accel2[:...]] selects accelerator\n" " supported accelerators are kvm, xen, tcg (default: tcg)\n" - " kernel_irqchip=on|off controls accelerated irqchip support\n", + " kernel_irqchip=on|off controls accelerated irqchip support\n" + " kvm_shadow_mem=size of KVM shadow MMU\n", QEMU_ARCH_ALL) STEXI @item -machine [type=]@var{name}[,prop=@var{value}[,...]] @@ -47,6 +48,8 @@ than one accelerator specified, the next one is used if the previous one fails to initialize. @item kernel_irqchip=on|off Enables in-kernel irqchip support for the chosen accelerator when available. +@item kvm_shadow_mem=size +Defines the size of the KVM shadow MMU. @end table ETEXI diff --git a/target-i386/kvm.c b/target-i386/kvm.c index e41de394d2..445c06082c 100644 --- a/target-i386/kvm.c +++ b/target-i386/kvm.c @@ -646,7 +646,9 @@ static int kvm_get_supported_msrs(KVMState *s) int kvm_arch_init(KVMState *s) { + QemuOptsList *list = qemu_find_opts("machine"); uint64_t identity_base = 0xfffbc000; + uint64_t shadow_mem; int ret; struct utsname utsname; @@ -693,6 +695,17 @@ int kvm_arch_init(KVMState *s) } qemu_register_reset(kvm_unpoison_all, NULL); + if (!QTAILQ_EMPTY(&list->head)) { + shadow_mem = qemu_opt_get_size(QTAILQ_FIRST(&list->head), + "kvm_shadow_mem", -1); + if (shadow_mem != -1) { + shadow_mem /= 4096; + ret = kvm_vm_ioctl(s, KVM_SET_NR_MMU_PAGES, shadow_mem); + if (ret < 0) { + return ret; + } + } + } return 0; }