Skip to contentSkip to conversation

s390: Async page fault control

PATCH New Dominik Dingel 2 participants 3 messages Jul 9, 2013 – Jul 10, 2013

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 s390: Async page fault control

Following the current discussion on the kvm ML, here are the qemu bits regarding async page faults. They are responsible for enabling, disabling the feature and adding a savevm handler for live migration.

Dominik Dingel (1):
Enable async page faults with live migration

 target-s390x/kvm.c | 42 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 42 insertions(+)
Signature · 1 line
1.8.2.2
#1 lore raw

PATCH 1/1 Enable async page faults

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.

---
 target-s390x/kvm.c | 42 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 42 insertions(+)
target-s390x/kvm.c +42 -0
index 42f758f..61df7d4 100644
@@ -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;
 }
 
Signature · 1 line
1.8.2.2
#2 lore raw

Re: [Qemu-devel] [PATCH] Enable async page faults

Am 09.07.2013 17:47, schrieb Dominik Dingel:

Quoted 22 lines

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.

---
 target-s390x/kvm.c | 42 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 42 insertions(+)
target-s390x/kvm.c +1 -0
index 42f758f..61df7d4 100644
@@ -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 */
 

target-s390x/kvm.c const KVMCapabilityInfo kvm_arch_required_capabilities[] = { · line 98

Quoted 6 lines
target-s390x/kvm.c +3 -0
@@ -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

Quoted 45 lines
target-s390x/kvm.c +38 -0
+    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;
 }
 
Signature · 2 lines
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg