From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=47954 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Oulsm-0004Z5-Dq for qemu-devel@nongnu.org; Sun, 12 Sep 2010 08:42:09 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1Oulsk-0000JY-Sz for qemu-devel@nongnu.org; Sun, 12 Sep 2010 08:42:08 -0400 Received: from mx1.redhat.com ([209.132.183.28]:52100) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1Oulsk-0000JL-LJ for qemu-devel@nongnu.org; Sun, 12 Sep 2010 08:42:06 -0400 Message-ID: <4C8CCA91.4060001@redhat.com> Date: Sun, 12 Sep 2010 14:41:53 +0200 From: Avi Kivity MIME-Version: 1.0 Subject: Re: [Qemu-devel] QEMU interfaces for image streaming and post-copy block migration References: <4C864118.7070206@linux.vnet.ibm.com> <4C864D65.6090004@redhat.com> <4C8652CB.9060801@linux.vnet.ibm.com> In-Reply-To: <4C8652CB.9060801@linux.vnet.ibm.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Anthony Liguori Cc: Kevin Wolf , Stefan Hajnoczi , qemu-devel , "libvir-list@redhat.com" , Stefan Hajnoczi On 09/07/2010 05:57 PM, Anthony Liguori wrote: >> I agree that streaming should be generic, like block migration. The >> trivial generic implementation is: >> >> void bdrv_stream(BlockDriverState* bs) >> { >> for (sector = 0; sector< bdrv_getlength(bs); sector += n) { >> if (!bdrv_is_allocated(bs, sector,&n)) { > > Three problems here. First problem is that bdrv_is_allocated is > synchronous. Put the whole thing in a thread. > The second problem is that streaming makes the most sense when it's > the smallest useful piece of work whereas bdrv_is_allocated() may > return a very large range. > > You could cap it here but you then need to make sure that cap is at > least cluster_size to avoid a lot of unnecessary I/O. That seems like a nice solution. You probably want a multiple of the cluster size to retain efficiency. > > The QED streaming implementation is 140 LOCs too so you quickly end up > adding more code to the block formats to support these new interfaces > than it takes to just implement it in the block format. bdrv_is_allocated() already exists (and is needed for commit), what else is needed? cluster size? > Third problem is that streaming really requires being able to do zero > write detection in a meaningful way. You don't want to always do zero > write detection so you need another interface to mark a specific write > as a write that should be checked for zeros. You can do that in bdrv_stream(), above, before the actual write, and call bdrv_unmap() if you detect zeros. -- error compiling committee.c: too many arguments to function