Commit 86ab8cffb498077e926957f099b064db3751c1de
Committed by
Avi Kivity
1 parent
037d92dc5d
Exists in
smarc-l5.0.0_1.0.0-ga
and in
5 other branches
KVM: introduce gfn_to_hva_read/kvm_read_hva/kvm_read_hva_atomic
This set of functions is only used to read data from host space, in the later patch, we will only get a readonly hva in gfn_to_hva_read, and the function name is a good hint to let gfn_to_hva_read to pair with kvm_read_hva()/kvm_read_hva_atomic() Signed-off-by: Xiao Guangrong <xiaoguangrong@linux.vnet.ibm.com> Signed-off-by: Avi Kivity <avi@redhat.com>
Showing 1 changed file with 23 additions and 4 deletions Side-by-side Diff
virt/kvm/kvm_main.c
... | ... | @@ -1002,6 +1002,25 @@ |
1002 | 1002 | } |
1003 | 1003 | EXPORT_SYMBOL_GPL(gfn_to_hva); |
1004 | 1004 | |
1005 | +/* | |
1006 | + * The hva returned by this function is only allowed to be read. | |
1007 | + * It should pair with kvm_read_hva() or kvm_read_hva_atomic(). | |
1008 | + */ | |
1009 | +static unsigned long gfn_to_hva_read(struct kvm *kvm, gfn_t gfn) | |
1010 | +{ | |
1011 | + return gfn_to_hva_many(gfn_to_memslot(kvm, gfn), gfn, NULL); | |
1012 | +} | |
1013 | + | |
1014 | +static int kvm_read_hva(void *data, void __user *hva, int len) | |
1015 | +{ | |
1016 | + return __copy_from_user(data, hva, len); | |
1017 | +} | |
1018 | + | |
1019 | +static int kvm_read_hva_atomic(void *data, void __user *hva, int len) | |
1020 | +{ | |
1021 | + return __copy_from_user_inatomic(data, hva, len); | |
1022 | +} | |
1023 | + | |
1005 | 1024 | int get_user_page_nowait(struct task_struct *tsk, struct mm_struct *mm, |
1006 | 1025 | unsigned long start, int write, struct page **page) |
1007 | 1026 | { |
1008 | 1027 | |
... | ... | @@ -1274,10 +1293,10 @@ |
1274 | 1293 | int r; |
1275 | 1294 | unsigned long addr; |
1276 | 1295 | |
1277 | - addr = gfn_to_hva(kvm, gfn); | |
1296 | + addr = gfn_to_hva_read(kvm, gfn); | |
1278 | 1297 | if (kvm_is_error_hva(addr)) |
1279 | 1298 | return -EFAULT; |
1280 | - r = __copy_from_user(data, (void __user *)addr + offset, len); | |
1299 | + r = kvm_read_hva(data, (void __user *)addr + offset, len); | |
1281 | 1300 | if (r) |
1282 | 1301 | return -EFAULT; |
1283 | 1302 | return 0; |
1284 | 1303 | |
... | ... | @@ -1312,11 +1331,11 @@ |
1312 | 1331 | gfn_t gfn = gpa >> PAGE_SHIFT; |
1313 | 1332 | int offset = offset_in_page(gpa); |
1314 | 1333 | |
1315 | - addr = gfn_to_hva(kvm, gfn); | |
1334 | + addr = gfn_to_hva_read(kvm, gfn); | |
1316 | 1335 | if (kvm_is_error_hva(addr)) |
1317 | 1336 | return -EFAULT; |
1318 | 1337 | pagefault_disable(); |
1319 | - r = __copy_from_user_inatomic(data, (void __user *)addr + offset, len); | |
1338 | + r = kvm_read_hva_atomic(data, (void __user *)addr + offset, len); | |
1320 | 1339 | pagefault_enable(); |
1321 | 1340 | if (r) |
1322 | 1341 | return -EFAULT; |