lkml.org 
[lkml]   [2010]   [Jul]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: [PATCH v5 2/9] KVM: MMU: fix race between 'walk_addr' and 'fetch'
On 07/06/2010 01:45 PM, Xiao Guangrong wrote:
> 'walk_addr' is out of mmu_lock's protection, so while we handle 'fetch',
> then guest's mapping has modifited by other vcpu's write path, such as
> invlpg, pte_write and other fetch path
>
> Fixed by checking all level's mapping
>
>
> @@ -319,22 +319,23 @@ static u64 *FNAME(fetch)(struct kvm_vcpu *vcpu, gva_t addr,
> direct_access&= ~ACC_WRITE_MASK;
>
> for_each_shadow_entry(vcpu, addr, iterator) {
> + bool nonpresent = false, last_mapping = false;
> +
>

I don't like these two new variables, but no suggestion at the moment.
I'll try to simplify this loop later.

One idea may be:

while (level > walker.level) {
handle indirect pages
}
while (level > hlevel) {
handle direct pages
}
handle last spte

I'm worried that this change is too big for backporting, but no
suggestions on how to make it smaller, so we'll have to accept it.

> - spte = __pa(sp->spt)
> - | PT_PRESENT_MASK | PT_ACCESSED_MASK
> - | PT_WRITABLE_MASK | PT_USER_MASK;
> - *sptep = spte;
> + if (nonpresent) {
> + spte = __pa(sp->spt)
> + | PT_PRESENT_MASK | PT_ACCESSED_MASK
> + | PT_WRITABLE_MASK | PT_USER_MASK;
> + *sptep = spte;
> + continue;
> + }
>

Should be __set_spte(), but this already exists, so can be in a later patch.

--
error compiling committee.c: too many arguments to function



\
 
 \ /
  Last update: 2010-07-11 14:55    [W:0.433 / U:0.384 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site