diff options
| author | Radim Krčmář <rkrcmar@redhat.com> | 2015-04-10 15:47:27 -0400 |
|---|---|---|
| committer | Paolo Bonzini <pbonzini@redhat.com> | 2015-05-08 04:51:38 -0400 |
| commit | 251eb84144ec7aba5e344fb8553c67e749655aef (patch) | |
| tree | 7bdf7614318665a65267d274cae7fbf3205b5263 /virt | |
| parent | 4eb64dce8d0a3ceccc0036383e4683b7c3ea7a50 (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.c | 6 |
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 | } |
| 1604 | EXPORT_SYMBOL_GPL(kvm_write_guest_page); | 1606 | EXPORT_SYMBOL_GPL(kvm_write_guest_page); |
