forked from Minki/linux
KVM: MMU: clear unsync_child_bitmap completely
In current code, some page's unsync_child_bitmap is not cleared completely in mmu_sync_children(), for example, if two PDPEs shard one PDT, one of PDPE's unsync_child_bitmap is not cleared. Currently, it not harm anything just little overload, but it's the prepare work for the later patch Signed-off-by: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
This commit is contained in:
parent
ebdea638df
commit
7a8f1a74e4
@ -1149,33 +1149,38 @@ static int __mmu_unsync_walk(struct kvm_mmu_page *sp,
|
||||
int i, ret, nr_unsync_leaf = 0;
|
||||
|
||||
for_each_unsync_children(sp->unsync_child_bitmap, i) {
|
||||
struct kvm_mmu_page *child;
|
||||
u64 ent = sp->spt[i];
|
||||
|
||||
if (is_shadow_present_pte(ent) && !is_large_pte(ent)) {
|
||||
struct kvm_mmu_page *child;
|
||||
child = page_header(ent & PT64_BASE_ADDR_MASK);
|
||||
if (!is_shadow_present_pte(ent) || is_large_pte(ent))
|
||||
goto clear_child_bitmap;
|
||||
|
||||
if (child->unsync_children) {
|
||||
if (mmu_pages_add(pvec, child, i))
|
||||
return -ENOSPC;
|
||||
child = page_header(ent & PT64_BASE_ADDR_MASK);
|
||||
|
||||
ret = __mmu_unsync_walk(child, pvec);
|
||||
if (!ret) {
|
||||
__clear_bit(i, sp->unsync_child_bitmap);
|
||||
sp->unsync_children--;
|
||||
WARN_ON((int)sp->unsync_children < 0);
|
||||
} else if (ret > 0)
|
||||
nr_unsync_leaf += ret;
|
||||
else
|
||||
return ret;
|
||||
}
|
||||
if (child->unsync_children) {
|
||||
if (mmu_pages_add(pvec, child, i))
|
||||
return -ENOSPC;
|
||||
|
||||
if (child->unsync) {
|
||||
nr_unsync_leaf++;
|
||||
if (mmu_pages_add(pvec, child, i))
|
||||
return -ENOSPC;
|
||||
}
|
||||
}
|
||||
ret = __mmu_unsync_walk(child, pvec);
|
||||
if (!ret)
|
||||
goto clear_child_bitmap;
|
||||
else if (ret > 0)
|
||||
nr_unsync_leaf += ret;
|
||||
else
|
||||
return ret;
|
||||
} else if (child->unsync) {
|
||||
nr_unsync_leaf++;
|
||||
if (mmu_pages_add(pvec, child, i))
|
||||
return -ENOSPC;
|
||||
} else
|
||||
goto clear_child_bitmap;
|
||||
|
||||
continue;
|
||||
|
||||
clear_child_bitmap:
|
||||
__clear_bit(i, sp->unsync_child_bitmap);
|
||||
sp->unsync_children--;
|
||||
WARN_ON((int)sp->unsync_children < 0);
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user