From patchwork Tue Jun 20 09:15:24 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xiao Guangrong X-Patchwork-Id: 778187 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3wsMkL4M4Kz9s4s for ; Tue, 20 Jun 2017 19:19:54 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="FWynM/TV"; dkim-atps=neutral Received: from localhost ([::1]:47457 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dNFKC-0002O4-9b for incoming@patchwork.ozlabs.org; Tue, 20 Jun 2017 05:19:52 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:52978) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dNFGR-0000DM-Fj for qemu-devel@nongnu.org; Tue, 20 Jun 2017 05:16:00 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dNFGP-0007s0-84 for qemu-devel@nongnu.org; Tue, 20 Jun 2017 05:15:59 -0400 Received: from mail-pf0-x244.google.com ([2607:f8b0:400e:c00::244]:33167) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dNFGP-0007rd-1r for qemu-devel@nongnu.org; Tue, 20 Jun 2017 05:15:57 -0400 Received: by mail-pf0-x244.google.com with SMTP id w12so21606918pfk.0 for ; Tue, 20 Jun 2017 02:15:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=L+ukj6vj49gt5KP/rV1mFnBwb+Bt0idyQ3CL8s/2G+o=; b=FWynM/TVVnHR5oMLGxm9fphD80amgvnFiqCHyT8RlNc2NND/RD4/plobcKbpgW71BR 6pkqg0YQfLYebJ9+ergCDYVUELAsFydupvod0riKP5zjlaNSrY4IIfPKHNtI1eqo25Mh 5LXyydTWw+vva/jkuylkhV82Owd3xVz40RbHdj8s/4CFcT6AArWFSwWCPB1AkuhEJzvJ aZee8uhzUJs6td4jsZRfXrHzylJNytaNxmrDD9HortYFoAiVwe9IhSKHGFDkLpAuuO3W HYSc+MMP7UWbOlut6WsnNIy0sWCxvArNGIZKqZZIqpJhbuG11doCRIjj4iRpq7GmP07o JHeg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=L+ukj6vj49gt5KP/rV1mFnBwb+Bt0idyQ3CL8s/2G+o=; b=pBm3C6dpiliE+oi3zi+1jXyQ9WAlMqKHleXOri5JQtBI6aVJltUTlCzwVC4KIVblXI iHmJEYFQF0Fs8feqNeO7KRCaoQq5JNgl7GKte5uVz5qHSCkWkDhUWH8wv8fIeKaarz2p PCr1Txt2EGUHOUVcHCT8w+QSwK2WOVT78E/v7YyXLt5Xz6wXYVuv1AMdavlJZM8+RQzf S3qJqZBUnyxyvFanlXcV0a77Ga4C3ls/Z7oMWozVNnR627+XFeXRKSmrqYJG9vI52q4Q gF/iC/5iREoAeQIi5SEAxwxT1IjrH9THA4QSO3m3rRyQuFgX/UtSBR44WbYC0R7V+S3v knxg== X-Gm-Message-State: AKS2vOxGHqzPbGU0BHDN4we7Bw6/5yAkCaocfqwmQZNbPeRCAW+2TsRG Mox5Vf0yt5+fuQ== X-Received: by 10.84.143.162 with SMTP id 31mr34238093plz.277.1497950156244; Tue, 20 Jun 2017 02:15:56 -0700 (PDT) Received: from eric.tencent.com ([203.205.141.35]) by smtp.gmail.com with ESMTPSA id o12sm26343810pfi.9.2017.06.20.02.15.53 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 20 Jun 2017 02:15:55 -0700 (PDT) From: guangrong.xiao@gmail.com X-Google-Original-From: xiaoguangrong@tencent.com To: pbonzini@redhat.com, mtosatti@redhat.com, avi.kivity@gmail.com, rkrcmar@redhat.com Date: Tue, 20 Jun 2017 17:15:24 +0800 Message-Id: <20170620091526.4287-6-xiaoguangrong@tencent.com> X-Mailer: git-send-email 2.9.4 In-Reply-To: <20170620091526.4287-1-xiaoguangrong@tencent.com> References: <20170620091526.4287-1-xiaoguangrong@tencent.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:400e:c00::244 Subject: [Qemu-devel] [PATCH v2 5/7] KVM: MMU: allow dirty log without write protect X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Xiao Guangrong , linux-kernel@vger.kernel.org, kvm@vger.kernel.org, qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" From: Xiao Guangrong A new flag, KVM_DIRTY_LOG_WITHOUT_WRITE_PROTECT, is introduced which indicates the userspace just wants to get the snapshot of dirty bitmap During live migration, after all snapshot of dirty bitmap is fetched from KVM, the guest memory can be write protected by calling KVM_WRITE_PROTECT_ALL_MEM Signed-off-by: Xiao Guangrong --- arch/x86/kvm/x86.c | 1 + include/uapi/linux/kvm.h | 6 +++++- virt/kvm/kvm_main.c | 15 ++++++++++++--- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index ad62c44..6343e5c 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -2677,6 +2677,7 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext) case KVM_CAP_SET_BOOT_CPU_ID: case KVM_CAP_SPLIT_IRQCHIP: case KVM_CAP_IMMEDIATE_EXIT: + case KVM_CAP_X86_DIRTY_LOG_WITHOUT_WRITE_PROTECT: r = 1; break; case KVM_CAP_ADJUST_CLOCK: diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h index 7d4a395..e0f348c 100644 --- a/include/uapi/linux/kvm.h +++ b/include/uapi/linux/kvm.h @@ -443,9 +443,12 @@ struct kvm_interrupt { }; /* for KVM_GET_DIRTY_LOG */ + +#define KVM_DIRTY_LOG_WITHOUT_WRITE_PROTECT 0x1 + struct kvm_dirty_log { __u32 slot; - __u32 padding1; + __u32 flags; union { void __user *dirty_bitmap; /* one bit per page */ __u64 padding2; @@ -896,6 +899,7 @@ struct kvm_ppc_resize_hpt { #define KVM_CAP_X86_GUEST_MWAIT 143 #define KVM_CAP_ARM_USER_IRQ 144 #define KVM_CAP_X86_WRITE_PROTECT_ALL_MEM 145 +#define KVM_CAP_X86_DIRTY_LOG_WITHOUT_WRITE_PROTECT 146 #ifdef KVM_CAP_IRQ_ROUTING diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index f0fe9d0..8b29462 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -1157,6 +1157,12 @@ int kvm_get_dirty_log_protect(struct kvm *kvm, unsigned long n; unsigned long *dirty_bitmap; unsigned long *dirty_bitmap_buffer; + bool write_protect; + + if (log->flags & ~KVM_DIRTY_LOG_WITHOUT_WRITE_PROTECT) + return -EINVAL; + + write_protect = !(log->flags & KVM_DIRTY_LOG_WITHOUT_WRITE_PROTECT); as_id = log->slot >> 16; id = (u16)log->slot; @@ -1184,11 +1190,14 @@ int kvm_get_dirty_log_protect(struct kvm *kvm, if (!dirty_bitmap[i]) continue; - *is_dirty = true; - mask = xchg(&dirty_bitmap[i], 0); dirty_bitmap_buffer[i] = mask; + if (!write_protect) + continue; + + *is_dirty = true; + if (mask) { offset = i * BITS_PER_LONG; kvm_arch_mmu_enable_log_dirty_pt_masked(kvm, memslot, @@ -3140,7 +3149,7 @@ static long kvm_vm_compat_ioctl(struct file *filp, sizeof(compat_log))) return -EFAULT; log.slot = compat_log.slot; - log.padding1 = compat_log.padding1; + log.flags = compat_log.padding1; log.padding2 = compat_log.padding2; log.dirty_bitmap = compat_ptr(compat_log.dirty_bitmap);