diff mbox

Enable async page faults

Message ID 1373384866-36233-2-git-send-email-dingel@linux.vnet.ibm.com
State New
Headers show

Commit Message

Dominik Dingel July 9, 2013, 3:47 p.m. UTC
S390 can also use async page faults, to enhance guest scheduling.
But in the case of live migration we want to disable the feature and know
if there are still notifications in flight.

Signed-off-by: Dominik Dingel <dingel@linux.vnet.ibm.com>
---
 target-s390x/kvm.c | 42 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 42 insertions(+)

Comments

Andreas Färber July 10, 2013, 12:59 a.m. UTC | #1
Am 09.07.2013 17:47, schrieb Dominik Dingel:
> S390 can also use async page faults, to enhance guest scheduling.
> But in the case of live migration we want to disable the feature and know
> if there are still notifications in flight.
> 
> Signed-off-by: Dominik Dingel <dingel@linux.vnet.ibm.com>
> ---
>  target-s390x/kvm.c | 42 ++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 42 insertions(+)
> 
> diff --git a/target-s390x/kvm.c b/target-s390x/kvm.c
> index 42f758f..61df7d4 100644
> --- a/target-s390x/kvm.c
> +++ b/target-s390x/kvm.c
> @@ -36,6 +36,7 @@
>  #include "sysemu/device_tree.h"
>  #include "qapi/qmp/qjson.h"
>  #include "monitor/monitor.h"
> +#include "migration/migration.h"
>  
>  /* #define DEBUG_KVM */
>  
> @@ -92,9 +93,50 @@ const KVMCapabilityInfo kvm_arch_required_capabilities[] = {
>  
>  static int cap_sync_regs;
>  
> +static int apf_disable(QEMUFile *f, void *opaque)
> +{
> +    kvm_vm_ioctl(opaque, KVM_S390_APF_DISABLE);

Better don't pass opaques directly as a typed argument, especially in a
KVM file not widely tested; we just had such a runtime breakage.
KVMState *s = opaque; elegantly avoids it here and improves readability.

Regards,
Andreas

> +    return 0;
> +}
> +
> +static void apf_enable(void *opaque)
> +{
> +    kvm_vm_ioctl(opaque, KVM_S390_APF_ENABLE);
> +}
> +
> +static int apf_finish(QEMUFile *f, void *opaque, int version_id)
> +{
> +    apf_enable(opaque);
> +    return 0;
> +}
> +
> +static uint64_t apf_status(QEMUFile *f, void *opaque, uint64_t max_size)
> +{
> +    uint64_t rc = 0;
> +
> +    if (kvm_vm_ioctl(opaque, KVM_S390_APF_STATUS) !=
> +        KVM_S390_APF_DISABLED_NON_PENDING) {
> +        rc = 0xff0000;
> +    }
> +    return rc;
> +}
> +
> +SaveVMHandlers savevm_apf_handlers = {
> +    .save_live_setup = apf_disable,
> +    .save_live_iterate = NULL,
> +    .save_live_complete = NULL,
> +    .save_live_pending = apf_status,
> +    .load_state = apf_finish,
> +    .cancel = apf_enable,
> +};
> +
>  int kvm_arch_init(KVMState *s)
>  {
>      cap_sync_regs = kvm_check_extension(s, KVM_CAP_SYNC_REGS);
> +    if (kvm_check_extension(s, KVM_CAP_ASYNC_PF)) {
> +        register_savevm_live(NULL, "apf", -1, 1, &savevm_apf_handlers, s);
> +        kvm_vm_ioctl(s, KVM_S390_APF_ENABLE);
> +    }
>      return 0;
>  }
>  
>
diff mbox

Patch

diff --git a/target-s390x/kvm.c b/target-s390x/kvm.c
index 42f758f..61df7d4 100644
--- a/target-s390x/kvm.c
+++ b/target-s390x/kvm.c
@@ -36,6 +36,7 @@ 
 #include "sysemu/device_tree.h"
 #include "qapi/qmp/qjson.h"
 #include "monitor/monitor.h"
+#include "migration/migration.h"
 
 /* #define DEBUG_KVM */
 
@@ -92,9 +93,50 @@  const KVMCapabilityInfo kvm_arch_required_capabilities[] = {
 
 static int cap_sync_regs;
 
+static int apf_disable(QEMUFile *f, void *opaque)
+{
+    kvm_vm_ioctl(opaque, KVM_S390_APF_DISABLE);
+    return 0;
+}
+
+static void apf_enable(void *opaque)
+{
+    kvm_vm_ioctl(opaque, KVM_S390_APF_ENABLE);
+}
+
+static int apf_finish(QEMUFile *f, void *opaque, int version_id)
+{
+    apf_enable(opaque);
+    return 0;
+}
+
+static uint64_t apf_status(QEMUFile *f, void *opaque, uint64_t max_size)
+{
+    uint64_t rc = 0;
+
+    if (kvm_vm_ioctl(opaque, KVM_S390_APF_STATUS) !=
+        KVM_S390_APF_DISABLED_NON_PENDING) {
+        rc = 0xff0000;
+    }
+    return rc;
+}
+
+SaveVMHandlers savevm_apf_handlers = {
+    .save_live_setup = apf_disable,
+    .save_live_iterate = NULL,
+    .save_live_complete = NULL,
+    .save_live_pending = apf_status,
+    .load_state = apf_finish,
+    .cancel = apf_enable,
+};
+
 int kvm_arch_init(KVMState *s)
 {
     cap_sync_regs = kvm_check_extension(s, KVM_CAP_SYNC_REGS);
+    if (kvm_check_extension(s, KVM_CAP_ASYNC_PF)) {
+        register_savevm_live(NULL, "apf", -1, 1, &savevm_apf_handlers, s);
+        kvm_vm_ioctl(s, KVM_S390_APF_ENABLE);
+    }
     return 0;
 }