qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Avi Kivity <avi@redhat.com>
To: Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	qemu-devel@nongnu.org, "Michael S. Tsirkin" <mst@redhat.com>
Cc: xen-devel@lists.xensource.com, kvm@vger.kernel.org
Subject: [Qemu-devel] [PATCH 20/23] vhost: avoid cpu_get_physical_page_desc()
Date: Mon, 19 Dec 2011 16:13:41 +0200	[thread overview]
Message-ID: <1324304024-11220-21-git-send-email-avi@redhat.com> (raw)
In-Reply-To: <1324304024-11220-1-git-send-email-avi@redhat.com>

This reaches into the innards of the memory core, which are being
changed.  Switch to a memory API version.

Signed-off-by: Avi Kivity <avi@redhat.com>
---
 hw/vhost.c |   47 +++++++++++++++++++++++++++++++++++++++--------
 hw/vhost.h |    2 ++
 2 files changed, 41 insertions(+), 8 deletions(-)

diff --git a/hw/vhost.c b/hw/vhost.c
index a1c5e4c..cd56e75 100644
--- a/hw/vhost.c
+++ b/hw/vhost.c
@@ -17,6 +17,7 @@
 #include <linux/vhost.h>
 
 static void vhost_dev_sync_region(struct vhost_dev *dev,
+                                  MemoryRegionSection *section,
                                   uint64_t mfirst, uint64_t mlast,
                                   uint64_t rfirst, uint64_t rlast)
 {
@@ -49,8 +50,8 @@ static void vhost_dev_sync_region(struct vhost_dev *dev,
                 ffsll(log) : ffs(log))) {
             ram_addr_t ram_addr;
             bit -= 1;
-            ram_addr = cpu_get_physical_page_desc(addr + bit * VHOST_LOG_PAGE);
-            cpu_physical_memory_set_dirty(ram_addr);
+            ram_addr = section->offset_within_region + bit * VHOST_LOG_PAGE;
+            memory_region_set_dirty(section->mr, ram_addr);
             log &= ~(0x1ull << bit);
         }
         addr += VHOST_LOG_CHUNK;
@@ -58,6 +59,7 @@ static void vhost_dev_sync_region(struct vhost_dev *dev,
 }
 
 static int vhost_sync_dirty_bitmap(struct vhost_dev *dev,
+                                   MemoryRegionSection *section,
                                    target_phys_addr_t start_addr,
                                    target_phys_addr_t end_addr)
 {
@@ -68,14 +70,14 @@ static int vhost_sync_dirty_bitmap(struct vhost_dev *dev,
     }
     for (i = 0; i < dev->mem->nregions; ++i) {
         struct vhost_memory_region *reg = dev->mem->regions + i;
-        vhost_dev_sync_region(dev, start_addr, end_addr,
+        vhost_dev_sync_region(dev, section, start_addr, end_addr,
                               reg->guest_phys_addr,
                               range_get_last(reg->guest_phys_addr,
                                              reg->memory_size));
     }
     for (i = 0; i < dev->nvqs; ++i) {
         struct vhost_virtqueue *vq = dev->vqs + i;
-        vhost_dev_sync_region(dev, start_addr, end_addr, vq->used_phys,
+        vhost_dev_sync_region(dev, section, start_addr, end_addr, vq->used_phys,
                               range_get_last(vq->used_phys, vq->used_size));
     }
     return 0;
@@ -89,7 +91,7 @@ static void vhost_log_sync(MemoryListener *listener,
     target_phys_addr_t start_addr = section->offset_within_address_space;
     target_phys_addr_t end_addr = start_addr + section->size;
 
-    vhost_sync_dirty_bitmap(dev, start_addr, end_addr);
+    vhost_sync_dirty_bitmap(dev, section, start_addr, end_addr);
 }
 
 /* Assign/unassign. Keep an unsorted array of non-overlapping
@@ -261,7 +263,7 @@ static inline void vhost_dev_log_resize(struct vhost_dev* dev, uint64_t size)
 {
     vhost_log_chunk_t *log;
     uint64_t log_base;
-    int r;
+    int r, i;
     if (size) {
         log = g_malloc0(size * sizeof *log);
     } else {
@@ -270,7 +272,10 @@ static inline void vhost_dev_log_resize(struct vhost_dev* dev, uint64_t size)
     log_base = (uint64_t)(unsigned long)log;
     r = ioctl(dev->control, VHOST_SET_LOG_BASE, &log_base);
     assert(r >= 0);
-    vhost_sync_dirty_bitmap(dev, 0, (target_phys_addr_t)~0x0ull);
+    for (i = 0; i < dev->n_mem_sections; ++i) {
+        vhost_sync_dirty_bitmap(dev, &dev->mem_sections[i],
+                                0, (target_phys_addr_t)~0x0ull);
+    }
     if (dev->log) {
         g_free(dev->log);
     }
@@ -428,13 +433,33 @@ static void vhost_set_memory(MemoryListener *listener,
 static void vhost_region_add(MemoryListener *listener,
                              MemoryRegionSection *section)
 {
+    struct vhost_dev *dev = container_of(listener, struct vhost_dev,
+                                         memory_listener);
+
+    ++dev->n_mem_sections;
+    dev->mem_sections = g_renew(MemoryRegionSection, dev->mem_sections,
+                                dev->n_mem_sections);
+    dev->mem_sections[dev->n_mem_sections - 1] = *section;
     vhost_set_memory(listener, section, true);
 }
 
 static void vhost_region_del(MemoryListener *listener,
                              MemoryRegionSection *section)
 {
+    struct vhost_dev *dev = container_of(listener, struct vhost_dev,
+                                         memory_listener);
+    int i;
+
     vhost_set_memory(listener, section, false);
+    for (i = 0; i < dev->n_mem_sections; ++i) {
+        if (dev->mem_sections[i].offset_within_address_space
+            == section->offset_within_address_space) {
+            --dev->n_mem_sections;
+            memmove(&dev->mem_sections[i], &dev->mem_sections[i+1],
+                    dev->n_mem_sections - i);
+            break;
+        }
+    }
 }
 
 static int vhost_virtqueue_set_addr(struct vhost_dev *dev,
@@ -714,6 +739,8 @@ int vhost_dev_init(struct vhost_dev *hdev, int devfd, bool force)
         .log_global_stop = vhost_log_global_stop,
     };
     hdev->mem = g_malloc0(offsetof(struct vhost_memory, regions));
+    hdev->n_mem_sections = 0;
+    hdev->mem_sections = NULL;
     hdev->log = NULL;
     hdev->log_size = 0;
     hdev->log_enabled = false;
@@ -731,6 +758,7 @@ void vhost_dev_cleanup(struct vhost_dev *hdev)
 {
     memory_listener_unregister(&hdev->memory_listener);
     g_free(hdev->mem);
+    g_free(hdev->mem_sections);
     close(hdev->control);
 }
 
@@ -871,7 +899,10 @@ void vhost_dev_stop(struct vhost_dev *hdev, VirtIODevice *vdev)
                                 hdev->vqs + i,
                                 i);
     }
-    vhost_sync_dirty_bitmap(hdev, 0, (target_phys_addr_t)~0x0ull);
+    for (i = 0; i < hdev->n_mem_sections; ++i) {
+        vhost_sync_dirty_bitmap(hdev, &hdev->mem_sections[i],
+                                0, (target_phys_addr_t)~0x0ull);
+    }
     r = vdev->binding->set_guest_notifiers(vdev->binding_opaque, false);
     if (r < 0) {
         fprintf(stderr, "vhost guest notifier cleanup failed: %d\n", r);
diff --git a/hw/vhost.h b/hw/vhost.h
index d1824ec..80e64df 100644
--- a/hw/vhost.h
+++ b/hw/vhost.h
@@ -30,6 +30,8 @@ struct vhost_dev {
     MemoryListener memory_listener;
     int control;
     struct vhost_memory *mem;
+    int n_mem_sections;
+    MemoryRegionSection *mem_sections;
     struct vhost_virtqueue *vqs;
     int nvqs;
     unsigned long long features;
-- 
1.7.7.1

  parent reply	other threads:[~2011-12-19 14:14 UTC|newest]

Thread overview: 49+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-12-19 14:13 [Qemu-devel] [PATCH 00/23] Remove cpu_get_physical_page_desc() Avi Kivity
2011-12-19 14:13 ` [Qemu-devel] [PATCH 01/23] memory: introduce memory_region_find() Avi Kivity
2011-12-19 14:50   ` Anthony Liguori
2011-12-19 15:04     ` Avi Kivity
2011-12-19 15:10       ` Anthony Liguori
2011-12-19 15:17         ` Avi Kivity
2011-12-19 15:25           ` Anthony Liguori
2011-12-19 15:28             ` Avi Kivity
2011-12-19 15:52               ` Avi Kivity
2011-12-19 14:13 ` [Qemu-devel] [PATCH 02/23] sysbus: add sysbus_address_space() Avi Kivity
2011-12-19 14:13 ` [Qemu-devel] [PATCH 03/23] memory: add memory_region_is_ram() Avi Kivity
2011-12-19 14:13 ` [Qemu-devel] [PATCH 04/23] framebuffer: drop use of cpu_get_physical_page_desc() Avi Kivity
2011-12-19 14:13 ` [Qemu-devel] [PATCH 05/23] memory: add memory_region_is_rom() Avi Kivity
2011-12-19 14:13 ` [Qemu-devel] [PATCH 06/23] loader: remove calls to cpu_get_physical_page_desc() Avi Kivity
2011-12-19 14:13 ` [Qemu-devel] [PATCH 07/23] framebuffer: drop use of cpu_physical_sync_dirty_bitmap() Avi Kivity
2011-12-19 14:13 ` [Qemu-devel] [PATCH 08/23] memory: replace cpu_physical_sync_dirty_bitmap() with a memory API Avi Kivity
2011-12-19 14:13 ` [Qemu-devel] [PATCH 09/23] memory: add API for observing updates to the physical memory map Avi Kivity
2011-12-19 14:13 ` [Qemu-devel] [PATCH 10/23] memory: add memory_region_is_logging() Avi Kivity
2011-12-19 14:13 ` [Qemu-devel] [PATCH 11/23] kvm: switch kvm slots to use host virtual address instead of ram_addr_t Avi Kivity
2011-12-19 14:13 ` [Qemu-devel] [PATCH 12/23] fixup: listener fixes Avi Kivity
2011-12-19 14:32   ` Peter Maydell
2011-12-19 14:48     ` Avi Kivity
2011-12-19 14:13 ` [Qemu-devel] [PATCH 13/23] kvm: convert to MemoryListener API Avi Kivity
2012-01-15 10:49   ` Jan Kiszka
2012-01-15 10:52     ` Jan Kiszka
2012-01-15 12:35       ` Avi Kivity
2012-01-15 12:40         ` Jan Kiszka
2012-01-15 12:49           ` Avi Kivity
2012-01-15 12:50             ` Avi Kivity
2012-01-15 12:53               ` Jan Kiszka
2011-12-19 14:13 ` [Qemu-devel] [PATCH 14/23] vhost: " Avi Kivity
2011-12-22 12:50   ` Michael S. Tsirkin
2011-12-22 12:50     ` Avi Kivity
2011-12-22 12:57       ` Michael S. Tsirkin
2011-12-22 12:57         ` Avi Kivity
2011-12-19 14:13 ` [Qemu-devel] [PATCH 15/23] xen, vga: add API for registering the framebuffer Avi Kivity
2011-12-19 14:13 ` [Qemu-devel] [PATCH 16/23] memory: temporarily add memory_region_get_ram_addr() Avi Kivity
2011-12-19 14:13 ` [Qemu-devel] [PATCH 17/23] xen: convert to MemoryListener API Avi Kivity
2012-01-04 18:06   ` Stefano Stabellini
2012-01-04 19:42     ` Avi Kivity
2011-12-19 14:13 ` [Qemu-devel] [PATCH 18/23] memory: remove CPUPhysMemoryClient Avi Kivity
2011-12-19 14:13 ` [Qemu-devel] [PATCH 19/23] kvm: avoid cpu_get_physical_page_desc() Avi Kivity
2011-12-19 14:13 ` Avi Kivity [this message]
2011-12-22 12:48   ` [Qemu-devel] [PATCH 20/23] vhost: " Michael S. Tsirkin
2011-12-22 12:49     ` Avi Kivity
2011-12-19 14:13 ` [Qemu-devel] [PATCH 21/23] virtio-balloon: " Avi Kivity
2011-12-19 14:13 ` [Qemu-devel] [PATCH 22/23] sparc: " Avi Kivity
2011-12-19 14:13 ` [Qemu-devel] [PATCH 23/23] Remove cpu_get_physical_page_desc() Avi Kivity
2011-12-19 14:54 ` [Qemu-devel] [PATCH 00/23] " Anthony Liguori

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=1324304024-11220-21-git-send-email-avi@redhat.com \
    --to=avi@redhat.com \
    --cc=kvm@vger.kernel.org \
    --cc=mst@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=stefano.stabellini@eu.citrix.com \
    --cc=xen-devel@lists.xensource.com \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).