mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-15 00:04:15 +08:00
KVM: introduce gfn_to_hva()
Convert a guest frame number to the corresponding host virtual address. Signed-off-by: Izik Eidus <izike@qumranet.com> Signed-off-by: Avi Kivity <avi@qumranet.com>
This commit is contained in:
parent
f9d46eb0e4
commit
539cb6608c
@ -559,28 +559,37 @@ int kvm_is_visible_gfn(struct kvm *kvm, gfn_t gfn)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(kvm_is_visible_gfn);
|
EXPORT_SYMBOL_GPL(kvm_is_visible_gfn);
|
||||||
|
|
||||||
|
static unsigned long gfn_to_hva(struct kvm *kvm, gfn_t gfn)
|
||||||
|
{
|
||||||
|
struct kvm_memory_slot *slot;
|
||||||
|
|
||||||
|
gfn = unalias_gfn(kvm, gfn);
|
||||||
|
slot = __gfn_to_memslot(kvm, gfn);
|
||||||
|
if (!slot)
|
||||||
|
return bad_hva();
|
||||||
|
return (slot->userspace_addr + (gfn - slot->base_gfn) * PAGE_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Requires current->mm->mmap_sem to be held
|
* Requires current->mm->mmap_sem to be held
|
||||||
*/
|
*/
|
||||||
static struct page *__gfn_to_page(struct kvm *kvm, gfn_t gfn)
|
static struct page *__gfn_to_page(struct kvm *kvm, gfn_t gfn)
|
||||||
{
|
{
|
||||||
struct kvm_memory_slot *slot;
|
|
||||||
struct page *page[1];
|
struct page *page[1];
|
||||||
|
unsigned long addr;
|
||||||
int npages;
|
int npages;
|
||||||
|
|
||||||
might_sleep();
|
might_sleep();
|
||||||
|
|
||||||
gfn = unalias_gfn(kvm, gfn);
|
addr = gfn_to_hva(kvm, gfn);
|
||||||
slot = __gfn_to_memslot(kvm, gfn);
|
if (kvm_is_error_hva(addr)) {
|
||||||
if (!slot) {
|
|
||||||
get_page(bad_page);
|
get_page(bad_page);
|
||||||
return bad_page;
|
return bad_page;
|
||||||
}
|
}
|
||||||
|
|
||||||
npages = get_user_pages(current, current->mm,
|
npages = get_user_pages(current, current->mm, addr, 1, 1, 1, page,
|
||||||
slot->userspace_addr
|
NULL);
|
||||||
+ (gfn - slot->base_gfn) * PAGE_SIZE, 1,
|
|
||||||
1, 1, page, NULL);
|
|
||||||
if (npages != 1) {
|
if (npages != 1) {
|
||||||
get_page(bad_page);
|
get_page(bad_page);
|
||||||
return bad_page;
|
return bad_page;
|
||||||
|
Loading…
Reference in New Issue
Block a user