From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:57103) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YakqP-0003Ia-Jt for qemu-devel@nongnu.org; Wed, 25 Mar 2015 08:55:41 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YakqL-00030j-JX for qemu-devel@nongnu.org; Wed, 25 Mar 2015 08:55:37 -0400 Sender: Paolo Bonzini Message-ID: <5512B03B.5040502@redhat.com> Date: Wed, 25 Mar 2015 13:55:23 +0100 From: Paolo Bonzini MIME-Version: 1.0 References: <1427276174-9130-1-git-send-email-wency@cn.fujitsu.com> <1427276174-9130-11-git-send-email-wency@cn.fujitsu.com> In-Reply-To: <1427276174-9130-11-git-send-email-wency@cn.fujitsu.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [RFC PATCH COLO v2 10/13] Backup: clear all bitmap when doing block checkpoint List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Wen Congyang , qemu devel , Fam Zheng , Max Reitz Cc: Kevin Wolf , Lai Jiangshan , qemu block , Jeff Cody , Jiang Yunhong , Dong Eddie , "Dr. David Alan Gilbert" , Gonglei , Stefan Hajnoczi , Yang Hongyang , zhanghailiang On 25/03/2015 10:36, Wen Congyang wrote: > > +void backup_do_checkpoint(BlockJob *job, Error **errp) > +{ > + BackupBlockJob *backup_job = container_of(job, BackupBlockJob, common); > + > + if (job->driver != &backup_job_driver) { > + error_setg(errp, "It is not backup job"); > + return; > + } > + > + hbitmap_reset_all(backup_job->bitmap); > +} Please add instead a block_job_do_checkpoint API, and a do_checkpoint function pointer to BlockJobDriver. > +{ > +#if 0 > + hbitmap_reset(hb, 0, hb->size << hb->granularity); > +#else > + uint64_t size = hb->size; > + unsigned int i; > + > + /* Same as hbitmap_alloc() except memset() */ > + for (i = HBITMAP_LEVELS; i-- > 0; ) { This can be "--i >= 1"... > + size = MAX((size + BITS_PER_LONG - 1) >> BITS_PER_LEVEL, 1); > + memset(hb->levels[i], 0, size * sizeof(unsigned long)); > + } > + > + assert(size == 1); > + hb->levels[0][0] |= 1UL << (BITS_PER_LONG - 1); ... if you use "=" instead of "|=" here. > +#endif > +} Please pick one implementation (no #if), and also add a testcase to tests/test-hbitmap.c. Paolo