yeahuh / rpms / qemu-kvm

Forked from rpms/qemu-kvm 2 years ago
Clone
218e99
From b84b9552e5d474f237824a33e7211dfac8d2de60 Mon Sep 17 00:00:00 2001
218e99
From: Markus Armbruster <armbru@redhat.com>
218e99
Date: Wed, 18 Sep 2013 09:31:05 +0200
218e99
Subject: [PATCH 21/29] exec: Simplify the guest physical memory allocation hook
218e99
218e99
RH-Author: Markus Armbruster <armbru@redhat.com>
218e99
Message-id: <1379496669-22778-5-git-send-email-armbru@redhat.com>
218e99
Patchwork-id: 54424
218e99
O-Subject: [PATCH 7.0 qemu-kvm 4/8] exec: Simplify the guest physical memory allocation hook
218e99
Bugzilla: 1009328
218e99
RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com>
218e99
RH-Acked-by: Laszlo Ersek <lersek@redhat.com>
218e99
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
218e99
218e99
From: Markus Armbruster <armbru@redhat.com>
218e99
218e99
Make it a generic hook rather than a KVM hook.  Less code and
218e99
ifdeffery.
218e99
218e99
Since the only user of the hook is old S390 KVM, there's hope we can
218e99
get rid of it some day.
218e99
218e99
Acked-by: Christian Borntraeger <borntraeger@de.ibm.com>
218e99
Signed-off-by: Markus Armbruster <armbru@redhat.com>
218e99
Acked-by: Laszlo Ersek <lersek@redhat.com>
218e99
Acked-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
218e99
Message-id: 1375276272-15988-5-git-send-email-armbru@redhat.com
218e99
Signed-off-by: Anthony Liguori <anthony@codemonkey.ws>
218e99
(cherry picked from commit 91138037cb341a04a66e4c43b6cb31d5d8a43a73)
218e99
218e99
Conflicts:
218e99
	exec.c
218e99
218e99
Trivial conflict because we don't have upstream commits acc9d80 and
218e99
058bc4b.
218e99
---
218e99
 exec.c                  | 20 ++++++++++++++------
218e99
 include/exec/exec-all.h |  2 ++
218e99
 include/sysemu/kvm.h    |  5 -----
218e99
 kvm-all.c               | 13 -------------
218e99
 target-s390x/kvm.c      | 17 ++++++-----------
218e99
 5 files changed, 22 insertions(+), 35 deletions(-)
218e99
218e99
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
218e99
---
218e99
 exec.c                  |   20 ++++++++++++++------
218e99
 include/exec/exec-all.h |    2 ++
218e99
 include/sysemu/kvm.h    |    5 -----
218e99
 kvm-all.c               |   13 -------------
218e99
 target-s390x/kvm.c      |   17 ++++++-----------
218e99
 5 files changed, 22 insertions(+), 35 deletions(-)
218e99
218e99
diff --git a/exec.c b/exec.c
218e99
index 32ed61c..42a0005 100644
218e99
--- a/exec.c
218e99
+++ b/exec.c
218e99
@@ -679,6 +679,19 @@ typedef struct subpage_t {
218e99
 static int subpage_register (subpage_t *mmio, uint32_t start, uint32_t end,
218e99
                              uint16_t section);
218e99
 static subpage_t *subpage_init(hwaddr base);
218e99
+
218e99
+static void *(*phys_mem_alloc)(ram_addr_t size) = qemu_anon_ram_alloc;
218e99
+
218e99
+/*
218e99
+ * Set a custom physical guest memory alloator.
218e99
+ * Accelerators with unusual needs may need this.  Hopefully, we can
218e99
+ * get rid of it eventually.
218e99
+ */
218e99
+void phys_mem_set_alloc(void *(*alloc)(ram_addr_t))
218e99
+{
218e99
+    phys_mem_alloc = alloc;
218e99
+}
218e99
+
218e99
 static void destroy_page_desc(uint16_t section_index)
218e99
 {
218e99
     MemoryRegionSection *section = &phys_sections[section_index];
218e99
@@ -1070,12 +1083,7 @@ ram_addr_t qemu_ram_alloc_from_ptr(ram_addr_t size, void *host,
218e99
 #endif
218e99
         }
218e99
         if (!new_block->host) {
218e99
-            if (kvm_enabled()) {
218e99
-                /* some s390/kvm configurations have special constraints */
218e99
-                new_block->host = kvm_ram_alloc(size);
218e99
-            } else {
218e99
-                new_block->host = qemu_anon_ram_alloc(size);
218e99
-            }
218e99
+            new_block->host = phys_mem_alloc(size);
218e99
             memory_try_enable_merging(new_block->host, size);
218e99
         }
218e99
     }
218e99
diff --git a/include/exec/exec-all.h b/include/exec/exec-all.h
218e99
index 6362074..993c655 100644
218e99
--- a/include/exec/exec-all.h
218e99
+++ b/include/exec/exec-all.h
218e99
@@ -366,6 +366,8 @@ bool is_tcg_gen_code(uintptr_t pc_ptr);
218e99
 
218e99
 #if !defined(CONFIG_USER_ONLY)
218e99
 
218e99
+void phys_mem_set_alloc(void *(*alloc)(ram_addr_t));
218e99
+
218e99
 struct MemoryRegion *iotlb_to_region(hwaddr index);
218e99
 uint64_t io_mem_read(struct MemoryRegion *mr, hwaddr addr,
218e99
                      unsigned size);
218e99
diff --git a/include/sysemu/kvm.h b/include/sysemu/kvm.h
218e99
index 08284ef..7fc3844 100644
218e99
--- a/include/sysemu/kvm.h
218e99
+++ b/include/sysemu/kvm.h
218e99
@@ -141,11 +141,6 @@ int kvm_init_vcpu(CPUState *cpu);
218e99
 #ifdef NEED_CPU_H
218e99
 int kvm_cpu_exec(CPUArchState *env);
218e99
 
218e99
-#if !defined(CONFIG_USER_ONLY)
218e99
-void *kvm_ram_alloc(ram_addr_t size);
218e99
-void *kvm_arch_ram_alloc(ram_addr_t size);
218e99
-#endif
218e99
-
218e99
 void kvm_setup_guest_memory(void *start, size_t size);
218e99
 void kvm_flush_coalesced_mmio_buffer(void);
218e99
 
218e99
diff --git a/kvm-all.c b/kvm-all.c
218e99
index 545b470..d0a7c21 100644
218e99
--- a/kvm-all.c
218e99
+++ b/kvm-all.c
218e99
@@ -1794,19 +1794,6 @@ int kvm_has_intx_set_mask(void)
218e99
     return kvm_state->intx_set_mask;
218e99
 }
218e99
 
218e99
-void *kvm_ram_alloc(ram_addr_t size)
218e99
-{
218e99
-#ifdef TARGET_S390X
218e99
-    void *mem;
218e99
-
218e99
-    mem = kvm_arch_ram_alloc(size);
218e99
-    if (mem) {
218e99
-        return mem;
218e99
-    }
218e99
-#endif
218e99
-    return qemu_anon_ram_alloc(size);
218e99
-}
218e99
-
218e99
 void kvm_setup_guest_memory(void *start, size_t size)
218e99
 {
218e99
 #ifdef CONFIG_VALGRIND_H
218e99
diff --git a/target-s390x/kvm.c b/target-s390x/kvm.c
218e99
index 862fb12..0b18db4 100644
218e99
--- a/target-s390x/kvm.c
218e99
+++ b/target-s390x/kvm.c
218e99
@@ -92,9 +92,15 @@ const KVMCapabilityInfo kvm_arch_required_capabilities[] = {
218e99
 
218e99
 static int cap_sync_regs;
218e99
 
218e99
+static void *legacy_s390_alloc(ram_addr_t size);
218e99
+
218e99
 int kvm_arch_init(KVMState *s)
218e99
 {
218e99
     cap_sync_regs = kvm_check_extension(s, KVM_CAP_SYNC_REGS);
218e99
+    if (!kvm_check_extension(s, KVM_CAP_S390_GMAP)
218e99
+        || !kvm_check_extension(s, KVM_CAP_S390_COW)) {
218e99
+        phys_mem_set_alloc(legacy_s390_alloc);
218e99
+    }
218e99
     return 0;
218e99
 }
218e99
 
218e99
@@ -332,17 +338,6 @@ static void *legacy_s390_alloc(ram_addr_t size)
218e99
     return mem;
218e99
 }
218e99
 
218e99
-void *kvm_arch_ram_alloc(ram_addr_t size)
218e99
-{
218e99
-    /* Can we use the standard allocation ? */
218e99
-    if (kvm_check_extension(kvm_state, KVM_CAP_S390_GMAP) &&
218e99
-        kvm_check_extension(kvm_state, KVM_CAP_S390_COW)) {
218e99
-        return NULL;
218e99
-    } else {
218e99
-        return legacy_s390_alloc(size);
218e99
-    }
218e99
-}
218e99
-
218e99
 int kvm_arch_insert_sw_breakpoint(CPUState *cs, struct kvm_sw_breakpoint *bp)
218e99
 {
218e99
     S390CPU *cpu = S390_CPU(cs);
218e99
-- 
218e99
1.7.1
218e99