Re: [PATCH 1/5] KVM: MMU: introduce some macros to cleanup hlisttraverseing

From: Avi Kivity
Date: Mon May 31 2010 - 07:14:57 EST


On 05/31/2010 05:00 AM, Xiao Guangrong wrote:

+
+#define for_each_gfn_indirect_sp(kvm, sp, gfn, pos, n) \
+ hlist_for_each_entry_safe(sp, pos, n, \
+&kvm->arch.mmu_page_hash[kvm_page_table_hashfn(gfn)], hash_link)\
+ if (sp->gfn == gfn&& !sp->role.direct)
+
+#define for_each_gfn_indirect_valid_sp(kvm, sp, gfn, pos, n) \
+ hlist_for_each_entry_safe(sp, pos, n, \
+&kvm->arch.mmu_page_hash[kvm_page_table_hashfn(gfn)], hash_link)\
+ if (sp->gfn == gfn&& !sp->role.direct&& \
+ !sp->role.invalid)

Shouldn't we always skip invalid gfns?
Actually, in kvm_mmu_unprotect_page() function, it need find out
invalid shadow pages:

| hlist_for_each_entry_safe(sp, node, n, bucket, hash_link)
| if (sp->gfn == gfn&& !sp->role.direct) {
| pgprintk("%s: gfn %lx role %x\n", __func__, gfn,
| sp->role.word);
| r = 1;
| if (kvm_mmu_zap_page(kvm, sp))
| goto restart;
| }

I'm not sure whether we can skip invalid sp here, since it can change this
function's return value. :-(

Hm. Invalid pages don't need to be write protected. So I think you can patch unprotect_page() to ignore invalid pages, and then you can convert it to the new macros which ignore invalid pages as well.

The invariant is: if an sp exists with !role.invalid and !unsync, then the page must be write protected.


What about providing both gfn and role to the macro?

In current code, no code simply use role and gfn to find sp,
in kvm_mmu_get_page(), we need do other work for
'sp->gfn == gfn&& sp->role != role' sp, and other functions only need compare
some members in role, but not all members.

How about just gfn? I think everything compares against that!

--
I have a truly marvellous patch that fixes the bug which this
signature is too narrow to contain.

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/