Patchwork qxl: move qemu_spice_add_memslot call out of qxl_add_memslot

login
register
mail settings
Submitter Alon Levy
Date July 6, 2011, 12:19 p.m.
Message ID <1309954766-9728-6-git-send-email-alevy@redhat.com>
Download mbox | patch
Permalink /patch/103471/
State New
Headers show

Comments

Alon Levy - July 6, 2011, 12:19 p.m.
From: Gerd Hoffmann <kraxel@redhat.com>

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 hw/qxl.c |   40 ++++++++++++++++++++++++----------------
 1 files changed, 24 insertions(+), 16 deletions(-)
Gerd Hoffmann - July 7, 2011, 7:39 a.m.
Hi,

> -static void qxl_add_memslot(PCIQXLDevice *d, uint32_t slot_id, uint64_t delta)
> +static void qxl_add_memslot(PCIQXLDevice *d, uint32_t slot_id, uint64_t delta,
> +                            QXLDevMemSlot *memslot)

> -        qxl_add_memslot(d, val, 0);
> +        qxl_add_memslot(d, val, 0,&memslot);
> +        qemu_spice_add_memslot(&d->ssd,&memslot);

Do we still need this and the simliar patches?  Given that we don't call 
qemu_spice_add_memslot() from another thread any more we could just pass 
in a async flag to qxl_add_memslot().

cheers,
   Gerd
Alon Levy - July 7, 2011, 8:45 a.m.
On Thu, Jul 07, 2011 at 09:39:34AM +0200, Gerd Hoffmann wrote:
>   Hi,
> 
> >-static void qxl_add_memslot(PCIQXLDevice *d, uint32_t slot_id, uint64_t delta)
> >+static void qxl_add_memslot(PCIQXLDevice *d, uint32_t slot_id, uint64_t delta,
> >+                            QXLDevMemSlot *memslot)
> 
> >-        qxl_add_memslot(d, val, 0);
> >+        qxl_add_memslot(d, val, 0,&memslot);
> >+        qemu_spice_add_memslot(&d->ssd,&memslot);
> 
> Do we still need this and the simliar patches?  Given that we don't
> call qemu_spice_add_memslot() from another thread any more we could
> just pass in a async flag to qxl_add_memslot().

I will. The most changes needed are to split the part after calling worker to a complete call,
I'm storing the io data inside PCIQXLDevice.

> 
> cheers,
>   Gerd
> 
>

Patch

diff --git a/hw/qxl.c b/hw/qxl.c
index bbba25d..26f80d5 100644
--- a/hw/qxl.c
+++ b/hw/qxl.c
@@ -735,7 +735,8 @@  static void qxl_vga_ioport_write(void *opaque, uint32_t addr, uint32_t val)
     vga_ioport_write(opaque, addr, val);
 }
 
-static void qxl_add_memslot(PCIQXLDevice *d, uint32_t slot_id, uint64_t delta)
+static void qxl_add_memslot(PCIQXLDevice *d, uint32_t slot_id, uint64_t delta,
+                            QXLDevMemSlot *memslot)
 {
     static const int regions[] = {
         QXL_RAM_RANGE_INDEX,
@@ -747,7 +748,6 @@  static void qxl_add_memslot(PCIQXLDevice *d, uint32_t slot_id, uint64_t delta)
     pcibus_t pci_start;
     pcibus_t pci_end;
     intptr_t virt_start;
-    QXLDevMemSlot memslot;
     int i;
 
     guest_start = le64_to_cpu(d->guest_slots[slot_id].slot.mem_start);
@@ -793,21 +793,20 @@  static void qxl_add_memslot(PCIQXLDevice *d, uint32_t slot_id, uint64_t delta)
         abort();
     }
 
-    memslot.slot_id = slot_id;
-    memslot.slot_group_id = MEMSLOT_GROUP_GUEST; /* guest group */
-    memslot.virt_start = virt_start + (guest_start - pci_start);
-    memslot.virt_end   = virt_start + (guest_end   - pci_start);
-    memslot.addr_delta = memslot.virt_start - delta;
-    memslot.generation = d->rom->slot_generation = 0;
+    memslot->slot_id = slot_id;
+    memslot->slot_group_id = MEMSLOT_GROUP_GUEST; /* guest group */
+    memslot->virt_start = virt_start + (guest_start - pci_start);
+    memslot->virt_end   = virt_start + (guest_end   - pci_start);
+    memslot->addr_delta = memslot->virt_start - delta;
+    memslot->generation = d->rom->slot_generation = 0;
     qxl_rom_set_dirty(d);
 
     dprint(d, 1, "%s: slot %d: host virt 0x%" PRIx64 " - 0x%" PRIx64 "\n",
-           __FUNCTION__, memslot.slot_id,
-           memslot.virt_start, memslot.virt_end);
+           __FUNCTION__, memslot->slot_id,
+           memslot->virt_start, memslot->virt_end);
 
-    qemu_spice_add_memslot(&d->ssd, &memslot);
-    d->guest_slots[slot_id].ptr = (void*)memslot.virt_start;
-    d->guest_slots[slot_id].size = memslot.virt_end - memslot.virt_start;
+    d->guest_slots[slot_id].ptr = (void*)memslot->virt_start;
+    d->guest_slots[slot_id].size = memslot->virt_end - memslot->virt_start;
     d->guest_slots[slot_id].delta = delta;
     d->guest_slots[slot_id].active = 1;
 }
@@ -912,6 +911,7 @@  static void qxl_set_mode(PCIQXLDevice *d, int modenr, int loadvm)
         .mem_start = start,
         .mem_end = end
     };
+    QXLDevMemSlot memslot;
     QXLSurfaceCreate surface = {
         .width      = mode->x_res,
         .height     = mode->y_res,
@@ -929,7 +929,8 @@  static void qxl_set_mode(PCIQXLDevice *d, int modenr, int loadvm)
     }
 
     d->guest_slots[0].slot = slot;
-    qxl_add_memslot(d, 0, devmem);
+    qxl_add_memslot(d, 0, devmem, &memslot);
+    qemu_spice_add_memslot(&d->ssd, &memslot);
 
     d->guest_primary.surface = surface;
     qxl_create_guest_primary(d, 0);
@@ -1011,11 +1012,16 @@  static void ioport_write(void *opaque, uint32_t addr, uint32_t val)
         qxl_hard_reset(d, 0);
         break;
     case QXL_IO_MEMSLOT_ADD:
+    {
+        QXLDevMemSlot memslot;
+
         PANIC_ON(val >= NUM_MEMSLOTS);
         PANIC_ON(d->guest_slots[val].active);
         d->guest_slots[val].slot = d->ram->mem_slot;
-        qxl_add_memslot(d, val, 0);
+        qxl_add_memslot(d, val, 0, &memslot);
+        qemu_spice_add_memslot(&d->ssd, &memslot);
         break;
+    }
     case QXL_IO_MEMSLOT_DEL:
         qxl_del_memslot(d, val);
         break;
@@ -1387,6 +1393,7 @@  static int qxl_post_load(void *opaque, int version)
     PCIQXLDevice* d = opaque;
     uint8_t *ram_start = d->vga.vram_ptr;
     QXLCommandExt *cmds;
+    QXLDevMemSlot memslot;
     int in, out, i, newmode;
 
     dprint(d, 1, "%s: start\n", __FUNCTION__);
@@ -1415,7 +1422,8 @@  static int qxl_post_load(void *opaque, int version)
             if (!d->guest_slots[i].active) {
                 continue;
             }
-            qxl_add_memslot(d, i, 0);
+            qxl_add_memslot(d, i, 0, &memslot);
+            qemu_spice_add_memslot(&d->ssd, &memslot);
         }
         qxl_create_guest_primary(d, 1);