[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] 15142:78389dbb08bb and domain state
Yeah, that's a nasty one. I committed an alternative fix, which I think is clearer, as c/s 16401. Please give it a spin. I'll also queue it for 3.1.3. -- Keir On 19/11/07 10:19, "John Levon" <levon@xxxxxxxxxxxxxxxxx> wrote: > On Fri, Nov 16, 2007 at 12:01:38AM +0000, Keir Fraser wrote: > >> Reference counting for l4 pagetable entries happens in >> get_page_from_l4e(), > > The circular reference was a red herring - I was looking at Xen's own > mapping in its private PTEs (d'oh). > > However, I did notice that we leak a ref count per VCPU, which gave me a > big clue. Changeset 13302:7c5eea5feebd from Jan added this code: > > +#ifdef __x86_64__ > + if ( pfn == pagetable_get_pfn(v->arch.guest_table_user) ) > + v->arch.guest_table_user = pagetable_null(); > +#endif > > Presumably for the benefit of compat guests where this is always true. > > However, it can be true on native Solaris guests too - when we switch > to the kernel L4 we also load it into _USER_BASEPTR. > > The patch below fixes it for me (though I'm not positive it's correct). > Assuming this or something like it is the right thing, that will still > leave the 'xm list' problem, which I see with both Solaris and Linux > domU's. Still looking at that. > > cheers, > john > > # HG changeset patch > # User john.levon@xxxxxxx > # Date 1195467196 28800 > # Node ID b972585a05838dc3a622438299572423a7a8de8d > # Parent 00c6696dcc8b17cd9ea2325f260899e489e262e0 > Fix VCPU pagetable cleanup > > Solaris can have the same PT in guest_table and guest_table_user without > it being a compat domain. Be more careful when cleaning up. > > Signed-off-by: John Levon <john.levon@xxxxxxx> > > diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c > --- a/xen/arch/x86/domain.c > +++ b/xen/arch/x86/domain.c > @@ -1625,7 +1625,8 @@ static void vcpu_destroy_pagetables(stru > else > put_page_and_type(mfn_to_page(pfn)); > #ifdef __x86_64__ > - if ( pfn == pagetable_get_pfn(v->arch.guest_table_user) ) > + if ( is_pv_32on64_vcpu(v) && > + pfn == pagetable_get_pfn(v->arch.guest_table_user) ) > v->arch.guest_table_user = pagetable_null(); > #endif > v->arch.guest_table = pagetable_null(); _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |