Blame 0501-spice-make-number-of-surfaces-runtime-configurable.patch

5544c1
From 1c74b60fa972c9489f9cf8fa59165dedd0c23de2 Mon Sep 17 00:00:00 2001
Hans de Goede c8dfc6
From: Gerd Hoffmann <kraxel@redhat.com>
Hans de Goede c8dfc6
Date: Tue, 4 Sep 2012 11:39:41 +0200
5544c1
Subject: [PATCH] spice: make number of surfaces runtime-configurable.
Hans de Goede c8dfc6
Hans de Goede c8dfc6
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Hans de Goede c8dfc6
---
Hans de Goede c8dfc6
 hw/qxl.c           | 31 +++++++++++++++++--------------
Hans de Goede c8dfc6
 hw/qxl.h           |  3 +--
Hans de Goede c8dfc6
 ui/spice-display.c |  5 ++++-
Hans de Goede c8dfc6
 ui/spice-display.h |  3 +--
Hans de Goede c8dfc6
 4 files changed, 23 insertions(+), 19 deletions(-)
Hans de Goede c8dfc6
Hans de Goede c8dfc6
diff --git a/hw/qxl.c b/hw/qxl.c
5544c1
index 71879fe..83df499 100644
Hans de Goede c8dfc6
--- a/hw/qxl.c
Hans de Goede c8dfc6
+++ b/hw/qxl.c
5544c1
@@ -238,7 +238,8 @@ static void qxl_spice_destroy_surfaces_complete(PCIQXLDevice *qxl)
Hans de Goede c8dfc6
 {
Hans de Goede c8dfc6
     trace_qxl_spice_destroy_surfaces_complete(qxl->id);
Hans de Goede c8dfc6
     qemu_mutex_lock(&qxl->track_lock);
Hans de Goede c8dfc6
-    memset(&qxl->guest_surfaces.cmds, 0, sizeof(qxl->guest_surfaces.cmds));
Hans de Goede c8dfc6
+    memset(qxl->guest_surfaces.cmds, 0,
Hans de Goede c8dfc6
+           sizeof(qxl->guest_surfaces.cmds) * qxl->ssd.num_surfaces);
Hans de Goede c8dfc6
     qxl->guest_surfaces.count = 0;
Hans de Goede c8dfc6
     qemu_mutex_unlock(&qxl->track_lock);
Hans de Goede c8dfc6
 }
5544c1
@@ -347,7 +348,7 @@ static void init_qxl_rom(PCIQXLDevice *d)
Hans de Goede c8dfc6
     rom->slot_id_bits  = MEMSLOT_SLOT_BITS;
Hans de Goede c8dfc6
     rom->slots_start   = 1;
Hans de Goede c8dfc6
     rom->slots_end     = NUM_MEMSLOTS - 1;
Hans de Goede c8dfc6
-    rom->n_surfaces    = cpu_to_le32(NUM_SURFACES);
Hans de Goede c8dfc6
+    rom->n_surfaces    = cpu_to_le32(d->ssd.num_surfaces);
Hans de Goede c8dfc6
 
Hans de Goede c8dfc6
     for (i = 0, n = 0; i < ARRAY_SIZE(qxl_modes); i++) {
Hans de Goede c8dfc6
         fb = qxl_modes[i].y_res * qxl_modes[i].stride;
5544c1
@@ -451,9 +452,9 @@ static int qxl_track_command(PCIQXLDevice *qxl, struct QXLCommandExt *ext)
Hans de Goede c8dfc6
         }
Hans de Goede c8dfc6
         uint32_t id = le32_to_cpu(cmd->surface_id);
Hans de Goede c8dfc6
 
Hans de Goede c8dfc6
-        if (id >= NUM_SURFACES) {
Hans de Goede c8dfc6
+        if (id >= qxl->ssd.num_surfaces) {
Hans de Goede c8dfc6
             qxl_set_guest_bug(qxl, "QXL_CMD_SURFACE id %d >= %d", id,
Hans de Goede c8dfc6
-                              NUM_SURFACES);
Hans de Goede c8dfc6
+                              qxl->ssd.num_surfaces);
Hans de Goede c8dfc6
             return 1;
Hans de Goede c8dfc6
         }
Hans de Goede c8dfc6
         qemu_mutex_lock(&qxl->track_lock);
5544c1
@@ -529,7 +530,7 @@ static void interface_get_init_info(QXLInstance *sin, QXLDevInitInfo *info)
Hans de Goede c8dfc6
     info->num_memslots_groups = NUM_MEMSLOTS_GROUPS;
Hans de Goede c8dfc6
     info->internal_groupslot_id = 0;
Hans de Goede c8dfc6
     info->qxl_ram_size = le32_to_cpu(qxl->shadow_rom.num_pages) << TARGET_PAGE_BITS;
Hans de Goede c8dfc6
-    info->n_surfaces = NUM_SURFACES;
Hans de Goede c8dfc6
+    info->n_surfaces = qxl->ssd.num_surfaces;
Hans de Goede c8dfc6
 }
Hans de Goede c8dfc6
 
Hans de Goede c8dfc6
 static const char *qxl_mode_to_string(int mode)
5544c1
@@ -1438,7 +1439,7 @@ async_common:
Hans de Goede c8dfc6
         QXLCookie *cookie = NULL;
Hans de Goede c8dfc6
         QXLRect update = d->ram->update_area;
Hans de Goede c8dfc6
 
Hans de Goede c8dfc6
-        if (d->ram->update_surface > NUM_SURFACES) {
Hans de Goede c8dfc6
+        if (d->ram->update_surface > d->ssd.num_surfaces) {
Hans de Goede c8dfc6
             qxl_set_guest_bug(d, "QXL_IO_UPDATE_AREA: invalid surface id %d\n",
Hans de Goede c8dfc6
                               d->ram->update_surface);
Hans de Goede c8dfc6
             return;
5544c1
@@ -1538,7 +1539,7 @@ async_common:
Hans de Goede c8dfc6
         }
Hans de Goede c8dfc6
         break;
Hans de Goede c8dfc6
     case QXL_IO_DESTROY_SURFACE_WAIT:
Hans de Goede c8dfc6
-        if (val >= NUM_SURFACES) {
Hans de Goede c8dfc6
+        if (val >= d->ssd.num_surfaces) {
Hans de Goede c8dfc6
             qxl_set_guest_bug(d, "QXL_IO_DESTROY_SURFACE (async=%d):"
Hans de Goede c8dfc6
                              "%" PRIu64 " >= NUM_SURFACES", async, val);
Hans de Goede c8dfc6
             goto cancel_async;
5544c1
@@ -1717,7 +1718,7 @@ static void qxl_dirty_surfaces(PCIQXLDevice *qxl)
Hans de Goede c8dfc6
     vram_start =  (intptr_t)memory_region_get_ram_ptr(&qxl->vram_bar);
Hans de Goede c8dfc6
 
Hans de Goede c8dfc6
     /* dirty the off-screen surfaces */
Hans de Goede c8dfc6
-    for (i = 0; i < NUM_SURFACES; i++) {
Hans de Goede c8dfc6
+    for (i = 0; i < qxl->ssd.num_surfaces; i++) {
Hans de Goede c8dfc6
         QXLSurfaceCmd *cmd;
Hans de Goede c8dfc6
         intptr_t surface_offset;
Hans de Goede c8dfc6
         int surface_size;
5544c1
@@ -1845,7 +1846,6 @@ static int qxl_init_common(PCIQXLDevice *qxl)
Hans de Goede c8dfc6
     qxl->mode = QXL_MODE_UNDEFINED;
Hans de Goede c8dfc6
     qxl->generation = 1;
Hans de Goede c8dfc6
     qxl->num_memslots = NUM_MEMSLOTS;
Hans de Goede c8dfc6
-    qxl->num_surfaces = NUM_SURFACES;
Hans de Goede c8dfc6
     qemu_mutex_init(&qxl->track_lock);
Hans de Goede c8dfc6
     qemu_mutex_init(&qxl->async_lock);
Hans de Goede c8dfc6
     qxl->current_async = QXL_UNDEFINED_IO;
5544c1
@@ -1887,6 +1887,7 @@ static int qxl_init_common(PCIQXLDevice *qxl)
Hans de Goede c8dfc6
     init_qxl_rom(qxl);
Hans de Goede c8dfc6
     init_qxl_ram(qxl);
Hans de Goede c8dfc6
 
Hans de Goede c8dfc6
+    qxl->guest_surfaces.cmds = g_new0(QXLPHYSICAL, qxl->ssd.num_surfaces);
Hans de Goede c8dfc6
     memory_region_init_ram(&qxl->vram_bar, "qxl.vram", qxl->vram_size);
Hans de Goede c8dfc6
     vmstate_register_ram(&qxl->vram_bar, &qxl->pci.qdev);
Hans de Goede c8dfc6
     memory_region_init_alias(&qxl->vram32_bar, "qxl.vram32", &qxl->vram_bar,
5544c1
@@ -2052,8 +2053,8 @@ static int qxl_post_load(void *opaque, int version)
Hans de Goede c8dfc6
         qxl_create_guest_primary(d, 1, QXL_SYNC);
Hans de Goede c8dfc6
 
Hans de Goede c8dfc6
         /* replay surface-create and cursor-set commands */
Hans de Goede c8dfc6
-        cmds = g_malloc0(sizeof(QXLCommandExt) * (NUM_SURFACES + 1));
Hans de Goede c8dfc6
-        for (in = 0, out = 0; in < NUM_SURFACES; in++) {
Hans de Goede c8dfc6
+        cmds = g_malloc0(sizeof(QXLCommandExt) * (d->ssd.num_surfaces + 1));
Hans de Goede c8dfc6
+        for (in = 0, out = 0; in < d->ssd.num_surfaces; in++) {
Hans de Goede c8dfc6
             if (d->guest_surfaces.cmds[in] == 0) {
Hans de Goede c8dfc6
                 continue;
Hans de Goede c8dfc6
             }
5544c1
@@ -2153,9 +2154,10 @@ static VMStateDescription qxl_vmstate = {
Hans de Goede c8dfc6
                              qxl_memslot, struct guest_slots),
Hans de Goede c8dfc6
         VMSTATE_STRUCT(guest_primary.surface, PCIQXLDevice, 0,
Hans de Goede c8dfc6
                        qxl_surface, QXLSurfaceCreate),
Hans de Goede c8dfc6
-        VMSTATE_INT32_EQUAL(num_surfaces, PCIQXLDevice),
Hans de Goede c8dfc6
-        VMSTATE_ARRAY(guest_surfaces.cmds, PCIQXLDevice, NUM_SURFACES, 0,
Hans de Goede c8dfc6
-                      vmstate_info_uint64, uint64_t),
Hans de Goede c8dfc6
+        VMSTATE_INT32_EQUAL(ssd.num_surfaces, PCIQXLDevice),
Hans de Goede c8dfc6
+        VMSTATE_VARRAY_INT32(guest_surfaces.cmds, PCIQXLDevice,
Hans de Goede c8dfc6
+                             ssd.num_surfaces, 0,
Hans de Goede c8dfc6
+                             vmstate_info_uint64, uint64_t),
Hans de Goede c8dfc6
         VMSTATE_UINT64(guest_cursor, PCIQXLDevice),
Hans de Goede c8dfc6
         VMSTATE_END_OF_LIST()
Hans de Goede c8dfc6
     },
5544c1
@@ -2183,6 +2185,7 @@ static Property qxl_properties[] = {
Hans de Goede c8dfc6
         DEFINE_PROP_UINT32("vram_size_mb", PCIQXLDevice, vram32_size_mb, -1),
Hans de Goede c8dfc6
         DEFINE_PROP_UINT32("vram64_size_mb", PCIQXLDevice, vram_size_mb, -1),
Hans de Goede c8dfc6
         DEFINE_PROP_UINT32("vgamem_mb", PCIQXLDevice, vgamem_size_mb, 16),
Hans de Goede c8dfc6
+        DEFINE_PROP_INT32("surfaces", PCIQXLDevice, ssd.num_surfaces, 1024),
Hans de Goede c8dfc6
         DEFINE_PROP_END_OF_LIST(),
Hans de Goede c8dfc6
 };
Hans de Goede c8dfc6
 
Hans de Goede c8dfc6
diff --git a/hw/qxl.h b/hw/qxl.h
Hans de Goede c8dfc6
index 9cfedb7..5553824 100644
Hans de Goede c8dfc6
--- a/hw/qxl.h
Hans de Goede c8dfc6
+++ b/hw/qxl.h
Hans de Goede c8dfc6
@@ -40,7 +40,6 @@ typedef struct PCIQXLDevice {
Hans de Goede c8dfc6
     uint32_t           revision;
Hans de Goede c8dfc6
 
Hans de Goede c8dfc6
     int32_t            num_memslots;
Hans de Goede c8dfc6
-    int32_t            num_surfaces;
Hans de Goede c8dfc6
 
Hans de Goede c8dfc6
     uint32_t           current_async;
Hans de Goede c8dfc6
     QemuMutex          async_lock;
Hans de Goede c8dfc6
@@ -65,7 +64,7 @@ typedef struct PCIQXLDevice {
Hans de Goede c8dfc6
     } guest_primary;
Hans de Goede c8dfc6
 
Hans de Goede c8dfc6
     struct surfaces {
Hans de Goede c8dfc6
-        QXLPHYSICAL    cmds[NUM_SURFACES];
Hans de Goede c8dfc6
+        QXLPHYSICAL    *cmds;
Hans de Goede c8dfc6
         uint32_t       count;
Hans de Goede c8dfc6
         uint32_t       max;
Hans de Goede c8dfc6
     } guest_surfaces;
Hans de Goede c8dfc6
diff --git a/ui/spice-display.c b/ui/spice-display.c
Hans de Goede c8dfc6
index 1c31418..99bc665 100644
Hans de Goede c8dfc6
--- a/ui/spice-display.c
Hans de Goede c8dfc6
+++ b/ui/spice-display.c
Hans de Goede c8dfc6
@@ -317,6 +317,9 @@ void qemu_spice_display_init_common(SimpleSpiceDisplay *ssd, DisplayState *ds)
Hans de Goede c8dfc6
     qemu_mutex_init(&ssd->lock);
Hans de Goede c8dfc6
     ssd->mouse_x = -1;
Hans de Goede c8dfc6
     ssd->mouse_y = -1;
Hans de Goede c8dfc6
+    if (ssd->num_surfaces == 0) {
Hans de Goede c8dfc6
+        ssd->num_surfaces = 1024;
Hans de Goede c8dfc6
+    }
Hans de Goede c8dfc6
     ssd->bufsize = (16 * 1024 * 1024);
Hans de Goede c8dfc6
     ssd->buf = g_malloc(ssd->bufsize);
Hans de Goede c8dfc6
 }
Hans de Goede c8dfc6
@@ -427,7 +430,7 @@ static void interface_get_init_info(QXLInstance *sin, QXLDevInitInfo *info)
Hans de Goede c8dfc6
     info->num_memslots_groups = NUM_MEMSLOTS_GROUPS;
Hans de Goede c8dfc6
     info->internal_groupslot_id = 0;
Hans de Goede c8dfc6
     info->qxl_ram_size = ssd->bufsize;
Hans de Goede c8dfc6
-    info->n_surfaces = NUM_SURFACES;
Hans de Goede c8dfc6
+    info->n_surfaces = ssd->num_surfaces;
Hans de Goede c8dfc6
 }
Hans de Goede c8dfc6
 
Hans de Goede c8dfc6
 static int interface_get_command(QXLInstance *sin, struct QXLCommandExt *ext)
Hans de Goede c8dfc6
diff --git a/ui/spice-display.h b/ui/spice-display.h
Hans de Goede c8dfc6
index bcff114..512ab78 100644
Hans de Goede c8dfc6
--- a/ui/spice-display.h
Hans de Goede c8dfc6
+++ b/ui/spice-display.h
Hans de Goede c8dfc6
@@ -32,8 +32,6 @@
Hans de Goede c8dfc6
 #define MEMSLOT_GROUP_GUEST 1
Hans de Goede c8dfc6
 #define NUM_MEMSLOTS_GROUPS 2
Hans de Goede c8dfc6
 
Hans de Goede c8dfc6
-#define NUM_SURFACES 1024
Hans de Goede c8dfc6
-
Hans de Goede c8dfc6
 /*
Hans de Goede c8dfc6
  * Internal enum to differenciate between options for
Hans de Goede c8dfc6
  * io calls that have a sync (old) version and an _async (new)
Hans de Goede c8dfc6
@@ -80,6 +78,7 @@ struct SimpleSpiceDisplay {
Hans de Goede c8dfc6
     QXLInstance qxl;
Hans de Goede c8dfc6
     uint32_t unique;
Hans de Goede c8dfc6
     QemuPfConv *conv;
Hans de Goede c8dfc6
+    int32_t num_surfaces;
Hans de Goede c8dfc6
 
Hans de Goede c8dfc6
     QXLRect dirty;
Hans de Goede c8dfc6
     int notify;
Hans de Goede c8dfc6
-- 
5544c1
1.7.12.1
Hans de Goede c8dfc6