Patchwork QEMU: Add "-ple-gap" and "-ple-window" options for per domain PLE

login
register
mail settings
Submitter Hu, Xuekun
Date Oct. 16, 2012, 6:53 a.m.
Message ID <88A92D351643BA4CB23E3031551706260FD89CCF@SHSMSX102.ccr.corp.intel.com>
Download mbox | patch
Permalink /patch/191733/
State New
Headers show

Comments

Hu, Xuekun - Oct. 16, 2012, 6:53 a.m.
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(-)

Patch

diff --git a/linux-headers/linux/kvm.h b/linux-headers/linux/kvm.h
index 4b9e575..a32c68a 100644
--- a/linux-headers/linux/kvm.h
+++ b/linux-headers/linux/kvm.h
@@ -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 {
diff --git a/qemu-options.hx b/qemu-options.hx
index 3cd9243..c1c5c7b 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -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
diff --git a/sysemu.h b/sysemu.h
index b38b1a3..e25d111 100644
--- a/sysemu.h
+++ b/sysemu.h
@@ -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
diff --git a/target-i386/kvm.c b/target-i386/kvm.c
index 5b18383..12e0b2a 100644
--- a/target-i386/kvm.c
+++ b/target-i386/kvm.c
@@ -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;
 }
 
diff --git a/vl.c b/vl.c
index a1c0aa7..96dbc4b 100644
--- a/vl.c
+++ b/vl.c
@@ -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");