Swapping
PATCH 1/4 Swapping
this make the rmap keep reverse mapping on all the present shadow pages
Quoted 1 line
From
3b5821a55836f82f987b878982cbc6fc8336371fMon Sep 17 00:00:00 2001
From: Izik Eidus <izik@Home1.(none)>
Date: Sat, 13 Oct 2007 01:47:44 +0200
Subject: [PATCH] modify the rmap so it will hold reverse mapping to all present shadow pages
--- drivers/kvm/mmu.c | 52 ++++++++++++++++++++++++++++++++++++---------------- 1 files changed, 36 insertions(+), 16 deletions(-)
drivers/kvm/mmu.c +36 -16
@@ -211,8 +211,8 @@ static int is_io_pte(unsigned long pte)static int is_rmap_pte (u64 pte) { -return (pte & (PT_WRITABLE_MASK |PT_PRESENT_MASK )) - == (PT_WRITABLE_MASK |PT_PRESENT_MASK ); +return pte != shadow_trap_nonpresent_pte + && pte != shadow_notrap_nonpresent_pte; }static void set_shadow_pte (u64 *sptep,u64 spte)
@@ -456,29 +456,51 @@ static void rmap_remove(struct kvm *kvm, u64 *spte) } } -static void rmap_write_protect (struct kvm *kvm,u64 gfn) +static u64 *rmap_next (struct kvm *kvm,unsigned long *rmapp,u64 *spte) {struct kvm_rmap_desc *desc; +struct kvm_rmap_desc *prev_desc; +u64 *prev_spte; +int i; + +if (!*rmapp) +return NULL ; +else if (!(*rmapp &1 )) { +if (!spte) +return (u64 *)*rmapp; +return NULL ; + } + desc = (struct kvm_rmap_desc *)(*rmapp & ~1ul ); + prev_desc =NULL ; + prev_spte =NULL ; +while (desc) { +for (i =0 ; i <RMAP_EXT && desc->shadow_ptes[i]; ++i) { +if (prev_spte == spte) +return desc->shadow_ptes[i]; + prev_spte = desc->shadow_ptes[i]; + } + desc = desc->more; + } +return NULL ; +} + +static void rmap_write_protect (struct kvm *kvm,u64 gfn) +{unsigned long *rmapp;u64 *spte; gfn =unalias_gfn (kvm, gfn); rmapp =gfn_to_rmap (kvm, gfn); -while (*rmapp) { -if (!(*rmapp &1 )) - spte = (u64 *)*rmapp; -else { - desc = (struct kvm_rmap_desc *)(*rmapp & ~1ul ); - spte = desc->shadow_ptes[0 ]; - } + spte =rmap_next (kvm, rmapp,NULL ); +while (spte) {BUG_ON (!spte);BUG_ON (!(*spte &PT_PRESENT_MASK )); -BUG_ON (!(*spte &PT_WRITABLE_MASK ));rmap_printk ("rmap_write_protect: spte %p %llx\n" , spte, *spte); -rmap_remove (kvm, spte); -set_shadow_pte (spte, *spte & ~PT_WRITABLE_MASK ); +if (is_writeble_pte (*spte)) +set_shadow_pte (spte, *spte & ~PT_WRITABLE_MASK );kvm_flush_remote_tlbs (kvm); + spte =rmap_next (kvm, rmapp, spte); } }
@@ -1399,10 +1421,8 @@ void kvm_mmu_slot_remove_write_access(struct kvm *kvm, int slot) pt = page->spt;for (i =0 ; i <PT64_ENT_PER_PAGE ; ++i)/* avoid RMW */ -if (pt[i] &PT_WRITABLE_MASK ) { -rmap_remove (kvm, &pt[i]); +if (pt[i] &PT_WRITABLE_MASK ) pt[i] &= ~PT_WRITABLE_MASK ; - } } }
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