aboutsummaryrefslogtreecommitdiffstats
path: root/arch/ia64
diff options
context:
space:
mode:
Diffstat (limited to 'arch/ia64')
-rw-r--r--arch/ia64/kvm/kvm-ia64.c30
1 files changed, 11 insertions, 19 deletions
diff --git a/arch/ia64/kvm/kvm-ia64.c b/arch/ia64/kvm/kvm-ia64.c
index d85b5d2d52d1..5cb58655cd5f 100644
--- a/arch/ia64/kvm/kvm-ia64.c
+++ b/arch/ia64/kvm/kvm-ia64.c
@@ -1795,25 +1795,15 @@ void kvm_arch_exit(void)
1795 kvm_vmm_info = NULL; 1795 kvm_vmm_info = NULL;
1796} 1796}
1797 1797
1798static int kvm_ia64_sync_dirty_log(struct kvm *kvm, 1798static void kvm_ia64_sync_dirty_log(struct kvm *kvm,
1799 struct kvm_dirty_log *log) 1799 struct kvm_memory_slot *memslot)
1800{ 1800{
1801 struct kvm_memory_slot *memslot; 1801 int i;
1802 int r, i;
1803 long base; 1802 long base;
1804 unsigned long n; 1803 unsigned long n;
1805 unsigned long *dirty_bitmap = (unsigned long *)(kvm->arch.vm_base + 1804 unsigned long *dirty_bitmap = (unsigned long *)(kvm->arch.vm_base +
1806 offsetof(struct kvm_vm_data, kvm_mem_dirty_log)); 1805 offsetof(struct kvm_vm_data, kvm_mem_dirty_log));
1807 1806
1808 r = -EINVAL;
1809 if (log->slot >= KVM_MEMORY_SLOTS)
1810 goto out;
1811
1812 memslot = &kvm->memslots->memslots[log->slot];
1813 r = -ENOENT;
1814 if (!memslot->dirty_bitmap)
1815 goto out;
1816
1817 n = kvm_dirty_bitmap_bytes(memslot); 1807 n = kvm_dirty_bitmap_bytes(memslot);
1818 base = memslot->base_gfn / BITS_PER_LONG; 1808 base = memslot->base_gfn / BITS_PER_LONG;
1819 1809
@@ -1823,9 +1813,6 @@ static int kvm_ia64_sync_dirty_log(struct kvm *kvm,
1823 dirty_bitmap[base + i] = 0; 1813 dirty_bitmap[base + i] = 0;
1824 } 1814 }
1825 spin_unlock(&kvm->arch.dirty_log_lock); 1815 spin_unlock(&kvm->arch.dirty_log_lock);
1826 r = 0;
1827out:
1828 return r;
1829} 1816}
1830 1817
1831int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm, 1818int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm,
@@ -1838,10 +1825,16 @@ int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm,
1838 1825
1839 mutex_lock(&kvm->slots_lock); 1826 mutex_lock(&kvm->slots_lock);
1840 1827
1841 r = kvm_ia64_sync_dirty_log(kvm, log); 1828 r = -EINVAL;
1842 if (r) 1829 if (log->slot >= KVM_MEMORY_SLOTS)
1830 goto out;
1831
1832 memslot = &kvm->memslots->memslots[log->slot];
1833 r = -ENOENT;
1834 if (!memslot->dirty_bitmap)
1843 goto out; 1835 goto out;
1844 1836
1837 kvm_ia64_sync_dirty_log(kvm, memslot);
1845 r = kvm_get_dirty_log(kvm, log, &is_dirty); 1838 r = kvm_get_dirty_log(kvm, log, &is_dirty);
1846 if (r) 1839 if (r)
1847 goto out; 1840 goto out;
@@ -1849,7 +1842,6 @@ int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm,
1849 /* If nothing is dirty, don't bother messing with page tables. */ 1842 /* If nothing is dirty, don't bother messing with page tables. */
1850 if (is_dirty) { 1843 if (is_dirty) {
1851 kvm_flush_remote_tlbs(kvm); 1844 kvm_flush_remote_tlbs(kvm);
1852 memslot = &kvm->memslots->memslots[log->slot];
1853 n = kvm_dirty_bitmap_bytes(memslot); 1845 n = kvm_dirty_bitmap_bytes(memslot);
1854 memset(memslot->dirty_bitmap, 0, n); 1846 memset(memslot->dirty_bitmap, 0, n);
1855 } 1847 }