[Spice-devel] [spice-server PATCH 2/2] display seamless migration: no need to trace the generation of the primary surface

Yonit Halperin yhalperi at redhat.com
Mon Nov 5 13:33:58 PST 2012


We no longer process destroy_primary or destroy_surfaces while waiting
for migration data.
---
 server/red_worker.c |   51 ++++++++++++++++-----------------------------------
 1 files changed, 16 insertions(+), 35 deletions(-)

diff --git a/server/red_worker.c b/server/red_worker.c
index dd27872..4381e22 100644
--- a/server/red_worker.c
+++ b/server/red_worker.c
@@ -921,7 +921,6 @@ typedef struct RedWorker {
     RedSurface surfaces[NUM_SURFACES];
     uint32_t n_surfaces;
     SpiceImageSurfaces image_surfaces;
-    uint32_t primary_surface_generation;
 
     MonitorsConfig *monitors_config;
 
@@ -9766,23 +9765,12 @@ static uint64_t display_channel_handle_migrate_data_get_serial(
     return migrate_data->message_serial;
 }
 
-static int display_channel_client_restore_surface(DisplayChannelClient *dcc, uint32_t surface_id)
+static void display_channel_client_restore_surface(DisplayChannelClient *dcc, uint32_t surface_id)
 {
-    if (surface_id == 0) {
-        if (dcc->common.worker->primary_surface_generation <= 1) {
-            dcc->surface_client_created[surface_id] = TRUE;
-            return TRUE;
-        } else {
-            /* red_create_surface_item already updated the client */
-            return FALSE;
-        }
-    } else {
-        /* we don't process commands till we receive the migration data, thus,
-         * we should have not created any off-screen surface */
-        spice_assert(!dcc->surface_client_created[surface_id]);
-        dcc->surface_client_created[surface_id] = TRUE;
-        return TRUE;
-    }
+    /* we don't process commands till we receive the migration data, thus,
+     * we should have not sent any surface to the client. */
+    spice_assert(!dcc->surface_client_created[surface_id]);
+    dcc->surface_client_created[surface_id] = TRUE;
 }
 
 static void display_channel_client_restore_surfaces_lossless(DisplayChannelClient *dcc,
@@ -9806,21 +9794,19 @@ static void display_channel_client_restore_surfaces_lossy(DisplayChannelClient *
     spice_debug(NULL);
     for (i = 0; i < mig_surfaces->num_surfaces; i++) {
         uint32_t surface_id = mig_surfaces->surfaces[i].id;
+        SpiceMigrateDataRect *mig_lossy_rect;
+        SpiceRect lossy_rect;
 
-        if (display_channel_client_restore_surface(dcc, surface_id)) {
-            SpiceMigrateDataRect *mig_lossy_rect;
-            SpiceRect lossy_rect;
-
-            spice_assert(dcc->surface_client_created[surface_id]);
+        display_channel_client_restore_surface(dcc, surface_id);
+        spice_assert(dcc->surface_client_created[surface_id]);
 
-            mig_lossy_rect = &mig_surfaces->surfaces[i].lossy_rect;
-            lossy_rect.left = mig_lossy_rect->left;
-            lossy_rect.top = mig_lossy_rect->top;
-            lossy_rect.right = mig_lossy_rect->right;
-            lossy_rect.bottom = mig_lossy_rect->bottom;
-            region_init(&dcc->surface_client_lossy_region[surface_id]);
-            region_add(&dcc->surface_client_lossy_region[surface_id], &lossy_rect);
-        }
+        mig_lossy_rect = &mig_surfaces->surfaces[i].lossy_rect;
+        lossy_rect.left = mig_lossy_rect->left;
+        lossy_rect.top = mig_lossy_rect->top;
+        lossy_rect.right = mig_lossy_rect->right;
+        lossy_rect.bottom = mig_lossy_rect->bottom;
+        region_init(&dcc->surface_client_lossy_region[surface_id]);
+        region_add(&dcc->surface_client_lossy_region[surface_id], &lossy_rect);
     }
 }
 static int display_channel_handle_migrate_data(RedChannelClient *rcc, uint32_t size,
@@ -11041,11 +11027,6 @@ static void dev_create_primary_surface(RedWorker *worker, uint32_t surface_id,
         line_0 -= (int32_t)(surface.stride * (surface.height -1));
     }
 
-    if (!worker->display_channel->common.during_target_migrate) {
-        worker->primary_surface_generation++;
-    } else {
-         worker->primary_surface_generation = 1;
-    }
     red_create_surface(worker, 0, surface.width, surface.height, surface.stride, surface.format,
                        line_0, surface.flags & QXL_SURF_FLAG_KEEP_DATA, TRUE);
     set_monitors_config_to_primary(worker);
-- 
1.7.7.6



More information about the Spice-devel mailing list