aboutsummaryrefslogtreecommitdiffstats
path: root/virt
diff options
context:
space:
mode:
authorRadim Krčmář <rkrcmar@redhat.com>2015-04-10 15:47:27 -0400
committerPaolo Bonzini <pbonzini@redhat.com>2015-05-08 04:51:38 -0400
commit251eb84144ec7aba5e344fb8553c67e749655aef (patch)
tree7bdf7614318665a65267d274cae7fbf3205b5263 /virt
parent4eb64dce8d0a3ceccc0036383e4683b7c3ea7a50 (diff)
KVM: reuse memslot in kvm_write_guest_page
Caching memslot value and using mark_page_dirty_in_slot() avoids another O(log N) search when dirtying the page. Signed-off-by: Radim Krčmář <rkrcmar@redhat.com> Message-Id: <1428695247-27603-1-git-send-email-rkrcmar@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'virt')
-rw-r--r--virt/kvm/kvm_main.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index 90977418aeb6..b6d415156283 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -1590,15 +1590,17 @@ int kvm_write_guest_page(struct kvm *kvm, gfn_t gfn, const void *data,
1590 int offset, int len) 1590 int offset, int len)
1591{ 1591{
1592 int r; 1592 int r;
1593 struct kvm_memory_slot *memslot;
1593 unsigned long addr; 1594 unsigned long addr;
1594 1595
1595 addr = gfn_to_hva(kvm, gfn); 1596 memslot = gfn_to_memslot(kvm, gfn);
1597 addr = gfn_to_hva_memslot(memslot, gfn);
1596 if (kvm_is_error_hva(addr)) 1598 if (kvm_is_error_hva(addr))
1597 return -EFAULT; 1599 return -EFAULT;
1598 r = __copy_to_user((void __user *)addr + offset, data, len); 1600 r = __copy_to_user((void __user *)addr + offset, data, len);
1599 if (r) 1601 if (r)
1600 return -EFAULT; 1602 return -EFAULT;
1601 mark_page_dirty(kvm, gfn); 1603 mark_page_dirty_in_slot(kvm, memslot, gfn);
1602 return 0; 1604 return 0;
1603} 1605}
1604EXPORT_SYMBOL_GPL(kvm_write_guest_page); 1606EXPORT_SYMBOL_GPL(kvm_write_guest_page);