KVM: Portability: Move kvm_vcpu_ioctl_get_dirty_log to arch-specific file
Meanwhile keep the interface in common, and leave as more logic in common as possible. Signed-off-by: Zhang Xiantao <xiantao.zhang@intel.com> Signed-off-by: Avi Kivity <avi@qumranet.com>
This commit is contained in:
committed by
Avi Kivity
parent
9327fd1195
commit
5bb064dcde
@@ -644,6 +644,11 @@ void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu);
|
|||||||
|
|
||||||
int kvm_dev_ioctl_check_extension(long ext);
|
int kvm_dev_ioctl_check_extension(long ext);
|
||||||
|
|
||||||
|
int kvm_get_dirty_log(struct kvm *kvm,
|
||||||
|
struct kvm_dirty_log *log, int *is_dirty);
|
||||||
|
int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm,
|
||||||
|
struct kvm_dirty_log *log);
|
||||||
|
|
||||||
int kvm_vm_ioctl_set_memory_region(struct kvm *kvm,
|
int kvm_vm_ioctl_set_memory_region(struct kvm *kvm,
|
||||||
struct
|
struct
|
||||||
kvm_userspace_memory_region *mem,
|
kvm_userspace_memory_region *mem,
|
||||||
|
@@ -389,19 +389,14 @@ int kvm_vm_ioctl_set_memory_region(struct kvm *kvm,
|
|||||||
return kvm_set_memory_region(kvm, mem, user_alloc);
|
return kvm_set_memory_region(kvm, mem, user_alloc);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
int kvm_get_dirty_log(struct kvm *kvm,
|
||||||
* Get (and clear) the dirty memory log for a memory slot.
|
struct kvm_dirty_log *log, int *is_dirty)
|
||||||
*/
|
|
||||||
static int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm,
|
|
||||||
struct kvm_dirty_log *log)
|
|
||||||
{
|
{
|
||||||
struct kvm_memory_slot *memslot;
|
struct kvm_memory_slot *memslot;
|
||||||
int r, i;
|
int r, i;
|
||||||
int n;
|
int n;
|
||||||
unsigned long any = 0;
|
unsigned long any = 0;
|
||||||
|
|
||||||
mutex_lock(&kvm->lock);
|
|
||||||
|
|
||||||
r = -EINVAL;
|
r = -EINVAL;
|
||||||
if (log->slot >= KVM_MEMORY_SLOTS)
|
if (log->slot >= KVM_MEMORY_SLOTS)
|
||||||
goto out;
|
goto out;
|
||||||
@@ -420,17 +415,11 @@ static int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm,
|
|||||||
if (copy_to_user(log->dirty_bitmap, memslot->dirty_bitmap, n))
|
if (copy_to_user(log->dirty_bitmap, memslot->dirty_bitmap, n))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
/* If nothing is dirty, don't bother messing with page tables. */
|
if (any)
|
||||||
if (any) {
|
*is_dirty = 1;
|
||||||
kvm_mmu_slot_remove_write_access(kvm, log->slot);
|
|
||||||
kvm_flush_remote_tlbs(kvm);
|
|
||||||
memset(memslot->dirty_bitmap, 0, n);
|
|
||||||
}
|
|
||||||
|
|
||||||
r = 0;
|
r = 0;
|
||||||
|
|
||||||
out:
|
out:
|
||||||
mutex_unlock(&kvm->lock);
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -937,6 +937,37 @@ static int kvm_vm_ioctl_set_irqchip(struct kvm *kvm, struct kvm_irqchip *chip)
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Get (and clear) the dirty memory log for a memory slot.
|
||||||
|
*/
|
||||||
|
int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm,
|
||||||
|
struct kvm_dirty_log *log)
|
||||||
|
{
|
||||||
|
int r;
|
||||||
|
int n;
|
||||||
|
struct kvm_memory_slot *memslot;
|
||||||
|
int is_dirty = 0;
|
||||||
|
|
||||||
|
mutex_lock(&kvm->lock);
|
||||||
|
|
||||||
|
r = kvm_get_dirty_log(kvm, log, &is_dirty);
|
||||||
|
if (r)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
/* If nothing is dirty, don't bother messing with page tables. */
|
||||||
|
if (is_dirty) {
|
||||||
|
kvm_mmu_slot_remove_write_access(kvm, log->slot);
|
||||||
|
kvm_flush_remote_tlbs(kvm);
|
||||||
|
memslot = &kvm->memslots[log->slot];
|
||||||
|
n = ALIGN(memslot->npages, BITS_PER_LONG) / 8;
|
||||||
|
memset(memslot->dirty_bitmap, 0, n);
|
||||||
|
}
|
||||||
|
r = 0;
|
||||||
|
out:
|
||||||
|
mutex_unlock(&kvm->lock);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
long kvm_arch_vm_ioctl(struct file *filp,
|
long kvm_arch_vm_ioctl(struct file *filp,
|
||||||
unsigned int ioctl, unsigned long arg)
|
unsigned int ioctl, unsigned long arg)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user