Commit e03b644fe68b1c6401465b02724d261538dba10f
Committed by
Avi Kivity
1 parent
29d03158f9
Exists in
master
and in
6 other branches
KVM: introduce kvm_read_guest_cached
Introduce kvm_read_guest_cached() function in addition to write one we already have. [ by glauber: export function signature in kvm header ] Signed-off-by: Gleb Natapov <gleb@redhat.com> Signed-off-by: Glauber Costa <glommer@redhat.com> Acked-by: Rik van Riel <riel@redhat.com> Tested-by: Eric Munson <emunson@mgebm.net> Signed-off-by: Avi Kivity <avi@redhat.com>
Showing 2 changed files with 22 additions and 0 deletions Side-by-side Diff
include/linux/kvm_host.h
... | ... | @@ -381,6 +381,8 @@ |
381 | 381 | int kvm_read_guest_atomic(struct kvm *kvm, gpa_t gpa, void *data, |
382 | 382 | unsigned long len); |
383 | 383 | int kvm_read_guest(struct kvm *kvm, gpa_t gpa, void *data, unsigned long len); |
384 | +int kvm_read_guest_cached(struct kvm *kvm, struct gfn_to_hva_cache *ghc, | |
385 | + void *data, unsigned long len); | |
384 | 386 | int kvm_write_guest_page(struct kvm *kvm, gfn_t gfn, const void *data, |
385 | 387 | int offset, int len); |
386 | 388 | int kvm_write_guest(struct kvm *kvm, gpa_t gpa, const void *data, |
virt/kvm/kvm_main.c
... | ... | @@ -1418,6 +1418,26 @@ |
1418 | 1418 | } |
1419 | 1419 | EXPORT_SYMBOL_GPL(kvm_write_guest_cached); |
1420 | 1420 | |
1421 | +int kvm_read_guest_cached(struct kvm *kvm, struct gfn_to_hva_cache *ghc, | |
1422 | + void *data, unsigned long len) | |
1423 | +{ | |
1424 | + struct kvm_memslots *slots = kvm_memslots(kvm); | |
1425 | + int r; | |
1426 | + | |
1427 | + if (slots->generation != ghc->generation) | |
1428 | + kvm_gfn_to_hva_cache_init(kvm, ghc, ghc->gpa); | |
1429 | + | |
1430 | + if (kvm_is_error_hva(ghc->hva)) | |
1431 | + return -EFAULT; | |
1432 | + | |
1433 | + r = __copy_from_user(data, (void __user *)ghc->hva, len); | |
1434 | + if (r) | |
1435 | + return -EFAULT; | |
1436 | + | |
1437 | + return 0; | |
1438 | +} | |
1439 | +EXPORT_SYMBOL_GPL(kvm_read_guest_cached); | |
1440 | + | |
1421 | 1441 | int kvm_clear_guest_page(struct kvm *kvm, gfn_t gfn, int offset, int len) |
1422 | 1442 | { |
1423 | 1443 | return kvm_write_guest_page(kvm, gfn, (const void *) empty_zero_page, |