All of lore.kernel.org
 help / color / mirror / Atom feed
* [patch 0/6] qemu-kvm: use upstream memslot code
@ 2010-05-03 22:48 Marcelo Tosatti
  2010-05-03 22:48 ` [patch 1/6] remove alias support Marcelo Tosatti
                   ` (6 more replies)
  0 siblings, 7 replies; 8+ messages in thread
From: Marcelo Tosatti @ 2010-05-03 22:48 UTC (permalink / raw)
  To: kvm; +Cc: avi, jan.kiszka

See individual patches for details.



^ permalink raw reply	[flat|nested] 8+ messages in thread

* [patch 1/6] remove alias support
  2010-05-03 22:48 [patch 0/6] qemu-kvm: use upstream memslot code Marcelo Tosatti
@ 2010-05-03 22:48 ` Marcelo Tosatti
  2010-05-03 22:48 ` [patch 2/6] remove support for !KVM_CAP_SET_TSS_ADDR Marcelo Tosatti
                   ` (5 subsequent siblings)
  6 siblings, 0 replies; 8+ messages in thread
From: Marcelo Tosatti @ 2010-05-03 22:48 UTC (permalink / raw)
  To: kvm; +Cc: avi, jan.kiszka, Marcelo Tosatti

[-- Attachment #1: remove-alias-support --]
[-- Type: text/plain, Size: 10605 bytes --]

Aliases were added to workaround kvm's inability to destroy
memory regions. This was fixed in 2.6.29, and advertised via
KVM_CAP_DESTROY_MEMORY_REGION_WORKS.

Also, alias support will be removed from the kernel in July 2010.

Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>

Index: qemu-kvm/qemu-kvm.c
===================================================================
--- qemu-kvm.orig/qemu-kvm.c
+++ qemu-kvm/qemu-kvm.c
@@ -1076,20 +1076,6 @@ int kvm_deassign_pci_device(kvm_context_
 }
 #endif
 
-int kvm_destroy_memory_region_works(kvm_context_t kvm)
-{
-    int ret = 0;
-
-#ifdef KVM_CAP_DESTROY_MEMORY_REGION_WORKS
-    ret =
-        kvm_ioctl(kvm_state, KVM_CHECK_EXTENSION,
-                  KVM_CAP_DESTROY_MEMORY_REGION_WORKS);
-    if (ret <= 0)
-        ret = 0;
-#endif
-    return ret;
-}
-
 int kvm_reinject_control(kvm_context_t kvm, int pit_reinject)
 {
 #ifdef KVM_CAP_REINJECT_CONTROL
@@ -2055,11 +2041,6 @@ int kvm_main_loop(void)
     return 0;
 }
 
-#ifdef TARGET_I386
-static int destroy_region_works = 0;
-#endif
-
-
 #if !defined(TARGET_I386)
 int kvm_arch_init_irq_routing(void)
 {
@@ -2071,6 +2052,10 @@ extern int no_hpet;
 
 static int kvm_create_context(void)
 {
+    static const char upgrade_note[] =
+    "Please upgrade to at least kernel 2.6.29 or recent kvm-kmod\n"
+    "(see http://sourceforge.net/projects/kvm).\n";
+
     int r;
 
     if (!kvm_irqchip) {
@@ -2094,9 +2079,16 @@ static int kvm_create_context(void)
             return -1;
         }
     }
-#ifdef TARGET_I386
-    destroy_region_works = kvm_destroy_memory_region_works(kvm_context);
-#endif
+
+    /* There was a nasty bug in < kvm-80 that prevents memory slots from being
+     * destroyed properly.  Since we rely on this capability, refuse to work
+     * with any kernel without this capability. */
+    if (!kvm_check_extension(kvm_state, KVM_CAP_DESTROY_MEMORY_REGION_WORKS)) {
+        fprintf(stderr,
+                "KVM kernel module broken (DESTROY_MEMORY_REGION).\n%s",
+                upgrade_note);
+        return -EINVAL;
+    }
 
     r = kvm_arch_init_irq_routing();
     if (r < 0) {
@@ -2134,73 +2126,11 @@ static int kvm_create_context(void)
     return 0;
 }
 
-#ifdef TARGET_I386
-static int must_use_aliases_source(target_phys_addr_t addr)
-{
-    if (destroy_region_works)
-        return false;
-    if (addr == 0xa0000 || addr == 0xa8000)
-        return true;
-    return false;
-}
-
-static int must_use_aliases_target(target_phys_addr_t addr)
-{
-    if (destroy_region_works)
-        return false;
-    if (addr >= 0xe0000000 && addr < 0x100000000ull)
-        return true;
-    return false;
-}
-
-static struct mapping {
-    target_phys_addr_t phys;
-    ram_addr_t ram;
-    ram_addr_t len;
-} mappings[50];
-static int nr_mappings;
-
-static struct mapping *find_ram_mapping(ram_addr_t ram_addr)
-{
-    struct mapping *p;
-
-    for (p = mappings; p < mappings + nr_mappings; ++p) {
-        if (p->ram <= ram_addr && ram_addr < p->ram + p->len) {
-            return p;
-        }
-    }
-    return NULL;
-}
-
-static struct mapping *find_mapping(target_phys_addr_t start_addr)
-{
-    struct mapping *p;
-
-    for (p = mappings; p < mappings + nr_mappings; ++p) {
-        if (p->phys <= start_addr && start_addr < p->phys + p->len) {
-            return p;
-        }
-    }
-    return NULL;
-}
-
-static void drop_mapping(target_phys_addr_t start_addr)
-{
-    struct mapping *p = find_mapping(start_addr);
-
-    if (p)
-        *p = mappings[--nr_mappings];
-}
-#endif
-
 void kvm_set_phys_mem(target_phys_addr_t start_addr, ram_addr_t size,
                       ram_addr_t phys_offset)
 {
     int r = 0;
     unsigned long area_flags;
-#ifdef TARGET_I386
-    struct mapping *p;
-#endif
 
     if (start_addr + size > phys_ram_size) {
         phys_ram_size = start_addr + size;
@@ -2210,19 +2140,13 @@ void kvm_set_phys_mem(target_phys_addr_t
     area_flags = phys_offset & ~TARGET_PAGE_MASK;
 
     if (area_flags != IO_MEM_RAM) {
-#ifdef TARGET_I386
-        if (must_use_aliases_source(start_addr)) {
-            kvm_destroy_memory_alias(kvm_context, start_addr);
-            return;
-        }
-        if (must_use_aliases_target(start_addr))
-            return;
-#endif
         while (size > 0) {
-            p = find_mapping(start_addr);
-            if (p) {
-                kvm_unregister_memory_area(kvm_context, p->phys, p->len);
-                drop_mapping(p->phys);
+            int slot;
+
+            slot = get_slot(start_addr);
+            if (slot != -1) {
+                kvm_unregister_memory_area(kvm_context, slots[slot].phys_addr,
+                                           slots[slot].len);
             }
             start_addr += TARGET_PAGE_SIZE;
             if (size > TARGET_PAGE_SIZE) {
@@ -2241,30 +2165,12 @@ void kvm_set_phys_mem(target_phys_addr_t
     if (area_flags >= TLB_MMIO)
         return;
 
-#ifdef TARGET_I386
-    if (must_use_aliases_source(start_addr)) {
-        p = find_ram_mapping(phys_offset);
-        if (p) {
-            kvm_create_memory_alias(kvm_context, start_addr, size,
-                                    p->phys + (phys_offset - p->ram));
-        }
-        return;
-    }
-#endif
-
     r = kvm_register_phys_mem(kvm_context, start_addr,
                               qemu_get_ram_ptr(phys_offset), size, 0);
     if (r < 0) {
         printf("kvm_cpu_register_physical_memory: failed\n");
         exit(1);
     }
-#ifdef TARGET_I386
-    drop_mapping(start_addr);
-    p = &mappings[nr_mappings++];
-    p->phys = start_addr;
-    p->ram = phys_offset;
-    p->len = size;
-#endif
 
     return;
 }
@@ -2342,10 +2248,6 @@ void kvm_qemu_log_memory(target_phys_add
     if (log)
         kvm_dirty_pages_log_enable_slot(kvm_context, start, size);
     else {
-#ifdef TARGET_I386
-        if (must_use_aliases_target(start))
-            return;
-#endif
         kvm_dirty_pages_log_disable_slot(kvm_context, start, size);
     }
 }
@@ -2418,12 +2320,6 @@ int kvm_physical_sync_dirty_bitmap(targe
                                    target_phys_addr_t end_addr)
 {
 #ifndef TARGET_IA64
-
-#ifdef TARGET_I386
-    if (must_use_aliases_source(start_addr))
-        return 0;
-#endif
-
     kvm_get_dirty_pages_range(kvm_context, start_addr,
                               end_addr - start_addr, NULL,
                               kvm_get_dirty_bitmap_cb);
@@ -2433,11 +2329,6 @@ int kvm_physical_sync_dirty_bitmap(targe
 
 int kvm_log_start(target_phys_addr_t phys_addr, ram_addr_t len)
 {
-#ifdef TARGET_I386
-    if (must_use_aliases_source(phys_addr))
-        return 0;
-#endif
-
 #ifndef TARGET_IA64
     kvm_qemu_log_memory(phys_addr, len, 1);
 #endif
@@ -2446,11 +2337,6 @@ int kvm_log_start(target_phys_addr_t phy
 
 int kvm_log_stop(target_phys_addr_t phys_addr, ram_addr_t len)
 {
-#ifdef TARGET_I386
-    if (must_use_aliases_source(phys_addr))
-        return 0;
-#endif
-
 #ifndef TARGET_IA64
     kvm_qemu_log_memory(phys_addr, len, 0);
 #endif
Index: qemu-kvm/qemu-kvm-x86.c
===================================================================
--- qemu-kvm.orig/qemu-kvm-x86.c
+++ qemu-kvm/qemu-kvm-x86.c
@@ -214,71 +214,6 @@ int kvm_arch_run(CPUState *env)
 	return r;
 }
 
-#define MAX_ALIAS_SLOTS 4
-static struct {
-	uint64_t start;
-	uint64_t len;
-} kvm_aliases[MAX_ALIAS_SLOTS];
-
-static int get_alias_slot(uint64_t start)
-{
-	int i;
-
-	for (i=0; i<MAX_ALIAS_SLOTS; i++)
-		if (kvm_aliases[i].start == start)
-			return i;
-	return -1;
-}
-static int get_free_alias_slot(void)
-{
-        int i;
-
-        for (i=0; i<MAX_ALIAS_SLOTS; i++)
-                if (kvm_aliases[i].len == 0)
-                        return i;
-        return -1;
-}
-
-static void register_alias(int slot, uint64_t start, uint64_t len)
-{
-	kvm_aliases[slot].start = start;
-	kvm_aliases[slot].len   = len;
-}
-
-int kvm_create_memory_alias(kvm_context_t kvm,
-			    uint64_t phys_start,
-			    uint64_t len,
-			    uint64_t target_phys)
-{
-	struct kvm_memory_alias alias = {
-		.flags = 0,
-		.guest_phys_addr = phys_start,
-		.memory_size = len,
-		.target_phys_addr = target_phys,
-	};
-	int r;
-	int slot;
-
-	slot = get_alias_slot(phys_start);
-	if (slot < 0)
-		slot = get_free_alias_slot();
-	if (slot < 0)
-		return -EBUSY;
-	alias.slot = slot;
-
-	r = kvm_vm_ioctl(kvm_state, KVM_SET_MEMORY_ALIAS, &alias);
-	if (r == -1)
-	    return -errno;
-
-	register_alias(slot, phys_start, len);
-	return 0;
-}
-
-int kvm_destroy_memory_alias(kvm_context_t kvm, uint64_t phys_start)
-{
-	return kvm_create_memory_alias(kvm, phys_start, 0, 0);
-}
-
 #ifdef KVM_CAP_IRQCHIP
 
 int kvm_get_lapic(CPUState *env, struct kvm_lapic_state *s)
@@ -616,18 +551,6 @@ static int kvm_enable_tpr_access_reporti
 }
 #endif
 
-int kvm_qemu_create_memory_alias(uint64_t phys_start,
-                                 uint64_t len,
-                                 uint64_t target_phys)
-{
-    return kvm_create_memory_alias(kvm_context, phys_start, len, target_phys);
-}
-
-int kvm_qemu_destroy_memory_alias(uint64_t phys_start)
-{
-	return kvm_destroy_memory_alias(kvm_context, phys_start);
-}
-
 #ifdef KVM_CAP_ADJUST_CLOCK
 static struct kvm_clock_data kvmclock_data;
 
Index: qemu-kvm/qemu-kvm.h
===================================================================
--- qemu-kvm.orig/qemu-kvm.h
+++ qemu-kvm/qemu-kvm.h
@@ -400,23 +400,6 @@ int kvm_unregister_coalesced_mmio(kvm_co
                                   uint32_t size);
 
 /*!
- * \brief Create a memory alias
- *
- * Aliases a portion of physical memory to another portion.  If the guest
- * accesses the alias region, it will behave exactly as if it accessed
- * the target memory.
- */
-int kvm_create_memory_alias(kvm_context_t, uint64_t phys_start, uint64_t len,
-                            uint64_t target_phys);
-
-/*!
- * \brief Destroy a memory alias
- *
- * Removes an alias created with kvm_create_memory_alias().
- */
-int kvm_destroy_memory_alias(kvm_context_t, uint64_t phys_start);
-
-/*!
  * \brief Get a bitmap of guest ram pages which are allocated to the guest.
  *
  * \param kvm Pointer to the current kvm_context
@@ -651,15 +634,6 @@ int kvm_deassign_irq(kvm_context_t kvm, 
 #endif
 #endif
 
-/*!
- * \brief Determines whether destroying memory regions is allowed
- *
- * KVM before 2.6.29 had a bug when destroying memory regions.
- *
- * \param kvm Pointer to the current kvm_context
- */
-int kvm_destroy_memory_region_works(kvm_context_t kvm);
-
 #ifdef KVM_CAP_DEVICE_DEASSIGNMENT
 /*!
  * \brief Notifies host kernel about a PCI device to be deassigned from a guest



^ permalink raw reply	[flat|nested] 8+ messages in thread

* [patch 2/6] remove support for !KVM_CAP_SET_TSS_ADDR
  2010-05-03 22:48 [patch 0/6] qemu-kvm: use upstream memslot code Marcelo Tosatti
  2010-05-03 22:48 ` [patch 1/6] remove alias support Marcelo Tosatti
@ 2010-05-03 22:48 ` Marcelo Tosatti
  2010-05-03 22:48 ` [patch 3/6] remove unused kvm_get_dirty_pages Marcelo Tosatti
                   ` (4 subsequent siblings)
  6 siblings, 0 replies; 8+ messages in thread
From: Marcelo Tosatti @ 2010-05-03 22:48 UTC (permalink / raw)
  To: kvm; +Cc: avi, jan.kiszka, Marcelo Tosatti

[-- Attachment #1: remove-no-tss-ext-support --]
[-- Type: text/plain, Size: 2315 bytes --]

Kernels < 2.6.24 hardcoded slot 0 for the location of VMX rmode TSS
pages. Remove support for it.

Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>

Index: qemu-kvm-memslot/qemu-kvm.c
===================================================================
--- qemu-kvm-memslot.orig/qemu-kvm.c
+++ qemu-kvm-memslot/qemu-kvm.c
@@ -157,24 +157,7 @@ static void init_slots(void)
 
 static int get_free_slot(kvm_context_t kvm)
 {
-    int i;
-    int tss_ext;
-
-#if defined(KVM_CAP_SET_TSS_ADDR) && !defined(__s390__)
-    tss_ext = kvm_ioctl(kvm_state, KVM_CHECK_EXTENSION, KVM_CAP_SET_TSS_ADDR);
-#else
-    tss_ext = 0;
-#endif
-
-    /*
-     * on older kernels where the set tss ioctl is not supprted we must save
-     * slot 0 to hold the extended memory, as the vmx will use the last 3
-     * pages of this slot.
-     */
-    if (tss_ext > 0)
-        i = 0;
-    else
-        i = 1;
+    int i = 0;
 
     for (; i < KVM_MAX_NUM_MEM_REGIONS; ++i)
         if (!slots[i].len)
Index: qemu-kvm-memslot/qemu-kvm-x86.c
===================================================================
--- qemu-kvm-memslot.orig/qemu-kvm-x86.c
+++ qemu-kvm-memslot/qemu-kvm-x86.c
@@ -35,7 +35,6 @@ static int lm_capable_kernel;
 
 int kvm_set_tss_addr(kvm_context_t kvm, unsigned long addr)
 {
-#ifdef KVM_CAP_SET_TSS_ADDR
 	int r;
         /*
          * Tell fw_cfg to notify the BIOS to reserve the range.
@@ -45,22 +44,16 @@ int kvm_set_tss_addr(kvm_context_t kvm, 
             exit(1);
         }
 
-	r = kvm_ioctl(kvm_state, KVM_CHECK_EXTENSION, KVM_CAP_SET_TSS_ADDR);
-	if (r > 0) {
-		r = kvm_vm_ioctl(kvm_state, KVM_SET_TSS_ADDR, addr);
-		if (r < 0) {
-			fprintf(stderr, "kvm_set_tss_addr: %m\n");
-			return r;
-		}
-		return 0;
+	r = kvm_vm_ioctl(kvm_state, KVM_SET_TSS_ADDR, addr);
+	if (r < 0) {
+		fprintf(stderr, "kvm_set_tss_addr: %m\n");
+		return r;
 	}
-#endif
-	return -ENOSYS;
+	return 0;
 }
 
 static int kvm_init_tss(kvm_context_t kvm)
 {
-#ifdef KVM_CAP_SET_TSS_ADDR
 	int r;
 
 	r = kvm_ioctl(kvm_state, KVM_CHECK_EXTENSION, KVM_CAP_SET_TSS_ADDR);
@@ -74,9 +67,9 @@ static int kvm_init_tss(kvm_context_t kv
 			fprintf(stderr, "kvm_init_tss: unable to set tss addr\n");
 			return r;
 		}
-
+	} else {
+		fprintf(stderr, "kvm does not support KVM_CAP_SET_TSS_ADDR\n");
 	}
-#endif
 	return 0;
 }
 



^ permalink raw reply	[flat|nested] 8+ messages in thread

* [patch 3/6] remove unused kvm_get_dirty_pages
  2010-05-03 22:48 [patch 0/6] qemu-kvm: use upstream memslot code Marcelo Tosatti
  2010-05-03 22:48 ` [patch 1/6] remove alias support Marcelo Tosatti
  2010-05-03 22:48 ` [patch 2/6] remove support for !KVM_CAP_SET_TSS_ADDR Marcelo Tosatti
@ 2010-05-03 22:48 ` Marcelo Tosatti
  2010-05-03 22:48 ` [patch 4/6] remove unused kvm_dirty_bitmap array Marcelo Tosatti
                   ` (3 subsequent siblings)
  6 siblings, 0 replies; 8+ messages in thread
From: Marcelo Tosatti @ 2010-05-03 22:48 UTC (permalink / raw)
  To: kvm; +Cc: avi, jan.kiszka, Marcelo Tosatti

[-- Attachment #1: unregister --]
[-- Type: text/plain, Size: 2274 bytes --]

And make kvm_unregister_memory_area static.

Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>

Index: qemu-kvm-memslot/qemu-kvm.c
===================================================================
--- qemu-kvm-memslot.orig/qemu-kvm.c
+++ qemu-kvm-memslot/qemu-kvm.c
@@ -639,8 +639,8 @@ void kvm_destroy_phys_mem(kvm_context_t 
     free_slot(memory.slot);
 }
 
-void kvm_unregister_memory_area(kvm_context_t kvm, uint64_t phys_addr,
-                                unsigned long size)
+static void kvm_unregister_memory_area(kvm_context_t kvm, uint64_t phys_addr,
+                                       unsigned long size)
 {
 
     int slot = get_container_slot(phys_addr, size);
@@ -667,14 +667,6 @@ static int kvm_get_map(kvm_context_t kvm
     return 0;
 }
 
-int kvm_get_dirty_pages(kvm_context_t kvm, unsigned long phys_addr, void *buf)
-{
-    int slot;
-
-    slot = get_slot(phys_addr);
-    return kvm_get_map(kvm, KVM_GET_DIRTY_LOG, slot, buf);
-}
-
 int kvm_get_dirty_pages_range(kvm_context_t kvm, unsigned long phys_addr,
                               unsigned long len, void *opaque,
                               int (*cb)(unsigned long start,
Index: qemu-kvm-memslot/qemu-kvm.h
===================================================================
--- qemu-kvm-memslot.orig/qemu-kvm.h
+++ qemu-kvm-memslot/qemu-kvm.h
@@ -381,14 +381,11 @@ void *kvm_create_phys_mem(kvm_context_t,
                           unsigned long len, int log, int writable);
 void kvm_destroy_phys_mem(kvm_context_t, unsigned long phys_start,
                           unsigned long len);
-void kvm_unregister_memory_area(kvm_context_t, uint64_t phys_start,
-                                unsigned long len);
 
 int kvm_is_containing_region(kvm_context_t kvm, unsigned long phys_start,
                              unsigned long size);
 int kvm_register_phys_mem(kvm_context_t kvm, unsigned long phys_start,
                           void *userspace_addr, unsigned long len, int log);
-int kvm_get_dirty_pages(kvm_context_t, unsigned long phys_addr, void *buf);
 int kvm_get_dirty_pages_range(kvm_context_t kvm, unsigned long phys_addr,
                               unsigned long end_addr, void *opaque,
                               int (*cb)(unsigned long start,



^ permalink raw reply	[flat|nested] 8+ messages in thread

* [patch 4/6] remove unused kvm_dirty_bitmap array
  2010-05-03 22:48 [patch 0/6] qemu-kvm: use upstream memslot code Marcelo Tosatti
                   ` (2 preceding siblings ...)
  2010-05-03 22:48 ` [patch 3/6] remove unused kvm_get_dirty_pages Marcelo Tosatti
@ 2010-05-03 22:48 ` Marcelo Tosatti
  2010-05-03 22:48 ` [patch 5/6] introduce qemu_ram_map Marcelo Tosatti
                   ` (2 subsequent siblings)
  6 siblings, 0 replies; 8+ messages in thread
From: Marcelo Tosatti @ 2010-05-03 22:48 UTC (permalink / raw)
  To: kvm; +Cc: avi, jan.kiszka, Marcelo Tosatti

[-- Attachment #1: remove-unused-dirty-bitmap --]
[-- Type: text/plain, Size: 1165 bytes --]

Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>

Index: qemu-kvm-memslot/qemu-kvm.c
===================================================================
--- qemu-kvm-memslot.orig/qemu-kvm.c
+++ qemu-kvm-memslot/qemu-kvm.c
@@ -2154,7 +2154,6 @@ void kvm_set_phys_mem(target_phys_addr_t
  * dirty pages logging
  */
 /* FIXME: use unsigned long pointer instead of unsigned char */
-unsigned char *kvm_dirty_bitmap = NULL;
 int kvm_physical_memory_set_dirty_tracking(int enable)
 {
     int r = 0;
@@ -2163,17 +2162,9 @@ int kvm_physical_memory_set_dirty_tracki
         return 0;
 
     if (enable) {
-        if (!kvm_dirty_bitmap) {
-            unsigned bitmap_size = BITMAP_SIZE(phys_ram_size);
-            kvm_dirty_bitmap = qemu_malloc(bitmap_size);
-            r = kvm_dirty_pages_log_enable_all(kvm_context);
-        }
+        r = kvm_dirty_pages_log_enable_all(kvm_context);
     } else {
-        if (kvm_dirty_bitmap) {
-            r = kvm_dirty_pages_log_reset(kvm_context);
-            qemu_free(kvm_dirty_bitmap);
-            kvm_dirty_bitmap = NULL;
-        }
+        r = kvm_dirty_pages_log_reset(kvm_context);
     }
     return r;
 }



^ permalink raw reply	[flat|nested] 8+ messages in thread

* [patch 5/6] introduce qemu_ram_map
  2010-05-03 22:48 [patch 0/6] qemu-kvm: use upstream memslot code Marcelo Tosatti
                   ` (3 preceding siblings ...)
  2010-05-03 22:48 ` [patch 4/6] remove unused kvm_dirty_bitmap array Marcelo Tosatti
@ 2010-05-03 22:48 ` Marcelo Tosatti
  2010-05-03 22:48 ` [patch 6/6] use upstream memslot management code Marcelo Tosatti
  2010-05-05  8:49 ` [patch 0/6] qemu-kvm: use upstream memslot code Avi Kivity
  6 siblings, 0 replies; 8+ messages in thread
From: Marcelo Tosatti @ 2010-05-03 22:48 UTC (permalink / raw)
  To: kvm; +Cc: avi, jan.kiszka, Marcelo Tosatti

[-- Attachment #1: qemu-ram-mmap --]
[-- Type: text/plain, Size: 1650 bytes --]

Which allows drivers to register an mmap region into ram block mappings.
To be used by device assignment driver.

Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>

Index: qemu-kvm/cpu-common.h
===================================================================
--- qemu-kvm.orig/cpu-common.h
+++ qemu-kvm/cpu-common.h
@@ -40,6 +40,7 @@ static inline void cpu_register_physical
 }
 
 ram_addr_t cpu_get_physical_page_desc(target_phys_addr_t addr);
+ram_addr_t qemu_ram_map(ram_addr_t size, void *host);
 ram_addr_t qemu_ram_alloc(ram_addr_t);
 void qemu_ram_free(ram_addr_t addr);
 /* This should only be used for ram local to a device.  */
Index: qemu-kvm/exec.c
===================================================================
--- qemu-kvm.orig/exec.c
+++ qemu-kvm/exec.c
@@ -2805,6 +2805,34 @@ static void *file_ram_alloc(ram_addr_t m
 }
 #endif
 
+ram_addr_t qemu_ram_map(ram_addr_t size, void *host)
+{
+    RAMBlock *new_block;
+
+    size = TARGET_PAGE_ALIGN(size);
+    new_block = qemu_malloc(sizeof(*new_block));
+
+    new_block->host = host;
+
+    new_block->offset = last_ram_offset;
+    new_block->length = size;
+
+    new_block->next = ram_blocks;
+    ram_blocks = new_block;
+
+    phys_ram_dirty = qemu_realloc(phys_ram_dirty,
+        (last_ram_offset + size) >> TARGET_PAGE_BITS);
+    memset(phys_ram_dirty + (last_ram_offset >> TARGET_PAGE_BITS),
+           0xff, size >> TARGET_PAGE_BITS);
+
+    last_ram_offset += size;
+
+    if (kvm_enabled())
+        kvm_setup_guest_memory(new_block->host, size);
+
+    return new_block->offset;
+}
+
 ram_addr_t qemu_ram_alloc(ram_addr_t size)
 {
     RAMBlock *new_block;



^ permalink raw reply	[flat|nested] 8+ messages in thread

* [patch 6/6] use upstream memslot management code
  2010-05-03 22:48 [patch 0/6] qemu-kvm: use upstream memslot code Marcelo Tosatti
                   ` (4 preceding siblings ...)
  2010-05-03 22:48 ` [patch 5/6] introduce qemu_ram_map Marcelo Tosatti
@ 2010-05-03 22:48 ` Marcelo Tosatti
  2010-05-05  8:49 ` [patch 0/6] qemu-kvm: use upstream memslot code Avi Kivity
  6 siblings, 0 replies; 8+ messages in thread
From: Marcelo Tosatti @ 2010-05-03 22:48 UTC (permalink / raw)
  To: kvm; +Cc: avi, jan.kiszka, Marcelo Tosatti

[-- Attachment #1: use-upstream-memslot --]
[-- Type: text/plain, Size: 22383 bytes --]

Drop qemu-kvm's implementation in favour of qemu's, they are
functionally equivalent.

Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>

Index: qemu-kvm/qemu-kvm.c
===================================================================
--- qemu-kvm.orig/qemu-kvm.c
+++ qemu-kvm/qemu-kvm.c
@@ -76,21 +76,11 @@ static int io_thread_sigfd = -1;
 
 static CPUState *kvm_debug_cpu_requested;
 
-static uint64_t phys_ram_size;
-
 #ifdef CONFIG_KVM_DEVICE_ASSIGNMENT
 /* The list of ioperm_data */
 static QLIST_HEAD(, ioperm_data) ioperm_head;
 #endif
 
-//#define DEBUG_MEMREG
-#ifdef	DEBUG_MEMREG
-#define DPRINTF(fmt, args...) \
-	do { fprintf(stderr, "%s:%d " fmt , __func__, __LINE__, ##args); } while (0)
-#else
-#define DPRINTF(fmt, args...) do {} while (0)
-#endif
-
 #define ALIGN(x, y) (((x)+(y)-1) & ~((y)-1))
 
 int kvm_abi = EXPECTED_KVM_API_VERSION;
@@ -137,198 +127,6 @@ static inline void clear_gsi(kvm_context
         DPRINTF("Invalid GSI %u\n", gsi);
 }
 
-struct slot_info {
-    unsigned long phys_addr;
-    unsigned long len;
-    unsigned long userspace_addr;
-    unsigned flags;
-    int logging_count;
-};
-
-struct slot_info slots[KVM_MAX_NUM_MEM_REGIONS];
-
-static void init_slots(void)
-{
-    int i;
-
-    for (i = 0; i < KVM_MAX_NUM_MEM_REGIONS; ++i)
-        slots[i].len = 0;
-}
-
-static int get_free_slot(kvm_context_t kvm)
-{
-    int i = 0;
-
-    for (; i < KVM_MAX_NUM_MEM_REGIONS; ++i)
-        if (!slots[i].len)
-            return i;
-    return -1;
-}
-
-static void register_slot(int slot, unsigned long phys_addr,
-                          unsigned long len, unsigned long userspace_addr,
-                          unsigned flags)
-{
-    slots[slot].phys_addr = phys_addr;
-    slots[slot].len = len;
-    slots[slot].userspace_addr = userspace_addr;
-    slots[slot].flags = flags;
-}
-
-static void free_slot(int slot)
-{
-    slots[slot].len = 0;
-    slots[slot].logging_count = 0;
-}
-
-static int get_slot(unsigned long phys_addr)
-{
-    int i;
-
-    for (i = 0; i < KVM_MAX_NUM_MEM_REGIONS; ++i) {
-        if (slots[i].len && slots[i].phys_addr <= phys_addr &&
-            (slots[i].phys_addr + slots[i].len - 1) >= phys_addr)
-            return i;
-    }
-    return -1;
-}
-
-/* Returns -1 if this slot is not totally contained on any other,
- * and the number of the slot otherwise */
-static int get_container_slot(uint64_t phys_addr, unsigned long size)
-{
-    int i;
-
-    for (i = 0; i < KVM_MAX_NUM_MEM_REGIONS; ++i)
-        if (slots[i].len && slots[i].phys_addr <= phys_addr &&
-            (slots[i].phys_addr + slots[i].len) >= phys_addr + size)
-            return i;
-    return -1;
-}
-
-int kvm_is_containing_region(kvm_context_t kvm, unsigned long phys_addr,
-                             unsigned long size)
-{
-    int slot = get_container_slot(phys_addr, size);
-    if (slot == -1)
-        return 0;
-    return 1;
-}
-
-/*
- * dirty pages logging control
- */
-static int kvm_dirty_pages_log_change(kvm_context_t kvm,
-                                      unsigned long phys_addr, unsigned flags,
-                                      unsigned mask)
-{
-    int r = -1;
-    int slot = get_slot(phys_addr);
-
-    if (slot == -1) {
-        fprintf(stderr, "BUG: %s: invalid parameters\n", __FUNCTION__);
-        return 1;
-    }
-
-    flags = (slots[slot].flags & ~mask) | flags;
-    if (flags == slots[slot].flags)
-        return 0;
-    slots[slot].flags = flags;
-
-    {
-        struct kvm_userspace_memory_region mem = {
-            .slot = slot,
-            .memory_size = slots[slot].len,
-            .guest_phys_addr = slots[slot].phys_addr,
-            .userspace_addr = slots[slot].userspace_addr,
-            .flags = slots[slot].flags,
-        };
-
-
-        DPRINTF("slot %d start %llx len %llx flags %x\n",
-                mem.slot, mem.guest_phys_addr, mem.memory_size, mem.flags);
-        r = kvm_vm_ioctl(kvm_state, KVM_SET_USER_MEMORY_REGION, &mem);
-        if (r < 0)
-            fprintf(stderr, "%s: %m\n", __FUNCTION__);
-    }
-    return r;
-}
-
-static int kvm_dirty_pages_log_change_all(kvm_context_t kvm,
-                                          int (*change)(kvm_context_t kvm,
-                                                        uint64_t start,
-                                                        uint64_t len))
-{
-    int i, r;
-
-    for (i = r = 0; i < KVM_MAX_NUM_MEM_REGIONS && r == 0; i++) {
-        if (slots[i].len)
-            r = change(kvm, slots[i].phys_addr, slots[i].len);
-    }
-    return r;
-}
-
-int kvm_dirty_pages_log_enable_slot(kvm_context_t kvm, uint64_t phys_addr,
-                                    uint64_t len)
-{
-    int slot = get_slot(phys_addr);
-
-    DPRINTF("start %" PRIx64 " len %" PRIx64 "\n", phys_addr, len);
-    if (slot == -1) {
-        fprintf(stderr, "BUG: %s: invalid parameters\n", __func__);
-        return -EINVAL;
-    }
-
-    if (slots[slot].logging_count++)
-        return 0;
-
-    return kvm_dirty_pages_log_change(kvm, slots[slot].phys_addr,
-                                      KVM_MEM_LOG_DIRTY_PAGES,
-                                      KVM_MEM_LOG_DIRTY_PAGES);
-}
-
-int kvm_dirty_pages_log_disable_slot(kvm_context_t kvm, uint64_t phys_addr,
-                                     uint64_t len)
-{
-    int slot = get_slot(phys_addr);
-
-    if (slot == -1) {
-        fprintf(stderr, "BUG: %s: invalid parameters\n", __func__);
-        return -EINVAL;
-    }
-
-    if (--slots[slot].logging_count)
-        return 0;
-
-    return kvm_dirty_pages_log_change(kvm, slots[slot].phys_addr, 0,
-                                      KVM_MEM_LOG_DIRTY_PAGES);
-}
-
-/**
- * Enable dirty page logging for all memory regions
- */
-int kvm_dirty_pages_log_enable_all(kvm_context_t kvm)
-{
-    if (kvm->dirty_pages_log_all)
-        return 0;
-    kvm->dirty_pages_log_all = 1;
-    return kvm_dirty_pages_log_change_all(kvm, kvm_dirty_pages_log_enable_slot);
-}
-
-/**
- * Enable dirty page logging only for memory regions that were created with
- *     dirty logging enabled (disable for all other memory regions).
- */
-int kvm_dirty_pages_log_reset(kvm_context_t kvm)
-{
-    if (!kvm->dirty_pages_log_all)
-        return 0;
-    kvm->dirty_pages_log_all = 0;
-    return kvm_dirty_pages_log_change_all(kvm,
-                                          kvm_dirty_pages_log_disable_slot);
-}
-
-
 static int kvm_create_context(void);
 
 int kvm_init(int smp_cpus)
@@ -550,7 +348,7 @@ void kvm_create_irqchip(kvm_context_t kv
 
 int kvm_create(kvm_context_t kvm, unsigned long phys_mem_bytes, void **vm_mem)
 {
-    int r;
+    int r, i;
 
     r = kvm_create_vm(kvm);
     if (r < 0)
@@ -558,7 +356,9 @@ int kvm_create(kvm_context_t kvm, unsign
     r = kvm_arch_create(kvm, phys_mem_bytes, vm_mem);
     if (r < 0)
         return r;
-    init_slots();
+    for (i = 0; i < ARRAY_SIZE(kvm_state->slots); i++)
+        kvm_state->slots[i].slot = i;
+
     r = kvm_create_default_phys_mem(kvm, phys_mem_bytes, vm_mem);
     if (r < 0)
         return r;
@@ -567,135 +367,6 @@ int kvm_create(kvm_context_t kvm, unsign
     return 0;
 }
 
-
-int kvm_register_phys_mem(kvm_context_t kvm,
-                          unsigned long phys_start, void *userspace_addr,
-                          unsigned long len, int log)
-{
-
-    struct kvm_userspace_memory_region memory = {
-        .memory_size = len,
-        .guest_phys_addr = phys_start,
-        .userspace_addr = (unsigned long) (uintptr_t) userspace_addr,
-        .flags = log ? KVM_MEM_LOG_DIRTY_PAGES : 0,
-    };
-    int r;
-
-    memory.slot = get_free_slot(kvm);
-    DPRINTF
-        ("memory: gpa: %llx, size: %llx, uaddr: %llx, slot: %x, flags: %x\n",
-         memory.guest_phys_addr, memory.memory_size, memory.userspace_addr,
-         memory.slot, memory.flags);
-    r = kvm_vm_ioctl(kvm_state, KVM_SET_USER_MEMORY_REGION, &memory);
-    if (r < 0) {
-        fprintf(stderr, "create_userspace_phys_mem: %s\n", strerror(-r));
-        return -1;
-    }
-    register_slot(memory.slot, memory.guest_phys_addr, memory.memory_size,
-                  memory.userspace_addr, memory.flags);
-    return 0;
-}
-
-
-/* destroy/free a whole slot.
- * phys_start, len and slot are the params passed to kvm_create_phys_mem()
- */
-void kvm_destroy_phys_mem(kvm_context_t kvm, unsigned long phys_start,
-                          unsigned long len)
-{
-    int slot;
-    int r;
-    struct kvm_userspace_memory_region memory = {
-        .memory_size = 0,
-        .guest_phys_addr = phys_start,
-        .userspace_addr = 0,
-        .flags = 0,
-    };
-
-    slot = get_slot(phys_start);
-
-    if ((slot >= KVM_MAX_NUM_MEM_REGIONS) || (slot == -1)) {
-        fprintf(stderr, "BUG: %s: invalid parameters (slot=%d)\n", __FUNCTION__,
-                slot);
-        return;
-    }
-    if (phys_start != slots[slot].phys_addr) {
-        fprintf(stderr,
-                "WARNING: %s: phys_start is 0x%lx expecting 0x%lx\n",
-                __FUNCTION__, phys_start, slots[slot].phys_addr);
-        phys_start = slots[slot].phys_addr;
-    }
-
-    memory.slot = slot;
-    DPRINTF("slot %d start %llx len %llx flags %x\n",
-            memory.slot, memory.guest_phys_addr, memory.memory_size,
-            memory.flags);
-    r = kvm_vm_ioctl(kvm_state, KVM_SET_USER_MEMORY_REGION, &memory);
-    if (r < 0) {
-        fprintf(stderr, "destroy_userspace_phys_mem: %s", strerror(-r));
-        return;
-    }
-
-    free_slot(memory.slot);
-}
-
-static void kvm_unregister_memory_area(kvm_context_t kvm, uint64_t phys_addr,
-                                       unsigned long size)
-{
-
-    int slot = get_container_slot(phys_addr, size);
-
-    if (slot != -1) {
-        DPRINTF("Unregistering memory region %" PRIx64 " (%lx)\n", phys_addr, size);
-        kvm_destroy_phys_mem(kvm, phys_addr, size);
-        return;
-    }
-}
-
-static int kvm_get_map(kvm_context_t kvm, int ioctl_num, int slot, void *buf)
-{
-    int r;
-    struct kvm_dirty_log log = {
-        .slot = slot,
-    };
-
-    log.dirty_bitmap = buf;
-
-    r = kvm_vm_ioctl(kvm_state, ioctl_num, &log);
-    if (r < 0)
-        return r;
-    return 0;
-}
-
-int kvm_get_dirty_pages_range(kvm_context_t kvm, unsigned long phys_addr,
-                              unsigned long len, void *opaque,
-                              int (*cb)(unsigned long start,
-                                        unsigned long len, void *bitmap,
-                                        void *opaque))
-{
-    int i;
-    int r;
-    unsigned long end_addr = phys_addr + len;
-    void *buf;
-
-    for (i = 0; i < KVM_MAX_NUM_MEM_REGIONS; ++i) {
-        if ((slots[i].len && (uint64_t) slots[i].phys_addr >= phys_addr)
-            && ((uint64_t) slots[i].phys_addr + slots[i].len <= end_addr)) {
-            buf = qemu_malloc(BITMAP_SIZE(slots[i].len));
-            r = kvm_get_map(kvm, KVM_GET_DIRTY_LOG, i, buf);
-            if (r) {
-                qemu_free(buf);
-                return r;
-            }
-            r = cb(slots[i].phys_addr, slots[i].len, buf, opaque);
-            qemu_free(buf);
-            if (r)
-                return r;
-        }
-    }
-    return 0;
-}
-
 #ifdef KVM_CAP_IRQCHIP
 
 int kvm_set_irq_level(kvm_context_t kvm, int irq, int level, int *status)
@@ -2101,123 +1772,6 @@ static int kvm_create_context(void)
     return 0;
 }
 
-void kvm_set_phys_mem(target_phys_addr_t start_addr, ram_addr_t size,
-                      ram_addr_t phys_offset)
-{
-    int r = 0;
-    unsigned long area_flags;
-
-    if (start_addr + size > phys_ram_size) {
-        phys_ram_size = start_addr + size;
-    }
-
-    phys_offset &= ~IO_MEM_ROM;
-    area_flags = phys_offset & ~TARGET_PAGE_MASK;
-
-    if (area_flags != IO_MEM_RAM) {
-        while (size > 0) {
-            int slot;
-
-            slot = get_slot(start_addr);
-            if (slot != -1) {
-                kvm_unregister_memory_area(kvm_context, slots[slot].phys_addr,
-                                           slots[slot].len);
-            }
-            start_addr += TARGET_PAGE_SIZE;
-            if (size > TARGET_PAGE_SIZE) {
-                size -= TARGET_PAGE_SIZE;
-            } else {
-                size = 0;
-            }
-        }
-        return;
-    }
-
-    r = kvm_is_containing_region(kvm_context, start_addr, size);
-    if (r)
-        return;
-
-    if (area_flags >= TLB_MMIO)
-        return;
-
-    r = kvm_register_phys_mem(kvm_context, start_addr,
-                              qemu_get_ram_ptr(phys_offset), size, 0);
-    if (r < 0) {
-        printf("kvm_cpu_register_physical_memory: failed\n");
-        exit(1);
-    }
-
-    return;
-}
-
-/*
- * dirty pages logging
- */
-/* FIXME: use unsigned long pointer instead of unsigned char */
-int kvm_physical_memory_set_dirty_tracking(int enable)
-{
-    int r = 0;
-
-    if (!kvm_enabled())
-        return 0;
-
-    if (enable) {
-        r = kvm_dirty_pages_log_enable_all(kvm_context);
-    } else {
-        r = kvm_dirty_pages_log_reset(kvm_context);
-    }
-    return r;
-}
-
-/* get kvm's dirty pages bitmap and update qemu's */
-static int kvm_get_dirty_pages_log_range(unsigned long start_addr,
-                                         unsigned long *bitmap,
-                                         unsigned long offset,
-                                         unsigned long mem_size)
-{
-    unsigned int i, j;
-    unsigned long page_number, addr, addr1, c;
-    ram_addr_t ram_addr;
-    unsigned int len = ((mem_size / TARGET_PAGE_SIZE) + HOST_LONG_BITS - 1) /
-        HOST_LONG_BITS;
-
-    /* 
-     * bitmap-traveling is faster than memory-traveling (for addr...) 
-     * especially when most of the memory is not dirty.
-     */
-    for (i = 0; i < len; i++) {
-        if (bitmap[i] != 0) {
-            c = leul_to_cpu(bitmap[i]);
-            do {
-                j = ffsl(c) - 1;
-                c &= ~(1ul << j);
-                page_number = i * HOST_LONG_BITS + j;
-                addr1 = page_number * TARGET_PAGE_SIZE;
-                addr = offset + addr1;
-                ram_addr = cpu_get_physical_page_desc(addr);
-                cpu_physical_memory_set_dirty(ram_addr);
-            } while (c != 0);
-        }
-    }
-    return 0;
-}
-
-static int kvm_get_dirty_bitmap_cb(unsigned long start, unsigned long len,
-                                   void *bitmap, void *opaque)
-{
-    return kvm_get_dirty_pages_log_range(start, bitmap, start, len);
-}
-
-void kvm_qemu_log_memory(target_phys_addr_t start, target_phys_addr_t size,
-                         int log)
-{
-    if (log)
-        kvm_dirty_pages_log_enable_slot(kvm_context, start, size);
-    else {
-        kvm_dirty_pages_log_disable_slot(kvm_context, start, size);
-    }
-}
-
 #ifdef KVM_CAP_IRQCHIP
 
 int kvm_set_irq(int irq, int level, int *status)
@@ -2282,33 +1836,6 @@ void kvm_ioperm(CPUState *env, void *dat
 
 #endif
 
-int kvm_physical_sync_dirty_bitmap(target_phys_addr_t start_addr,
-                                   target_phys_addr_t end_addr)
-{
-#ifndef TARGET_IA64
-    kvm_get_dirty_pages_range(kvm_context, start_addr,
-                              end_addr - start_addr, NULL,
-                              kvm_get_dirty_bitmap_cb);
-#endif
-    return 0;
-}
-
-int kvm_log_start(target_phys_addr_t phys_addr, ram_addr_t len)
-{
-#ifndef TARGET_IA64
-    kvm_qemu_log_memory(phys_addr, len, 1);
-#endif
-    return 0;
-}
-
-int kvm_log_stop(target_phys_addr_t phys_addr, ram_addr_t len)
-{
-#ifndef TARGET_IA64
-    kvm_qemu_log_memory(phys_addr, len, 0);
-#endif
-    return 0;
-}
-
 int kvm_set_boot_cpu_id(uint32_t id)
 {
     return kvm_set_boot_vcpu_id(kvm_context, id);
Index: qemu-kvm/hw/device-assignment.c
===================================================================
--- qemu-kvm.orig/hw/device-assignment.c
+++ qemu-kvm/hw/device-assignment.c
@@ -256,10 +256,7 @@ static void assigned_dev_iomem_map(PCIDe
     AssignedDevice *r_dev = container_of(pci_dev, AssignedDevice, dev);
     AssignedDevRegion *region = &r_dev->v_addrs[region_num];
     PCIRegion *real_region = &r_dev->real_device.regions[region_num];
-    pcibus_t old_ephys = region->e_physbase;
-    pcibus_t old_esize = region->e_size;
-    int first_map = (region->e_size == 0);
-    int ret = 0;
+    int ret = 0, flags = 0;
 
     DEBUG("e_phys=%08" FMT_PCIBUS " r_virt=%p type=%d len=%08" FMT_PCIBUS " region_num=%d \n",
           e_phys, region->u.r_virtbase, type, e_size, region_num);
@@ -267,30 +264,22 @@ static void assigned_dev_iomem_map(PCIDe
     region->e_physbase = e_phys;
     region->e_size = e_size;
 
-    if (!first_map)
-	kvm_destroy_phys_mem(kvm_context, old_ephys,
-                             TARGET_PAGE_ALIGN(old_esize));
-
     if (e_size > 0) {
+
+        if (region_num == PCI_ROM_SLOT)
+            flags |= IO_MEM_ROM;
+
+        cpu_register_physical_memory(e_phys, e_size, region->memory_index | flags);
+
         /* deal with MSI-X MMIO page */
         if (real_region->base_addr <= r_dev->msix_table_addr &&
                 real_region->base_addr + real_region->size >=
                 r_dev->msix_table_addr) {
             int offset = r_dev->msix_table_addr - real_region->base_addr;
-            ret = munmap(region->u.r_virtbase + offset, TARGET_PAGE_SIZE);
-            if (ret == 0)
-                DEBUG("munmap done, virt_base 0x%p\n",
-                        region->u.r_virtbase + offset);
-            else {
-                fprintf(stderr, "%s: fail munmap msix table!\n", __func__);
-                exit(1);
-            }
+
             cpu_register_physical_memory(e_phys + offset,
                     TARGET_PAGE_SIZE, r_dev->mmio_index);
         }
-	ret = kvm_register_phys_mem(kvm_context, e_phys,
-                                    region->u.r_virtbase,
-                                    TARGET_PAGE_ALIGN(e_size), 0);
     }
 
     if (ret != 0) {
@@ -539,6 +528,15 @@ static int assigned_dev_register_regions
             pci_dev->v_addrs[i].u.r_virtbase +=
                 (cur_region->base_addr & 0xFFF);
 
+
+            if (!slow_map) {
+                void *virtbase = pci_dev->v_addrs[i].u.r_virtbase;
+
+                pci_dev->v_addrs[i].memory_index = qemu_ram_map(cur_region->size,
+                                                                virtbase);
+            } else
+                pci_dev->v_addrs[i].memory_index = 0;
+
             pci_register_bar((PCIDevice *) pci_dev, i,
                              cur_region->size, t,
                              slow_map ? assigned_dev_iomem_map_slow
@@ -726,10 +724,6 @@ static void free_assigned_device(Assigne
                 kvm_remove_ioperm_data(region->u.r_baseport, region->r_size);
                 continue;
             } else if (pci_region->type & IORESOURCE_MEM) {
-                if (region->e_size > 0)
-                    kvm_destroy_phys_mem(kvm_context, region->e_physbase,
-                                         TARGET_PAGE_ALIGN(region->e_size));
-
                 if (region->u.r_virtbase) {
                     int ret = munmap(region->u.r_virtbase,
                                      (pci_region->size + 0xFFF) & 0xFFFFF000);
Index: qemu-kvm/hw/device-assignment.h
===================================================================
--- qemu-kvm.orig/hw/device-assignment.h
+++ qemu-kvm/hw/device-assignment.h
@@ -63,7 +63,7 @@ typedef struct {
 
 typedef struct {
     pcibus_t e_physbase;
-    uint32_t memory_index;
+    ram_addr_t memory_index;
     union {
         void *r_virtbase;    /* mmapped access address for memory regions */
         uint32_t r_baseport; /* the base guest port for I/O regions */
Index: qemu-kvm/kvm-all.c
===================================================================
--- qemu-kvm.orig/kvm-all.c
+++ qemu-kvm/kvm-all.c
@@ -30,7 +30,6 @@
 
 /* KVM uses PAGE_SIZE in it's definition of COALESCED_MMIO_MAX */
 #define PAGE_SIZE TARGET_PAGE_SIZE
-#ifdef KVM_UPSTREAM
 
 //#define DEBUG_KVM
 
@@ -42,6 +41,8 @@
     do { } while (0)
 #endif
 
+#ifdef KVM_UPSTREAM
+
 typedef struct KVMSlot
 {
     target_phys_addr_t start_addr;
@@ -76,6 +77,8 @@ struct KVMState
 
 static KVMState *kvm_state;
 
+#endif
+
 static KVMSlot *kvm_alloc_slot(KVMState *s)
 {
     int i;
@@ -152,6 +155,7 @@ static int kvm_set_user_memory_region(KV
     return kvm_vm_ioctl(s, KVM_SET_USER_MEMORY_REGION, &mem);
 }
 
+#ifdef KVM_UPSTREAM
 static void kvm_reset_vcpu(void *opaque)
 {
     CPUState *env = opaque;
@@ -217,6 +221,7 @@ int kvm_init_vcpu(CPUState *env)
 err:
     return ret;
 }
+#endif
 
 /*
  * dirty pages logging control
@@ -371,7 +376,6 @@ static int kvm_physical_sync_dirty_bitma
 
     return ret;
 }
-#endif
 
 int kvm_coalesce_mmio_region(target_phys_addr_t start, ram_addr_t size)
 {
@@ -422,7 +426,6 @@ int kvm_check_extension(KVMState *s, uns
 
     return ret;
 }
-#ifdef KVM_UPSTREAM
 
 static void kvm_set_phys_mem(target_phys_addr_t start_addr,
 			     ram_addr_t size,
@@ -562,8 +565,6 @@ static void kvm_set_phys_mem(target_phys
     }
 }
 
-#endif
-
 static void kvm_client_set_memory(struct CPUPhysMemoryClient *client,
 				  target_phys_addr_t start_addr,
 				  ram_addr_t size,
Index: qemu-kvm/qemu-kvm.h
===================================================================
--- qemu-kvm.orig/qemu-kvm.h
+++ qemu-kvm/qemu-kvm.h
@@ -813,8 +813,6 @@ void qemu_kvm_cpuid_on_env(CPUState *env
 void kvm_inject_interrupt(CPUState *env, int mask);
 void kvm_update_after_sipi(CPUState *env);
 void kvm_update_interrupt_request(CPUState *env);
-void kvm_set_phys_mem(target_phys_addr_t start_addr, ram_addr_t size,
-                      ram_addr_t phys_offset);
 void *kvm_cpu_create_phys_mem(target_phys_addr_t start_addr, unsigned long size,
                               int log, int writable);
 
@@ -899,21 +897,11 @@ int handle_tpr_access(void *opaque, CPUS
 void kvm_mutex_unlock(void);
 void kvm_mutex_lock(void);
 
-int kvm_physical_sync_dirty_bitmap(target_phys_addr_t start_addr,
-                                   target_phys_addr_t end_addr);
-
-
 static inline int kvm_sync_vcpus(void)
 {
     return 0;
 }
 
-static inline int kvm_set_migration_log(int enable)
-{
-    return kvm_physical_memory_set_dirty_tracking(enable);
-}
-
-
 #ifdef CONFIG_KVM
 
 typedef struct KVMSlot {



^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [patch 0/6] qemu-kvm: use upstream memslot code
  2010-05-03 22:48 [patch 0/6] qemu-kvm: use upstream memslot code Marcelo Tosatti
                   ` (5 preceding siblings ...)
  2010-05-03 22:48 ` [patch 6/6] use upstream memslot management code Marcelo Tosatti
@ 2010-05-05  8:49 ` Avi Kivity
  6 siblings, 0 replies; 8+ messages in thread
From: Avi Kivity @ 2010-05-05  8:49 UTC (permalink / raw)
  To: Marcelo Tosatti; +Cc: kvm, jan.kiszka

On 05/04/2010 01:48 AM, Marcelo Tosatti wrote:
> See individual patches for details.
>
>
>    

Applied, thanks.

-- 
error compiling committee.c: too many arguments to function


^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2010-05-05  8:49 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-05-03 22:48 [patch 0/6] qemu-kvm: use upstream memslot code Marcelo Tosatti
2010-05-03 22:48 ` [patch 1/6] remove alias support Marcelo Tosatti
2010-05-03 22:48 ` [patch 2/6] remove support for !KVM_CAP_SET_TSS_ADDR Marcelo Tosatti
2010-05-03 22:48 ` [patch 3/6] remove unused kvm_get_dirty_pages Marcelo Tosatti
2010-05-03 22:48 ` [patch 4/6] remove unused kvm_dirty_bitmap array Marcelo Tosatti
2010-05-03 22:48 ` [patch 5/6] introduce qemu_ram_map Marcelo Tosatti
2010-05-03 22:48 ` [patch 6/6] use upstream memslot management code Marcelo Tosatti
2010-05-05  8:49 ` [patch 0/6] qemu-kvm: use upstream memslot code Avi Kivity

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.