Re: [Qemu-devel] [v5 03/12] migration: Add the framework of multi-thread decompression

2015-02-11 Thread Juan Quintela
Liang Li liang.z...@intel.com wrote:
 Add the code to create and destroy the multiple threads those will be
 used to do data decompression. Left some functions empty just to keep
 clearness, and the code will be added later.

 Signed-off-by: Liang Li liang.z...@intel.com
 Signed-off-by: Yang Zhang yang.z.zh...@intel.com
 Reviewed-by: Dr.David Alan Gilbert dgilb...@redhat.com

Reviewed-by: Juan Quintela quint...@redhat.com



[Qemu-devel] [v5 03/12] migration: Add the framework of multi-thread decompression

2015-02-10 Thread Liang Li
Add the code to create and destroy the multiple threads those will be
used to do data decompression. Left some functions empty just to keep
clearness, and the code will be added later.

Signed-off-by: Liang Li liang.z...@intel.com
Signed-off-by: Yang Zhang yang.z.zh...@intel.com
Reviewed-by: Dr.David Alan Gilbert dgilb...@redhat.com
---
 arch_init.c   | 76 +++
 include/migration/migration.h |  4 +++
 migration/migration.c | 18 ++
 3 files changed, 98 insertions(+)

diff --git a/arch_init.c b/arch_init.c
index 709036c..bbb584c 100644
--- a/arch_init.c
+++ b/arch_init.c
@@ -24,6 +24,7 @@
 #include stdint.h
 #include stdarg.h
 #include stdlib.h
+#include zlib.h
 #ifndef _WIN32
 #include sys/types.h
 #include sys/mman.h
@@ -126,6 +127,7 @@ static uint64_t bitmap_sync_count;
 #define RAM_SAVE_FLAG_CONTINUE 0x20
 #define RAM_SAVE_FLAG_XBZRLE   0x40
 /* 0x80 is reserved in migration.h start with 0x100 next */
+#define RAM_SAVE_FLAG_COMPRESS_PAGE0x100
 
 static struct defconfig_file {
 const char *filename;
@@ -337,8 +339,17 @@ struct CompressParam {
 };
 typedef struct CompressParam CompressParam;
 
+struct DecompressParam {
+/* To be done */
+};
+typedef struct DecompressParam DecompressParam;
+
 static CompressParam *comp_param;
 static bool quit_comp_thread;
+static bool quit_decomp_thread;
+static DecompressParam *decomp_param;
+static QemuThread *decompress_threads;
+static uint8_t *compressed_data_buf;
 
 static void *do_data_compress(void *opaque)
 {
@@ -1128,10 +1139,58 @@ void ram_handle_compressed(void *host, uint8_t ch, 
uint64_t size)
 }
 }
 
+static void *do_data_decompress(void *opaque)
+{
+while (!quit_decomp_thread) {
+/* To be done */
+}
+
+return NULL;
+}
+
+void migrate_decompress_threads_create(int count)
+{
+int i;
+
+decompress_threads = g_new0(QemuThread, count);
+decomp_param = g_new0(DecompressParam, count);
+compressed_data_buf = g_malloc0(compressBound(TARGET_PAGE_SIZE));
+quit_decomp_thread = false;
+for (i = 0; i  count; i++) {
+qemu_thread_create(decompress_threads + i, decompress,
+   do_data_decompress, decomp_param + i,
+   QEMU_THREAD_JOINABLE);
+}
+}
+
+void migrate_decompress_threads_join(void)
+{
+int i, thread_count;
+
+quit_decomp_thread = true;
+thread_count = migrate_decompress_threads();
+for (i = 0; i  thread_count; i++) {
+qemu_thread_join(decompress_threads + i);
+}
+g_free(decompress_threads);
+g_free(decomp_param);
+g_free(compressed_data_buf);
+decompress_threads = NULL;
+decomp_param = NULL;
+compressed_data_buf = NULL;
+}
+
+static void decompress_data_with_multi_threads(uint8_t *compbuf,
+   void *host, int len)
+{
+/* To be done */
+}
+
 static int ram_load(QEMUFile *f, void *opaque, int version_id)
 {
 int flags = 0, ret = 0;
 static uint64_t seq_iter;
+int len = 0;
 
 seq_iter++;
 
@@ -1208,6 +1267,23 @@ static int ram_load(QEMUFile *f, void *opaque, int 
version_id)
 
 qemu_get_buffer(f, host, TARGET_PAGE_SIZE);
 break;
+case RAM_SAVE_FLAG_COMPRESS_PAGE:
+host = host_from_stream_offset(f, addr, flags);
+if (!host) {
+error_report(Invalid RAM offset  RAM_ADDR_FMT, addr);
+ret = -EINVAL;
+break;
+}
+
+len = qemu_get_be32(f);
+if (len  0 || len  compressBound(TARGET_PAGE_SIZE)) {
+error_report(Invalid compressed data length: %d, len);
+ret = -EINVAL;
+break;
+}
+qemu_get_buffer(f, compressed_data_buf, len);
+decompress_data_with_multi_threads(compressed_data_buf, host, len);
+break;
 case RAM_SAVE_FLAG_XBZRLE:
 host = host_from_stream_offset(f, addr, flags);
 if (!host) {
diff --git a/include/migration/migration.h b/include/migration/migration.h
index 228badb..9ac1b23 100644
--- a/include/migration/migration.h
+++ b/include/migration/migration.h
@@ -52,6 +52,7 @@ struct MigrationState
 QEMUFile *file;
 QemuThread *compress_thread;
 int compress_thread_count;
+int decompress_thread_count;
 int compress_level;
 
 int state;
@@ -113,6 +114,8 @@ MigrationState *migrate_get_current(void);
 
 void migrate_compress_threads_create(MigrationState *s);
 void migrate_compress_threads_join(MigrationState *s);
+void migrate_decompress_threads_create(int count);
+void migrate_decompress_threads_join(void);
 uint64_t ram_bytes_remaining(void);
 uint64_t ram_bytes_transferred(void);
 uint64_t ram_bytes_total(void);
@@ -165,6 +168,7 @@ int64_t xbzrle_cache_resize(int64_t new_size);
 bool migrate_use_compression(void);
 int migrate_compress_level(void);
 int migrate_compress_threads(void);