[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v2 5/7] KVM: MMU: allow dirty log without write prot
From: |
guangrong . xiao |
Subject: |
[Qemu-devel] [PATCH v2 5/7] KVM: MMU: allow dirty log without write protect |
Date: |
Tue, 20 Jun 2017 17:15:24 +0800 |
From: Xiao Guangrong <address@hidden>
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 <address@hidden>
---
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);
--
2.9.4
- [Qemu-devel] [PATCH v2 0/7] KVM: MMU: fast write protect, guangrong . xiao, 2017/06/20
- [Qemu-devel] [PATCH v2 1/7] KVM: MMU: correct the behavior of mmu_spte_update_no_track, guangrong . xiao, 2017/06/20
- [Qemu-devel] [PATCH v2 2/7] KVM: MMU: introduce possible_writable_spte_bitmap, guangrong . xiao, 2017/06/20
- [Qemu-devel] [PATCH v2 3/7] KVM: MMU: introduce kvm_mmu_write_protect_all_pages, guangrong . xiao, 2017/06/20
- [Qemu-devel] [PATCH v2 5/7] KVM: MMU: allow dirty log without write protect,
guangrong . xiao <=
- [Qemu-devel] [PATCH v2 6/7] KVM: MMU: clarify fast_pf_fix_direct_spte, guangrong . xiao, 2017/06/20
- [Qemu-devel] [PATCH v2 4/7] KVM: MMU: enable KVM_WRITE_PROTECT_ALL_MEM, guangrong . xiao, 2017/06/20
- [Qemu-devel] [PATCH v2 7/7] KVM: MMU: stop using mmu_spte_get_lockless under mmu-lock, guangrong . xiao, 2017/06/20