From mboxrd@z Thu Jan 1 00:00:00 1970 From: Avi Kivity Subject: Re: [PATCH 0/1] KVM: make get dirty log ioctl return the first dirty page's position Date: Wed, 24 Feb 2010 12:03:22 +0200 Message-ID: <4B84F96A.1000205@redhat.com> References: <20100224174303.881da4f4.yoshikawa.takuya@oss.ntt.co.jp> <4B84E985.8000508@redhat.com> <4B84F557.6020400@oss.ntt.co.jp> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Cc: mtosatti@redhat.com, kvm@vger.kernel.org To: Takuya Yoshikawa Return-path: Received: from mx1.redhat.com ([209.132.183.28]:34678 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756352Ab0BXKD0 (ORCPT ); Wed, 24 Feb 2010 05:03:26 -0500 In-Reply-To: <4B84F557.6020400@oss.ntt.co.jp> Sender: kvm-owner@vger.kernel.org List-ID: On 02/24/2010 11:45 AM, Takuya Yoshikawa wrote: > Avi Kivity wrote: >>> >>> Result: >>> ... >>> kvm_get_map(slot 0): r= 3, slot.len= 655360(2) >>> kvm_get_map(slot 1): r= 2044, slot.len= 535822336(2044) >>> kvm_get_map(slot 2): r= 1, slot.len= 131072(0) >>> kvm_get_map(slot 3): r= 1, slot.len= 131072(0) >>> kvm_get_map(slot 4): r= 1, slot.len= 131072(0) >>> kvm_get_map(slot 5): r= 64, slot.len= 16777216(64) >>> kvm_get_map(slot 6): r= 1, slot.len= 32768(0) >>> kvm_get_map(slot 7): r= 1, slot.len= 32768(0) >>> kvm_get_map(slot 0): r= 3, slot.len= 655360(2) >>> kvm_get_map(slot 1): r= 2044, slot.len= 535822336(2044) >>> kvm_get_map(slot 2): r= 1, slot.len= 131072(0) >>> kvm_get_map(slot 3): r= 1, slot.len= 131072(0) >>> kvm_get_map(slot 4): r= 1, slot.len= 131072(0) >>> kvm_get_map(slot 5): r= 64, slot.len= 16777216(64) >>> kvm_get_map(slot 6): r= 1, slot.len= 32768(0) >>> kvm_get_map(slot 7): r= 1, slot.len= 32768(0) >>> kvm_get_map(slot 0): r= 3, slot.len= 655360(2) >>> kvm_get_map(slot 1): r= 2044, slot.len= 535822336(2044) >>> kvm_get_map(slot 2): r= 1, slot.len= 131072(0) >>> kvm_get_map(slot 3): r= 1, slot.len= 131072(0) >>> kvm_get_map(slot 4): r= 1, slot.len= 131072(0) >>> kvm_get_map(slot 5): r= 64, slot.len= 16777216(64) >>> kvm_get_map(slot 6): r= 1, slot.len= 32768(0) >>> kvm_get_map(slot 7): r= 1, slot.len= 32768(0) >>> kvm_get_map(slot 0): r= 3, slot.len= 655360(2) >>> kvm_get_map(slot 1): r= 2044, slot.len= 535822336(2044) >>> kvm_get_map(slot 2): r= 1, slot.len= 131072(0) >>> kvm_get_map(slot 3): r= 1, slot.len= 131072(0) >>> kvm_get_map(slot 4): r= 1, slot.len= 131072(0) >>> kvm_get_map(slot 5): r= 64, slot.len= 16777216(64) >>> kvm_get_map(slot 6): r= 1, slot.len= 32768(0) >>> kvm_get_map(slot 7): r= 1, slot.len= 32768(0) >>> ... >> >> Seems to confirm - not much can be skipped. >> > > > >> kvm_get_map(slot 1): r= 2044, slot.len= 535822336(2044) > Am I wrong? in this case, the return value is suggesting > we can skip every 2044(the value in the bracket) bitmap check, right? Er, I was wrong, I thought the value in the brackets had the same units as slots.len. But it's in units of ulongs. In this case, the entire bitmap can be skipped, so the saving would be significant. But this is for an idle load, where we'll converge quickly anyway. For a busy server, things will look different. So I recommend you look at the double buffer approach. This can eliminate the kernel scan, the copying, and the userspace scan entirely, as well as remove the vmalloc(). -- error compiling committee.c: too many arguments to function