Swapping
PATCH 2/4 Swapping
this patch make gfn_to_page always safe function (return bad_page in case there is no such page in the guest)
Quoted 1 line
From
51a8851a2805f5b61d3fbe506ab317ecb677c3daMon Sep 17 00:00:00 2001
From: Izik Eidus <izik@Home1.(none)>
Date: Sat, 13 Oct 2007 02:01:54 +0200
Subject: [PATCH] change gfn_to_page to be safe always function.
--- drivers/kvm/kvm.h | 3 ++- drivers/kvm/kvm_main.c | 26 ++++++++++++++------------ drivers/kvm/mmu.c | 16 +++++----------- drivers/kvm/paging_tmpl.h | 11 +++-------- 4 files changed, 24 insertions(+), 32 deletions(-)
drivers/kvm/kvm.h +2 -1
@@ -565,8 +565,9 @@ static inline int is_error_hpa(hpa_t hpa) { return hpa >> HPA_MSB; }hpa_t gva_to_hpa (struct kvm_vcpu *vcpu,gva_t gva);struct page *gva_to_page (struct kvm_vcpu *vcpu,gva_t gva); -extern hpa_t bad_page_address; +extern struct page *bad_page; +int is_error_page (struct page *page);gfn_t unalias_gfn (struct kvm *kvm,gfn_t gfn);struct page *gfn_to_page (struct kvm *kvm,gfn_t gfn); int kvm_read_guest_page(struct kvm *kvm, gfn_t gfn, void *data, int offset,
drivers/kvm/kvm_main.c +14 -12
@@ -1012,6 +1012,12 @@ static int kvm_vm_ioctl_set_irqchip(struct kvm *kvm, struct kvm_irqchip *chip)return r; } +int is_error_page (struct page *page) +{ +return page == bad_page; +} +EXPORT_SYMBOL_GPL (is_error_page); +gfn_t unalias_gfn (struct kvm *kvm,gfn_t gfn) {int i;
@@ -1053,7 +1059,7 @@ struct page *gfn_to_page(struct kvm *kvm, gfn_t gfn) gfn =unalias_gfn (kvm, gfn); slot =__gfn_to_memslot (kvm, gfn);if (!slot) -return NULL ; +return bad_page;return slot->phys_mem[gfn - slot->base_gfn]; }EXPORT_SYMBOL_GPL (gfn_to_page);
@@ -1073,7 +1079,7 @@ int kvm_read_guest_page(struct kvm *kvm, gfn_t gfn, void *data, int offset,struct page *page; page =gfn_to_page (kvm, gfn); -if (!page) +if (is_error_page (page))return -EFAULT ; page_virt =kmap_atomic (page,KM_USER0 );
@@ -1111,7 +1117,7 @@ int kvm_write_guest_page(struct kvm *kvm, gfn_t gfn, const void *data,struct page *page; page =gfn_to_page (kvm, gfn); -if (!page) +if (is_error_page (page))return -EFAULT ; page_virt =kmap_atomic (page,KM_USER0 );
@@ -1149,7 +1155,7 @@ int kvm_clear_guest_page(struct kvm *kvm, gfn_t gfn, int offset, int len)struct page *page; page =gfn_to_page (kvm, gfn); -if (!page) +if (is_error_page (page))return -EFAULT ; page_virt =kmap_atomic (page,KM_USER0 );
@@ -3075,7 +3081,7 @@ static struct page *kvm_vm_nopage(struct vm_area_struct *vma, pgoff = ((address - vma->vm_start) >>PAGE_SHIFT ) + vma->vm_pgoff; page =gfn_to_page (kvm, pgoff); -if (!page) +if (is_error_page (page))return NOPAGE_SIGBUS ;get_page (page);if (type !=NULL )
@@ -3390,7 +3396,7 @@ static struct sys_device kvm_sysdev = { .cls = &kvm_sysdev_class, }; -hpa_t bad_page_address; +struct page *bad_page;static inline struct kvm_vcpu *preempt_notifier_to_vcpu (struct preempt_notifier *pn)
@@ -3519,7 +3525,6 @@ EXPORT_SYMBOL_GPL(kvm_exit_x86);static __init int kvm_init (void ) { -static struct page *bad_page;int r; r =kvm_mmu_module_init ();
@@ -3530,16 +3535,13 @@ static __init int kvm_init(void)kvm_arch_init (); - bad_page =alloc_page (GFP_KERNEL ); + bad_page =alloc_page (GFP_KERNEL | __GFP_ZERO);if (bad_page ==NULL ) { r = -ENOMEM ; goto out; } - bad_page_address =page_to_pfn (bad_page) <<PAGE_SHIFT ; -memset (__va (bad_page_address),0 ,PAGE_SIZE ); -return 0 ; out:
@@ -3552,7 +3554,7 @@ out4: static __exit void kvm_exit(void) {kvm_exit_debug (); -__free_page (pfn_to_page (bad_page_address >>PAGE_SHIFT )); +__free_page (bad_page);kvm_mmu_module_exit (); }
drivers/kvm/mmu.c +5 -11
@@ -850,23 +850,17 @@ static void page_header_update_slot(struct kvm *kvm, void *pte, gpa_t gpa)__set_bit (slot, &page_head->slot_bitmap); } -hpa_t safe_gpa_to_hpa (struct kvm *kvm,gpa_t gpa) -{ -hpa_t hpa =gpa_to_hpa (kvm, gpa); - -return is_error_hpa (hpa) ? bad_page_address | (gpa & ~PAGE_MASK ): hpa; -} -hpa_t gpa_to_hpa (struct kvm *kvm,gpa_t gpa) {struct page *page; +hpa_t hpa;ASSERT ((gpa &HPA_ERR_MASK ) ==0 ); page =gfn_to_page (kvm, gpa >>PAGE_SHIFT ); -if (!page) -return gpa |HPA_ERR_MASK ; -return ((hpa_t )page_to_pfn (page) <<PAGE_SHIFT ) - | (gpa & (PAGE_SIZE -1 )); + hpa = ((hpa_t )page_to_pfn (page) <<PAGE_SHIFT ) | (gpa & (PAGE_SIZE -1 )); +if (is_error_page (page)) +return hpa |HPA_ERR_MASK ; +return hpa; }hpa_t gva_to_hpa (struct kvm_vcpu *vcpu,gva_t gva)
drivers/kvm/paging_tmpl.h +3 -8
@@ -92,8 +92,6 @@ static int FNAME(walk_addr)(struct guest_walker *walker, struct kvm_vcpu *vcpu, gva_t addr, int write_fault, int user_fault, int fetch_fault) { - hpa_t hpa; -struct kvm_memory_slot *slot; pt_element_t *ptep;pt_element_t root;gfn_t table_gfn;
@@ -118,9 +116,8 @@ static int FNAME(walk_addr)(struct guest_walker *walker, walker->table_gfn[walker->level -1 ] = table_gfn;pgprintk ("%s: table_gfn[%d] %lx\n" , __FUNCTION__, walker->level -1 , table_gfn); - slot =gfn_to_memslot (vcpu->kvm, table_gfn); - hpa =safe_gpa_to_hpa (vcpu->kvm, root &PT64_BASE_ADDR_MASK ); - walker->page =pfn_to_page (hpa >>PAGE_SHIFT ); + walker->page =gfn_to_page (vcpu->kvm, (root &PT64_BASE_ADDR_MASK ) + >>PAGE_SHIFT ); walker->table =kmap_atomic (walker->page,KM_USER0 ); ASSERT((!is_long_mode(vcpu) && is_pae(vcpu)) ||
@@ -130,7 +127,6 @@ static int FNAME(walk_addr)(struct guest_walker *walker,for (;;) {int index =PT_INDEX (addr, walker->level); -hpa_t paddr; ptep = &walker->table[index]; walker->index = index;
@@ -179,8 +175,7 @@ static int FNAME(walk_addr)(struct guest_walker *walker, walker->inherited_ar &= walker->table[index]; table_gfn = (*ptep &PT_BASE_ADDR_MASK ) >>PAGE_SHIFT ;kunmap_atomic (walker->table,KM_USER0 ); - paddr =safe_gpa_to_hpa (vcpu->kvm, table_gfn <<PAGE_SHIFT ); - walker->page =pfn_to_page (paddr >>PAGE_SHIFT ); + walker->page =gfn_to_page (vcpu->kvm, table_gfn); walker->table =kmap_atomic (walker->page,KM_USER0 ); --walker->level; walker->table_gfn[walker->level -1 ] = table_gfn;
Signature · 1 line
1.5.2.4
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop. Now Search log events and configuration files using AJAX and a browser. Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
kvm-devel mailing list [email protected]
https://lists.sourceforge.net/lists/listinfo/kvm-devel