@@ -618,6 +618,7 @@ struct kvm_ppc_smmu_info {
#define KVM_CAP_PPC_GET_SMMU_INFO 78
#define KVM_CAP_S390_COW 79
#define KVM_CAP_PPC_ALLOC_HTAB 80
+#define KVM_CAP_PLE 83
#ifdef KVM_CAP_IRQ_ROUTING
@@ -769,6 +770,8 @@ struct kvm_msi {
struct kvm_userspace_memory_region)
#define KVM_SET_TSS_ADDR _IO(KVMIO, 0x47)
#define KVM_SET_IDENTITY_MAP_ADDR _IOW(KVMIO, 0x48, __u64)
+#define KVM_SET_PLE_GAP _IOW(KVMIO, 0x49, __u32)
+#define KVM_SET_PLE_WINDOW _IOW(KVMIO, 0x4a, __u32)
/* enable ucontrol for s390 */
struct kvm_s390_ucas_mapping {
@@ -98,6 +98,22 @@ given, the total number of CPUs @var{n} can be omitted. @var{maxcpus}
specifies the maximum number of hotpluggable CPUs.
ETEXI
+DEF("ple-gap", HAS_ARG, QEMU_OPTION_ple_gap,
+ "-ple-gap n Set ple_gap per vm\n", QEMU_ARCH_I386)
+STEXI
+@item -ple-gap @var{n}
+@findex -ple-gap
+Set ple_gap to vm.
+ETEXI
+
+DEF("ple-window", HAS_ARG, QEMU_OPTION_ple_window,
+ "-ple-window n Set ple_window per vm\n", QEMU_ARCH_I386)
+STEXI
+@item -ple-window @var{n}
+@findex -ple-window
+Set ple_gap to vm.
+ETEXI
+
DEF("numa", HAS_ARG, QEMU_OPTION_numa,
"-numa node[,mem=size][,cpus=cpu[-cpu]][,nodeid=node]\n", QEMU_ARCH_ALL)
STEXI
@@ -130,6 +130,8 @@ extern uint8_t *boot_splash_filedata;
extern int boot_splash_filedata_size;
extern uint8_t qemu_extra_params_fw[2];
extern QEMUClock *rtc_clock;
+extern int32_t ple_gap;
+extern int32_t ple_window;
#define MAX_NODES 64
#define MAX_CPUMASK_BITS 255
@@ -724,6 +724,19 @@ int kvm_arch_init(KVMState *s)
}
}
}
+
+ if (kvm_check_extension(s, KVM_CAP_PLE) && (ple_gap != 0)) {
+ ret = kvm_vm_ioctl(s, KVM_SET_PLE_GAP, ple_gap);
+ if (ret < 0) {
+ fprintf(stderr, "kvm_set_ple_gap failed\n");
+ return ret;
+ }
+ ret = kvm_vm_ioctl(s, KVM_SET_PLE_WINDOW, ple_window);
+ if (ret < 0) {
+ fprintf(stderr, "kvm_set_ple_window failed\n");
+ return ret;
+ }
+ }
return 0;
}
@@ -234,6 +234,9 @@ uint8_t *boot_splash_filedata;
int boot_splash_filedata_size;
uint8_t qemu_extra_params_fw[2];
+int32_t ple_gap = 0;
+int32_t ple_window = 0;
+
typedef struct FWBootEntry FWBootEntry;
struct FWBootEntry {
@@ -2590,6 +2593,32 @@ int main(int argc, char **argv, char **envp)
}
}
break;
+ case QEMU_OPTION_ple_gap:
+ {
+ int32_t value;
+ char *end;
+
+ value = strtol(optarg, &end, 10);
+ if (value < 0 || *end) {
+ fprintf(stderr, "qemu: invalid ple_gap vaule: %s\n", optarg);
+ exit(1);
+ }
+ ple_gap = value;
+ }
+ break;
+ case QEMU_OPTION_ple_window:
+ {
+ int32_t value;
+ char *end;
+
+ value = strtol(optarg, &end, 10);
+ if (value < 0 || *end) {
+ fprintf(stderr, "qemu: invalid ple_gap vaule: %s\n", optarg);
+ exit(1);
+ }
+ ple_window = value;
+ }
+ break;
case QEMU_OPTION_numa:
if (nb_numa_nodes >= MAX_NODES) {
fprintf(stderr, "qemu: too many NUMA nodes\n");
QEMU: Add "-ple-gap" and "-ple-window" options for per domain PLE Signed-off-by: Xuekun Hu <xuekun.hu@intel.com> --- linux-headers/linux/kvm.h | 3 +++ qemu-options.hx | 16 ++++++++++++++++ sysemu.h | 2 ++ target-i386/kvm.c | 13 +++++++++++++ vl.c | 29 +++++++++++++++++++++++++++++ 5 files changed, 63 insertions(+), 0 deletions(-)