From: Alex Williamson <alex.williamson@redhat.com>
To: kvm@vger.kernel.org
Cc: alex.williamson@redhat.com
Subject: [PATCH] kvm: merge fixes for vmstate/block name from qemu.git
Date: Wed, 07 Jul 2010 14:08:59 -0600 [thread overview]
Message-ID: <20100707200344.22503.73686.stgit@localhost.localdomain> (raw)
Also updates qemu_ram_map() and create qemu_ram_unmap() to match
qemu_ram_alloc/qemu_ram_free().
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
---
This patch should fix all the qemu-kvm build failures that will occur as
a result of my qemu.git series fixing migration after hotplug. This also
updates device-assignment to the new qemu_ram_* calling standards so
migration will also work after a hotunplug of a pci-assign device.
cpu-common.h | 4 ++
exec.c | 83 ++++++++++++++++++++++++++++++++----------------
hw/device-assignment.c | 21 +++++++++---
hw/i8254-kvm.c | 2 +
hw/i8259.c | 2 +
kvm-tpr-opt.c | 2 +
qemu-kvm-x86.c | 2 +
7 files changed, 78 insertions(+), 38 deletions(-)
diff --git a/cpu-common.h b/cpu-common.h
index 4890da4..f430f2d 100644
--- a/cpu-common.h
+++ b/cpu-common.h
@@ -40,8 +40,10 @@ static inline void cpu_register_physical_memory(target_phys_addr_t start_addr,
}
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_map(DeviceState *dev, const char *name,
+ ram_addr_t size, void *host);
ram_addr_t qemu_ram_alloc(DeviceState *dev, const char *name, ram_addr_t size);
+void qemu_ram_unmap(ram_addr_t addr);
void qemu_ram_free(ram_addr_t addr);
/* This should only be used for ram local to a device. */
void *qemu_get_ram_ptr(ram_addr_t addr);
diff --git a/exec.c b/exec.c
index 7c7e7bc..6347e61 100644
--- a/exec.c
+++ b/exec.c
@@ -2787,33 +2787,6 @@ static void *file_ram_alloc(RAMBlock *block,
}
#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 = ram_list.last_offset;
- new_block->length = size;
-
- QLIST_INSERT_HEAD(&ram_list.blocks, new_block, next);
-
- ram_list.phys_dirty = qemu_realloc(ram_list.phys_dirty,
- (ram_list.last_offset + size) >> TARGET_PAGE_BITS);
- memset(ram_list.phys_dirty + (ram_list.last_offset >> TARGET_PAGE_BITS),
- 0xff, size >> TARGET_PAGE_BITS);
-
- ram_list.last_offset += size;
-
- if (kvm_enabled())
- kvm_setup_guest_memory(new_block->host, size);
-
- return new_block->offset;
-}
-
static ram_addr_t find_ram_offset(ram_addr_t size)
{
RAMBlock *block, *next_block;
@@ -2851,6 +2824,49 @@ static ram_addr_t last_ram_offset(void)
return last;
}
+ram_addr_t qemu_ram_map(DeviceState *dev, const char *name,
+ ram_addr_t size, void *host)
+{
+ RAMBlock *new_block, *block;
+
+ size = TARGET_PAGE_ALIGN(size);
+ new_block = qemu_mallocz(sizeof(*new_block));
+
+ if (dev && dev->parent_bus && dev->parent_bus->info->get_dev_path) {
+ char *id = dev->parent_bus->info->get_dev_path(dev);
+ if (id) {
+ snprintf(new_block->idstr, sizeof(new_block->idstr), "%s/", id);
+ qemu_free(id);
+ }
+ }
+ pstrcat(new_block->idstr, sizeof(new_block->idstr), name);
+
+ QLIST_FOREACH(block, &ram_list.blocks, next) {
+ if (!strcmp(block->idstr, new_block->idstr)) {
+ fprintf(stderr, "RAMBlock \"%s\" already registered, abort!\n",
+ new_block->idstr);
+ abort();
+ }
+ }
+
+ new_block->host = host;
+
+ new_block->offset = find_ram_offset(size);
+ new_block->length = size;
+
+ QLIST_INSERT_HEAD(&ram_list.blocks, new_block, next);
+
+ ram_list.phys_dirty = qemu_realloc(ram_list.phys_dirty,
+ last_ram_offset() >> TARGET_PAGE_BITS);
+ memset(ram_list.phys_dirty + (new_block->offset >> TARGET_PAGE_BITS),
+ 0xff, size >> TARGET_PAGE_BITS);
+
+ if (kvm_enabled())
+ kvm_setup_guest_memory(new_block->host, size);
+
+ return new_block->offset;
+}
+
ram_addr_t qemu_ram_alloc(DeviceState *dev, const char *name, ram_addr_t size)
{
RAMBlock *new_block, *block;
@@ -2917,6 +2933,19 @@ ram_addr_t qemu_ram_alloc(DeviceState *dev, const char *name, ram_addr_t size)
return new_block->offset;
}
+void qemu_ram_unmap(ram_addr_t addr)
+{
+ RAMBlock *block;
+
+ QLIST_FOREACH(block, &ram_list.blocks, next) {
+ if (addr == block->offset) {
+ QLIST_REMOVE(block, next);
+ qemu_free(block);
+ return;
+ }
+ }
+}
+
void qemu_ram_free(ram_addr_t addr)
{
RAMBlock *block;
diff --git a/hw/device-assignment.c b/hw/device-assignment.c
index 48ac73c..cbbf37f 100644
--- a/hw/device-assignment.c
+++ b/hw/device-assignment.c
@@ -571,9 +571,13 @@ static int assigned_dev_register_regions(PCIRegion *io_regions,
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);
+ char name[32];
+ snprintf(name, sizeof(name), "%s.bar%d",
+ pci_dev->dev.qdev.info->name, i);
+ pci_dev->v_addrs[i].memory_index =
+ qemu_ram_map(&pci_dev->dev.qdev,
+ name, cur_region->size,
+ virtbase);
} else
pci_dev->v_addrs[i].memory_index = 0;
@@ -779,9 +783,14 @@ static void free_assigned_device(AssignedDevice *dev)
continue;
} else if (pci_region->type & IORESOURCE_MEM) {
if (region->u.r_virtbase) {
- int ret = munmap(region->u.r_virtbase,
- (pci_region->size + 0xFFF) & 0xFFFFF000);
- if (ret != 0)
+ if (region->memory_index) {
+ cpu_register_physical_memory(region->e_physbase,
+ region->e_size,
+ IO_MEM_UNASSIGNED);
+ qemu_ram_unmap(region->memory_index);
+ }
+ if (munmap(region->u.r_virtbase,
+ (pci_region->size + 0xFFF) & 0xFFFFF000))
fprintf(stderr,
"Failed to unmap assigned device region: %s\n",
strerror(errno));
diff --git a/hw/i8254-kvm.c b/hw/i8254-kvm.c
index c62ab6a..6125213 100644
--- a/hw/i8254-kvm.c
+++ b/hw/i8254-kvm.c
@@ -114,7 +114,7 @@ PITState *kvm_pit_init(int base, qemu_irq irq)
s->irq_timer = qemu_new_timer(vm_clock, dummy_timer, s);
vmstate_pit.pre_save = kvm_pit_pre_save;
vmstate_pit.post_load = kvm_pit_post_load;
- vmstate_register(base, &vmstate_pit, pit);
+ vmstate_register(NULL, base, &vmstate_pit, pit);
qemu_register_reset(pit_reset, pit);
pit_reset(pit);
diff --git a/hw/i8259.c b/hw/i8259.c
index 70da847..11060d3 100644
--- a/hw/i8259.c
+++ b/hw/i8259.c
@@ -658,7 +658,7 @@ static void kvm_i8259_set_irq(void *opaque, int irq, int level)
static void kvm_pic_init1(int io_addr, PicState *s)
{
- vmstate_register(io_addr, &vmstate_pic, s);
+ vmstate_register(NULL, io_addr, &vmstate_pic, s);
qemu_register_reset(pic_reset, s);
}
diff --git a/kvm-tpr-opt.c b/kvm-tpr-opt.c
index 429c2f4..46890e2 100644
--- a/kvm-tpr-opt.c
+++ b/kvm-tpr-opt.c
@@ -370,7 +370,7 @@ static void vtpr_ioport_write(void *opaque, uint32_t addr, uint32_t val)
static void kvm_tpr_opt_setup(void)
{
- register_savevm("kvm-tpr-opt", 0, 1, tpr_save, tpr_load, NULL);
+ register_savevm(NULL, "kvm-tpr-opt", 0, 1, tpr_save, tpr_load, NULL);
register_ioport_write(0x7e, 1, 1, vtpr_ioport_write, NULL);
register_ioport_write(0x7e, 2, 2, vtpr_ioport_write16, NULL);
}
diff --git a/qemu-kvm-x86.c b/qemu-kvm-x86.c
index 403337a..fd426b7 100644
--- a/qemu-kvm-x86.c
+++ b/qemu-kvm-x86.c
@@ -598,7 +598,7 @@ int kvm_arch_qemu_create_context(void)
#ifdef KVM_CAP_ADJUST_CLOCK
if (kvm_check_extension(kvm_state, KVM_CAP_ADJUST_CLOCK))
- vmstate_register(0, &vmstate_kvmclock, &kvmclock_data);
+ vmstate_register(NULL, 0, &vmstate_kvmclock, &kvmclock_data);
#endif
r = kvm_set_boot_cpu_id(0);
next reply other threads:[~2010-07-07 20:09 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-07-07 20:08 Alex Williamson [this message]
2010-07-08 8:37 ` [PATCH] kvm: merge fixes for vmstate/block name from qemu.git Avi Kivity
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20100707200344.22503.73686.stgit@localhost.localdomain \
--to=alex.williamson@redhat.com \
--cc=kvm@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.