On Mon, Sep 22, 2008 at 11:30:51PM +0300, Avi Kivity wrote:
> Marcelo Tosatti wrote:
>> On Fri, Sep 19, 2008 at 05:56:46PM -0700, Avi Kivity wrote:
>>   
>>>> +  } while (level > start_level-1);
>>>> +}
>>>> +
>>>>       
>>> Could be much simplified with recursion, no?  As the depth is limited 
>>> to  4, there's no stack overflow problem.
>>>     
>>
>> The early version was recursive, but since its a generic helper I
>> preferred a non-recursive function.
>>   
>
> Let's start with a super-simple recursive version. When the code has  
> seen some debugging, we can add complexity. But for the initial phase,  
> simpler is better.
>
> The non-recursive version has the advantage that it can be converted to  
> a kvm_for_each_parent() later, but still, we can do that later.

OK, this is the earlier version. I'll resend the patchset with it
instead, anything else? (hoping you're ok with 32-bit nonpae being done
as optimization later).

Index: kvm.oos2/arch/x86/kvm/mmu.c
===================================================================
--- kvm.oos2.orig/arch/x86/kvm/mmu.c
+++ kvm.oos2/arch/x86/kvm/mmu.c
@@ -922,6 +922,31 @@ static void mmu_page_remove_parent_pte(s
        BUG();
 }
 
+static int mmu_parent_walk(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp,
+                          int (*fn) (struct kvm_vcpu *vcpu,
+                                     struct kvm_mmu_page *sp))
+{
+       struct kvm_pte_chain *pte_chain;
+       struct hlist_node *node;
+       struct kvm_mmu_page *parent_sp;
+       int i;
+
+       fn(vcpu, sp);
+
+       if (!sp->multimapped && sp->parent_pte) {
+               parent_sp = page_header(__pa(sp->parent_pte));
+               mmu_parent_walk(vcpu, parent_sp, fn);
+               return;
+       }
+       hlist_for_each_entry(pte_chain, node, &sp->parent_ptes, link)
+               for (i = 0; i < NR_PTE_CHAIN_ENTRIES; ++i) {
+                       if (!pte_chain->parent_ptes[i])
+                               break;
+                       parent_sp = 
page_header(__pa(pte_chain->parent_ptes[i]));
+                       mmu_parent_walk(vcpu, parent_sp, fn);
+               }
+}
+
 static void nonpaging_prefetch_page(struct kvm_vcpu *vcpu,
                                    struct kvm_mmu_page *sp)
 {
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to