(resend) Swapping
PATCH 3/4 (resend) Swapping
ok, i change some things as Anthony noted me, but the most important thing is that i changed here:
is setting the dirty bit after using the page (i forgat to do it before)
Quoted 1 line
From
9088fb6a35517bdafe7a7066f60fab56f98c9127Mon Sep 17 00:00:00 2001
From: Izik Eidus <izike-atKUWr5tajBWk0Htik3J/[email protected]>
Date: Sun, 14 Oct 2007 01:12:05 +0200
Subject: [PATCH] make the guest non shadowed memory swappable
--- drivers/kvm/kvm.h | 2 + drivers/kvm/kvm_main.c | 81 +++++++++++++++++++++++++-------------------- drivers/kvm/mmu.c | 23 ++++++++++++- drivers/kvm/paging_tmpl.h | 27 +++++++++++++-- 4 files changed, 93 insertions(+), 40 deletions(-)
drivers/kvm/kvm.h +2 -0
@@ -409,6 +409,7 @@ struct kvm_memory_slot {unsigned long *rmap;unsigned long *dirty_bitmap;int user_alloc;/* user allocated memory */ +unsigned long userspace_addr; };struct kvm {
@@ -570,6 +571,7 @@ 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); +void kvm_release_page (struct page *page);int kvm_read_guest_page (struct kvm *kvm,gfn_t gfn,void *data,int offset,int len);int kvm_read_guest (struct kvm *kvm,gpa_t gpa,void *data,unsigned long len);
drivers/kvm/kvm_main.c +45 -36
161 lines not on this page · raw message
drivers/kvm/mmu.c +22 -1
@@ -425,6 +425,8 @@ static void rmap_remove(struct kvm *kvm, u64 *spte)if (!is_rmap_pte (*spte))return ; page =page_header (__pa (spte)); +kvm_release_page (pfn_to_page ((*spte &PT64_BASE_ADDR_MASK ) >> +PAGE_SHIFT )); rmapp =gfn_to_rmap (kvm, page->gfns[spte - page->spt]);if (!*rmapp) {printk (KERN_ERR "rmap_remove: %p %llx 0->BUG\n" , spte, *spte);
@@ -907,6 +909,13 @@ static int nonpaging_map(struct kvm_vcpu *vcpu, gva_t v, hpa_t p) table[index] = p |PT_PRESENT_MASK |PT_WRITABLE_MASK |PT_USER_MASK ;rmap_add (vcpu, &table[index], v >>PAGE_SHIFT ); +if (!is_rmap_pte (table[index])) { +struct page *page; + + page =pfn_to_page ((v &PT64_BASE_ADDR_MASK ) + >>PAGE_SHIFT ); +kvm_release_page (page); + }return 0 ; }
@@ -920,7 +929,12 @@ static int nonpaging_map(struct kvm_vcpu *vcpu, gva_t v, hpa_t p) v, level -1 , 1, 3, &table[index]);if (!new_table) { +struct page *page; +pgprintk ("nonpaging_map: ENOMEM\n" ); + page =pfn_to_page ((v &PT64_BASE_ADDR_MASK ) + >>PAGE_SHIFT ); +kvm_release_page (page);return -ENOMEM ; }
@@ -1035,8 +1049,11 @@ static int nonpaging_page_fault(struct kvm_vcpu *vcpu, gva_t gva, paddr =gpa_to_hpa (vcpu->kvm, addr &PT64_BASE_ADDR_MASK ); -if (is_error_hpa (paddr)) +if (is_error_hpa (paddr)) { +kvm_release_page (pfn_to_page ((paddr &PT64_BASE_ADDR_MASK ) + >>PAGE_SHIFT ));return 1 ; + }return nonpaging_map (vcpu, addr &PAGE_MASK , paddr); }
@@ -1503,6 +1520,7 @@ static void audit_mappings_page(struct kvm_vcpu *vcpu, u64 page_pte, }else {gpa_t gpa = vcpu->mmu.gva_to_gpa (vcpu, va);hpa_t hpa =gpa_to_hpa (vcpu, gpa); +struct page *page;if (is_shadow_present_pte (ent) && (ent &PT64_BASE_ADDR_MASK ) != hpa)
@@ -1515,6 +1533,9 @@ static void audit_mappings_page(struct kvm_vcpu *vcpu, u64 page_pte, && !is_error_hpa(hpa))printk (KERN_ERR "audit: (%s) notrap shadow," " valid guest gva %lx\n" , audit_msg, va); + page =pfn_to_page ((paddr &PT64_BASE_ADDR_MASK ) + >>PAGE_SHIFT ); +kvm_release_page (page); } }
drivers/kvm/paging_tmpl.h +24 -3
@@ -175,6 +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 ); +kvm_release_page (walker->page); walker->page =gfn_to_page (vcpu->kvm, table_gfn); walker->table =kmap_atomic (walker->page,KM_USER0 ); --walker->level;
@@ -183,8 +184,10 @@ static int FNAME(walk_addr)(struct guest_walker *walker, walker->level - 1, table_gfn); } walker->pte = *ptep; -if (walker->page) +if (walker->page) { walker->ptep =NULL ; +kvm_release_page (walker->page); + }if (walker->table)kunmap_atomic (walker->table,KM_USER0 );pgprintk ("%s: pte %llx\n" , __FUNCTION__, (u64)*ptep);
@@ -206,6 +209,8 @@ err: walker->error_code |=PFERR_FETCH_MASK ;if (walker->table)kunmap_atomic (walker->table,KM_USER0 ); +if (walker->page) +kvm_release_page (walker->page);return 0 ; }
@@ -249,6 +254,8 @@ static void FNAME(set_pte_common)(struct kvm_vcpu *vcpu,if (is_error_hpa (paddr)) {set_shadow_pte (shadow_pte, shadow_trap_nonpresent_pte |PT_SHADOW_IO_MARK ); +kvm_release_page (pfn_to_page ((paddr &PT64_BASE_ADDR_MASK ) + >>PAGE_SHIFT ));return ; }
@@ -286,9 +293,20 @@ unshadowed:pgprintk ("%s: setting spte %llx\n" , __FUNCTION__, spte);set_shadow_pte (shadow_pte, spte);page_header_update_slot (vcpu->kvm, shadow_pte, gaddr); -if (!was_rmapped) +if (!was_rmapped) {rmap_add (vcpu, shadow_pte, (gaddr &PT64_BASE_ADDR_MASK ) >>PAGE_SHIFT ); +if (!is_rmap_pte (*shadow_pte)) { +struct page *page; + + page =pfn_to_page ((paddr &PT64_BASE_ADDR_MASK ) + >>PAGE_SHIFT ); +kvm_release_page (page); + } + } +else +kvm_release_page (pfn_to_page ((paddr &PT64_BASE_ADDR_MASK ) + >>PAGE_SHIFT ));if (!ptwrite || !*ptwrite) vcpu->last_pte_updated = shadow_pte; }
@@ -512,19 +530,22 @@ static void FNAME(prefetch_page)(struct kvm_vcpu *vcpu, {int i;pt_element_t *gpt; +struct page *page;if (sp->role.metaphysical ||PTTYPE ==32 ) {nonpaging_prefetch_page (vcpu, sp);return ; } - gpt =kmap_atomic (gfn_to_page (vcpu->kvm, sp->gfn),KM_USER0 ); + page =gfn_to_page (vcpu->kvm, sp->gfn); + gpt =kmap_atomic (page,KM_USER0 );for (i =0 ; i <PT64_ENT_PER_PAGE ; ++i)if (is_present_pte (gpt[i])) sp->spt[i] = shadow_trap_nonpresent_pte;else sp->spt[i] = shadow_notrap_nonpresent_pte;kunmap_atomic (gpt,KM_USER0 ); +kvm_release_page (page); }#undef pt_element_t
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