[Spice-devel] [spice PATCH 42/55] migration_protocol: add display channel migration data

Yonit Halperin yhalperi at redhat.com
Wed Aug 15 00:56:22 PDT 2012


---
 server/migration_protocol.h |   73 +++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 73 insertions(+), 0 deletions(-)

diff --git a/server/migration_protocol.h b/server/migration_protocol.h
index d2a5575..285d86d 100644
--- a/server/migration_protocol.h
+++ b/server/migration_protocol.h
@@ -19,6 +19,7 @@
 #define _H_MIGRATION_PROTOCOL
 
 #include <spice/vd_agent.h>
+#include "glz_encoder_dictionary.h"
 
 /* ************************************************
  * src-server to dst-server migration data messages
@@ -109,6 +110,78 @@ typedef struct __attribute__ ((__packed__)) SpiceMigrateDataMain {
     } client2agent;
 } SpiceMigrateDataMain;
 
+/* ****************
+ * display channel
+ * ***************/
+
+#define SPICE_MIGRATE_DATA_DISPLAY_VERSION 1
+#define SPICE_MIGRATE_DATA_DISPLAY_MAGIC (*(uint32_t *)"DCMD")
+
+/*
+ * TODO: store the cache and dictionary data only in one channel (the
+ *       freezer).
+ * TODO: optimizations: don't send surfaces information if it will be faster
+ *       to resend the surfaces on-demand.
+ * */
+#define MIGRATE_DATA_DISPLAY_MAX_CACHE_CLIENTS 4
+
+typedef struct __attribute__ ((__packed__)) SpiceMigrateDataDisplay {
+    uint64_t message_serial;
+    uint8_t low_bandwidth_setting;
+
+    /*
+     * Synchronizing the shared pixmap cache.
+     * For now, the cache is not migrated, and instead, we reset it and send
+     * SPICE_MSG_DISPLAY_INVAL_ALL_PIXMAPS to the client.
+     * In order to keep the client and server caches consistent:
+     * The channel which freezed the cache on the src side, unfreezes it
+     * on the dest side, and increases its generation (see 'reset' in red_client_shared_cach.h).
+     * In order to enforce that images that are added to the cache by other channels
+     * will reach the client only after SPICE_MSG_DISPLAY_INVAL_ALL_PIXMAPS,
+     * we send SPICE_MSG_WAIT_FOR_CHANNELS
+     * (see the generation mismatch handling in 'add' in red_client_shared_cach.h).
+     */
+    uint8_t pixmap_cache_id;
+    int64_t pixmap_cache_size;
+    uint8_t pixmap_cache_freezer;
+    uint64_t pixmap_cache_clients[MIGRATE_DATA_DISPLAY_MAX_CACHE_CLIENTS];
+
+    uint8_t glz_dict_id;
+    GlzEncDictRestoreData glz_dict_data;
+
+    uint32_t surfaces_at_client_ptr; /* reference to MigrateDisplaySurfacesAtClientLossless/Lossy.
+                                        Lossy: when jpeg-wan-compression(qemu cmd line)=always
+                                        or when jpeg-wan-compression=auto,
+                                        and low_bandwidth_setting=TRUE */
+
+} SpiceMigrateDataDisplay;
+
+typedef struct __attribute__ ((__packed__)) SpiceMigrateDataRect {
+    int32_t left;
+    int32_t top;
+    int32_t right;
+    int32_t bottom;
+} SpiceMigrateDataRect;
+
+typedef struct __attribute__ ((__packed__)) MigrateDisplaySurfaceLossless {
+    uint32_t id;
+} MigrateDisplaySurfaceLossless;
+
+typedef struct __attribute__ ((__packed__)) MigrateDisplaySurfaceLossy {
+    uint32_t id;
+    SpiceMigrateDataRect lossy_rect;
+} MigrateDisplaySurfaceLossy;
+
+typedef struct __attribute__ ((__packed__)) MigrateDisplaySurfacesAtClientLossless {
+    uint32_t num_surfaces;
+    MigrateDisplaySurfaceLossless surfaces[0];
+} MigrateDisplaySurfacesAtClientLossless;
+
+typedef struct __attribute__ ((__packed__)) MigrateDisplaySurfacesAtClientLossy {
+    uint32_t num_surfaces;
+    MigrateDisplaySurfaceLossy surfaces[0];
+} MigrateDisplaySurfacesAtClientLossy;
+
 static inline int migration_protocol_validate_header(SpiceMigrateDataHeader *header,
                                                      uint32_t magic,
                                                      uint32_t version)
-- 
1.7.7.6



More information about the Spice-devel mailing list