Commit 7a8f1a74 authored by Xiao Guangrong's avatar Xiao Guangrong Committed by Avi Kivity

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: default avatarXiao Guangrong <xiaoguangrong@cn.fujitsu.com>
Signed-off-by: default avatarMarcelo Tosatti <mtosatti@redhat.com>
parent ebdea638
...@@ -1149,10 +1149,12 @@ static int __mmu_unsync_walk(struct kvm_mmu_page *sp, ...@@ -1149,10 +1149,12 @@ static int __mmu_unsync_walk(struct kvm_mmu_page *sp,
int i, ret, nr_unsync_leaf = 0; int i, ret, nr_unsync_leaf = 0;
for_each_unsync_children(sp->unsync_child_bitmap, i) { for_each_unsync_children(sp->unsync_child_bitmap, i) {
struct kvm_mmu_page *child;
u64 ent = sp->spt[i]; u64 ent = sp->spt[i];
if (is_shadow_present_pte(ent) && !is_large_pte(ent)) { if (!is_shadow_present_pte(ent) || is_large_pte(ent))
struct kvm_mmu_page *child; goto clear_child_bitmap;
child = page_header(ent & PT64_BASE_ADDR_MASK); child = page_header(ent & PT64_BASE_ADDR_MASK);
if (child->unsync_children) { if (child->unsync_children) {
...@@ -1160,22 +1162,25 @@ static int __mmu_unsync_walk(struct kvm_mmu_page *sp, ...@@ -1160,22 +1162,25 @@ static int __mmu_unsync_walk(struct kvm_mmu_page *sp,
return -ENOSPC; return -ENOSPC;
ret = __mmu_unsync_walk(child, pvec); ret = __mmu_unsync_walk(child, pvec);
if (!ret) { if (!ret)
__clear_bit(i, sp->unsync_child_bitmap); goto clear_child_bitmap;
sp->unsync_children--; else if (ret > 0)
WARN_ON((int)sp->unsync_children < 0);
} else if (ret > 0)
nr_unsync_leaf += ret; nr_unsync_leaf += ret;
else else
return ret; return ret;
} } else if (child->unsync) {
if (child->unsync) {
nr_unsync_leaf++; nr_unsync_leaf++;
if (mmu_pages_add(pvec, child, i)) if (mmu_pages_add(pvec, child, i))
return -ENOSPC; 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);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment