"Li, Liang Z" <liang.z...@intel.com> wrote: >> > @@ -889,7 +889,6 @@ static inline void >> start_compression(CompressParam *param) >> > qemu_mutex_unlock(¶m->mutex); } >> > >> > - >> > static uint64_t bytes_transferred; >> > >> > static void flush_compressed_data(QEMUFile *f) @@ -1458,8 +1457,28 >> @@ >> > void ram_handle_compressed(void *host, uint8_t ch, uint64_t size) >> > >> > static void *do_data_decompress(void *opaque) { >> > + DecompressParam *param = opaque; >> > + size_t pagesize; >> > + >> > while (true) { >> > - /* To be done */ >> > + qemu_mutex_lock(¶m->mutex); >> > + while (!param->start && !param->quit) { >> > + qemu_cond_wait(¶m->cond, ¶m->mutex); >> >> We don't check here if we have received a quit >> >> >> > + pagesize = TARGET_PAGE_SIZE; >> > + /* uncompress() will return failed in some case, especially >> > + * when the page is dirted when doing the compression, it's >> > + * not a problem because the dirty page will be retransferred >> > + * and uncompress() won't break the data in other pages. >> > + */ >> > + uncompress((Bytef *)param->des, &pagesize, >> > + (const Bytef *)param->compbuf, param->len); >> > + param->start = false; >> > + } >> > + if (param->quit) { >> > + qemu_mutex_unlock(¶m->mutex); >> > + break; >> > + } >> > + qemu_mutex_unlock(¶m->mutex); >> > } >> > >> > return NULL; >> > @@ -1489,6 +1508,12 @@ void migrate_decompress_threads_join(void) >> > >> > thread_count = migrate_decompress_threads(); >> > for (i = 0; i < thread_count; i++) { >> > + qemu_mutex_lock(&decomp_param[i].mutex); >> > + decomp_param[i].quit = true; >> > + qemu_cond_signal(&decomp_param[i].cond); >> >> We set quit and send a signal to wakeup the thread, but it will try to >> uncompress a page. Shouldn't we change the position of the param->quit >> check for exit? I think it should be inside the loop. > > Yes, you are right. if (param->quit) should be put in front of uncompress(). > I will change it in the final version. (I really hope the next > version is the final version :) )
I am sorry this took so long :p Later, Juan.