From patchwork Wed May 3 10:52:22 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xiao Guangrong X-Patchwork-Id: 9709369 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 9724960351 for ; Wed, 3 May 2017 10:54:14 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 899F028427 for ; Wed, 3 May 2017 10:54:14 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 7E301285E9; Wed, 3 May 2017 10:54:14 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.5 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, FREEMAIL_FROM, RCVD_IN_DNSWL_HI, RCVD_IN_SORBS_SPAM autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1B86C28427 for ; Wed, 3 May 2017 10:54:14 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754119AbdECKyJ (ORCPT ); Wed, 3 May 2017 06:54:09 -0400 Received: from mail-pf0-f193.google.com ([209.85.192.193]:33136 "EHLO mail-pf0-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753312AbdECKxT (ORCPT ); Wed, 3 May 2017 06:53:19 -0400 Received: by mail-pf0-f193.google.com with SMTP id b23so3809944pfc.0; Wed, 03 May 2017 03:53:19 -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=8L3Vhcz/fxvtNQWwsG1o1Ckcrnn854Hjb5jecgpiJuE=; b=BnqH/AZGeNZz8cvyousJl4XtILFQKdQwwsXbGry7PZAjNB7Q/4ocYQAAhI26MXrBIF ij4uL1VO65qZBzJODJMrJ/h+0SvrSKb5HMc7uxGNC8xlTD9JP+j/j0/ctsslLA61JvWA aBVY5Dgi0gto1t78iGHO11Lw4exh4gohQdPM9Oae1tDBEIdjYfducahWv4DCjl6bTRxz S0fjN4KLoNLOALOU+R95W4HdATWYygYMDX9m6fODK6j7yVgQa5mYAp6N+y+u3VruiQtU pNACP+U7KhHBvUoL3Khi7AxHaRdFvjJQ3r9seY1FRU5xTIjJ8WRbWgCTQZL2rZ7xQbP1 rGcw== 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=8L3Vhcz/fxvtNQWwsG1o1Ckcrnn854Hjb5jecgpiJuE=; b=GZsQeWv+aSYPvV7nbfOf787NsMpcIiSE2afJ+UVayPUSWIh2QAr6onBx9db9At3til zt/CQfbm2n7vj4DZtoPiwaKJvw/IMbYiUIf8x4LLf78X0/aalFGOpvXSp/WBcagqR8bB R7FOqQjkBgqTXwfGSl30uuiqhRJON7Eu+FAulPKsJW9TE0HGXckDHzpkcEqpMfy9by7F U7OUNBZfvgI+2OcMKOdR3EZ00ytFpmW2MHto5q26nuU72/CZ/ReRY/OVs846wiHQExcK pFQ2byb00Ifbmn9fTgHfSsAHrX5OswKbsE7MTH5TfKn9tf2RdygRSPApBYo2M09w0vBn 68nQ== X-Gm-Message-State: AN3rC/7wrK2g/lYtjXlXwhvPtoSeHcg6rGj9TamQjqJfUw+O4QefmtCO S+3wscHs8r2dD6ZT X-Received: by 10.99.60.21 with SMTP id j21mr23665203pga.99.1493808798733; Wed, 03 May 2017 03:53:18 -0700 (PDT) Received: from eric.tencent.com ([203.205.141.35]) by smtp.gmail.com with ESMTPSA id d24sm4395561pfb.97.2017.05.03.03.53.16 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 03 May 2017 03:53:18 -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 Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, qemu-devel@nongnu.org, Xiao Guangrong Subject: [PATCH 5/7] KVM: MMU: allow dirty log without write protect Date: Wed, 3 May 2017 18:52:22 +0800 Message-Id: <20170503105224.19049-6-xiaoguangrong@tencent.com> X-Mailer: git-send-email 2.9.3 In-Reply-To: <20170503105224.19049-1-xiaoguangrong@tencent.com> References: <20170503105224.19049-1-xiaoguangrong@tencent.com> Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP 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 dcbeaf4..524c96b 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -2670,6 +2670,7 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext) case KVM_CAP_SPLIT_IRQCHIP: case KVM_CAP_IMMEDIATE_EXIT: case KVM_CAP_X86_WRITE_PROTECT_ALL_MEM: + 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 035bc51..c82e4d1 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -1169,6 +1169,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; @@ -1196,11 +1202,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, @@ -3155,7 +3164,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);