diff mbox

[v5,05/12] arch_init: Alloc and free data struct for compression

Message ID 1423623986-590-6-git-send-email-liang.z.li@intel.com
State New
Headers show

Commit Message

Li, Liang Z Feb. 11, 2015, 3:06 a.m. UTC
Define the data structure and variables used to do multiple thread
compression, and add the code to initialize and free them.

Signed-off-by: Liang Li <liang.z.li@intel.com>
Signed-off-by: Yang Zhang <yang.z.zhang@intel.com>
Reviewed-by: Dr.David Alan Gilbert <dgilbert@redhat.com>
---
 arch_init.c | 34 +++++++++++++++++++++++++++++++++-
 1 file changed, 33 insertions(+), 1 deletion(-)

Comments

Juan Quintela Feb. 11, 2015, 9:03 a.m. UTC | #1
Liang Li <liang.z.li@intel.com> wrote:
> Define the data structure and variables used to do multiple thread
> compression, and add the code to initialize and free them.
>
> Signed-off-by: Liang Li <liang.z.li@intel.com>
> Signed-off-by: Yang Zhang <yang.z.zhang@intel.com>
> Reviewed-by: Dr.David Alan Gilbert <dgilbert@redhat.com>

Reviewed-by: Juan Quintela <quintela@redhat.com>
Li, Liang Z Feb. 12, 2015, 5:32 a.m. UTC | #2
Hi Juan,

     Have you reviewed the 04 patch of the patch series? I didn't see the reply email.

Liang

> -----Original Message-----
> From: Juan Quintela [mailto:quintela@redhat.com]
> Sent: Wednesday, February 11, 2015 5:03 PM
> To: Li, Liang Z
> Cc: qemu-devel@nongnu.org; eblake@redhat.com; amit.shah@redhat.com;
> lcapitulino@redhat.com; armbru@redhat.com; dgilbert@redhat.com; Zhang,
> Yang Z
> Subject: Re: [v5 05/12] arch_init: Alloc and free data struct for compression
> 
> Liang Li <liang.z.li@intel.com> wrote:
> > Define the data structure and variables used to do multiple thread
> > compression, and add the code to initialize and free them.
> >
> > Signed-off-by: Liang Li <liang.z.li@intel.com>
> > Signed-off-by: Yang Zhang <yang.z.zhang@intel.com>
> > Reviewed-by: Dr.David Alan Gilbert <dgilbert@redhat.com>
> 
> Reviewed-by: Juan Quintela <quintela@redhat.com>
Juan Quintela Feb. 12, 2015, 12:05 p.m. UTC | #3
"Li, Liang Z" <liang.z.li@intel.com> wrote:
> Hi Juan,
>
>      Have you reviewed the 04 patch of the patch series? I didn't see
> the reply email.

It is ok, going to put the review-by

>
> Liang
>
>> -----Original Message-----
>> From: Juan Quintela [mailto:quintela@redhat.com]
>> Sent: Wednesday, February 11, 2015 5:03 PM
>> To: Li, Liang Z
>> Cc: qemu-devel@nongnu.org; eblake@redhat.com; amit.shah@redhat.com;
>> lcapitulino@redhat.com; armbru@redhat.com; dgilbert@redhat.com; Zhang,
>> Yang Z
>> Subject: Re: [v5 05/12] arch_init: Alloc and free data struct for compression
>> 
>> Liang Li <liang.z.li@intel.com> wrote:
>> > Define the data structure and variables used to do multiple thread
>> > compression, and add the code to initialize and free them.
>> >
>> > Signed-off-by: Liang Li <liang.z.li@intel.com>
>> > Signed-off-by: Yang Zhang <yang.z.zhang@intel.com>
>> > Reviewed-by: Dr.David Alan Gilbert <dgilbert@redhat.com>
>> 
>> Reviewed-by: Juan Quintela <quintela@redhat.com>
diff mbox

Patch

diff --git a/arch_init.c b/arch_init.c
index bbb584c..7ccad8b 100644
--- a/arch_init.c
+++ b/arch_init.c
@@ -335,7 +335,12 @@  static uint32_t last_version;
 static bool ram_bulk_stage;
 
 struct CompressParam {
-    /* To be done */
+    bool busy;
+    QEMUFile *file;
+    QemuMutex mutex;
+    QemuCond cond;
+    RAMBlock *block;
+    ram_addr_t offset;
 };
 typedef struct CompressParam CompressParam;
 
@@ -345,6 +350,14 @@  struct DecompressParam {
 typedef struct DecompressParam DecompressParam;
 
 static CompressParam *comp_param;
+/* comp_done_cond is used to wake up the migration thread when
+ * one of the compression threads has finished the compression.
+ * comp_done_lock is used to co-work with comp_done_cond.
+ */
+static QemuMutex *comp_done_lock;
+static QemuCond *comp_done_cond;
+/* The empty QEMUFileOps will be used by file in CompressParam */
+static const QEMUFileOps empty_ops = { };
 static bool quit_comp_thread;
 static bool quit_decomp_thread;
 static DecompressParam *decomp_param;
@@ -380,11 +393,20 @@  void migrate_compress_threads_join(MigrationState *s)
     thread_count = migrate_compress_threads();
     for (i = 0; i < thread_count; i++) {
         qemu_thread_join(s->compress_thread + i);
+        qemu_fclose(comp_param[i].file);
+        qemu_mutex_destroy(&comp_param[i].mutex);
+        qemu_cond_destroy(&comp_param[i].cond);
     }
+    qemu_mutex_destroy(comp_done_lock);
+    qemu_cond_destroy(comp_done_cond);
     g_free(s->compress_thread);
     g_free(comp_param);
+    g_free(comp_done_cond);
+    g_free(comp_done_lock);
     s->compress_thread = NULL;
     comp_param = NULL;
+    comp_done_cond = NULL;
+    comp_done_lock = NULL;
 }
 
 void migrate_compress_threads_create(MigrationState *s)
@@ -398,7 +420,17 @@  void migrate_compress_threads_create(MigrationState *s)
     thread_count = migrate_compress_threads();
     s->compress_thread = g_new0(QemuThread, thread_count);
     comp_param = g_new0(CompressParam, thread_count);
+    comp_done_cond = g_new0(QemuCond, 1);
+    comp_done_lock = g_new0(QemuMutex, 1);
+    qemu_cond_init(comp_done_cond);
+    qemu_mutex_init(comp_done_lock);
     for (i = 0; i < thread_count; i++) {
+        /* com_param[i].file is just used as a dummy buffer to save data, set
+         * it's ops to empty.
+         */
+        comp_param[i].file = qemu_fopen_ops(NULL, &empty_ops);
+        qemu_mutex_init(&comp_param[i].mutex);
+        qemu_cond_init(&comp_param[i].cond);
         qemu_thread_create(s->compress_thread + i, "compress",
                            do_data_compress, comp_param + i,
                            QEMU_THREAD_JOINABLE);