On 05/30/2010 03:36 PM, Xiao Guangrong wrote:
Introduce for_each_gfn_sp(), for_each_gfn_indirect_sp() and for_each_gfn_indirect_valid_sp() to cleanup hlist traverseing Signed-off-by: Xiao Guangrong<xiaoguangrong@xxxxxxxxxxxxxx> --- arch/x86/kvm/mmu.c | 129 ++++++++++++++++++++++------------------------------ 1 files changed, 54 insertions(+), 75 deletions(-) diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index 56f8c3c..84c705e 100644 --- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c @@ -1200,6 +1200,22 @@ static void kvm_unlink_unsync_page(struct kvm *kvm, struct kvm_mmu_page *sp) static int kvm_mmu_zap_page(struct kvm *kvm, struct kvm_mmu_page *sp); +#define for_each_gfn_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)
if (...) for_each_gfn_sp(...) blah(); else BUG(); will break. Can do 'if ((sp)->gfn != (gfn)) ; else'. Or call functions from the for (;;) parameters to advance the cursor. (also use parentheses to protect macro arguments)
+ +#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? What about providing both gfn and role to the macro?
-- error compiling committee.c: too many arguments to function -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html