From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:55024) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YfrHb-0003Ro-H1 for qemu-devel@nongnu.org; Wed, 08 Apr 2015 10:48:48 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YfrHX-0004eY-Ge for qemu-devel@nongnu.org; Wed, 08 Apr 2015 10:48:47 -0400 Received: from mx1.redhat.com ([209.132.183.28]:37507) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YfrHX-0004eR-1v for qemu-devel@nongnu.org; Wed, 08 Apr 2015 10:48:43 -0400 From: Juan Quintela In-Reply-To: (Liang Z. Li's message of "Wed, 8 Apr 2015 14:00:04 +0000") References: <1428474011-30797-1-git-send-email-liang.z.li@intel.com> <1428474011-30797-11-git-send-email-liang.z.li@intel.com> <87a8yin9ac.fsf@neno.neno> Date: Wed, 08 Apr 2015 16:48:39 +0200 Message-ID: <87iod6llq0.fsf@neno.neno> MIME-Version: 1.0 Content-Type: text/plain Subject: Re: [Qemu-devel] [v7 10/14] migration: Add the core code for decompression Reply-To: quintela@redhat.com List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: "Li, Liang Z" Cc: "qemu-devel@nongnu.org" , "armbru@redhat.com" , "lcapitulino@redhat.com" , "Zhang, Yang Z" , "amit.shah@redhat.com" , "dgilbert@redhat.com" "Li, Liang Z" 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.