|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2 1/2] x86/mm: factor out the code for shattering an l3 PTE
On Tue, 2019-12-10 at 16:20 +0100, Jan Beulich wrote:
> On 09.12.2019 12:48, Hongyan Xia wrote:
> > --- a/xen/arch/x86/mm.c
> > +++ b/xen/arch/x86/mm.c
> > @@ -5151,6 +5151,51 @@ l1_pgentry_t *virt_to_xen_l1e(unsigned long
> > v)
> > flush_area_local((const void *)v, f) : \
> > flush_area_all((const void *)v, f))
> >
> > +/* Shatter an l3 entry and populate l2. If virt is passed in, also
> > do flush. */
> > +static int shatter_l3e(l3_pgentry_t *pl3e, unsigned long virt,
> > bool locking)
> > +{
> > + unsigned int i;
> > + l3_pgentry_t ol3e;
> > + l2_pgentry_t ol2e, *l2t = alloc_xen_pagetable();
> > +
> > + if ( l2t == NULL )
>
> Nowadays we seem to prefer !l2t in cases like this one.
>
> > + return -1;
>
> -ENOMEM please (and then handed on by the caller).
>
> > + ol3e = *pl3e;
>
> This could be the variable's initializer.
>
> > + ol2e = l2e_from_intpte(l3e_get_intpte(ol3e));
>
> There's nothing "old" about this L2 entry, so its name would better
> be just "l2e" I think.
>
> > + for ( i = 0; i < L2_PAGETABLE_ENTRIES; i++ )
> > + {
> > + l2e_write(l2t + i, ol2e);
> > + ol2e = l2e_from_intpte(
> > + l2e_get_intpte(ol2e) + (1 << (PAGETABLE_ORDER +
> > PAGE_SHIFT)));
>
> Indentation looks odd here (also further down). If the first argument
> of a function call doesn't fit on the line and would also be ugly to
> split across lines, what we do is indent it the usual 4 characters
> from the function invocation, i.e. in this case
>
> ol2e = l2e_from_intpte(
> l2e_get_intpte(ol2e) + (1 << (PAGETABLE_ORDER +
> PAGE_SHIFT)));
>
> and then slightly shorter
>
> ol2e = l2e_from_intpte(
> l2e_get_intpte(ol2e) + (PAGE_SIZE <<
> PAGETABLE_ORDER));
>
> Of course, as mentioned before, I'm not overly happy to see type
> safety lost in case like this one, where it's not needed like e.g.
> further up to convert from L3 to L2 entry.
>
> > + }
> > + if ( locking )
> > + spin_lock(&map_pgdir_lock);
> > + if ( (l3e_get_flags(*pl3e) & _PAGE_PRESENT) &&
> > + (l3e_get_flags(*pl3e) & _PAGE_PSE) )
> > + {
> > + l3e_write_atomic(pl3e,
> > + l3e_from_paddr((paddr_t)virt_to_maddr(l2t),
> > __PAGE_HYPERVISOR));
> > + l2t = NULL;
> > + }
> > + if ( locking )
> > + spin_unlock(&map_pgdir_lock);
> > + if ( virt )
> > + {
> > + unsigned int flush_flags =
> > + FLUSH_TLB | FLUSH_ORDER(2 * PAGETABLE_ORDER);
> > +
> > + if ( (l3e_get_flags(ol3e) & _PAGE_GLOBAL) )
>
> Unnecessary pair of parentheses (which also wasn't there in the
> original code).
>
> > + flush_flags |= FLUSH_TLB_GLOBAL;
>
> Too deep indentation.
>
> > + flush_area(virt, flush_flags);
> > + }
> > + if ( l2t )
> > + free_xen_pagetable(l2t);
> > +
> > + return 0;
> > +}
>
> Also please add blank lines between
> - L2 population and lock acquire,
> - lock release and TLB flush,
> - TLB flush and free.
>
> Jan
Issues fixed in v3. I have not touched the type safety part. If we
think this is really important we can revert to what it was before,
although from the quick study I did in my previous email, there is a
performance difference.
Hongyan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |