[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH RFC 06/12] xen/x86: populate PVHv2 Dom0 physical memory map
On 02/08/16 10:19, Roger Pau Monne wrote: > On Fri, Jul 29, 2016 at 08:04:12PM +0100, Andrew Cooper wrote: >> On 29/07/16 17:29, Roger Pau Monne wrote: >>> Craft the Dom0 e820 memory map and populate it. >>> >>> Signed-off-by: Roger Pau Monné <roger.pau@xxxxxxxxxx> >>> --- >>> Cc: Jan Beulich <jbeulich@xxxxxxxx> >>> Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> >>> --- >>> xen/arch/x86/domain_build.c | 199 >>> ++++++++++++++++++++++++++++++++++++++++++-- >>> 1 file changed, 193 insertions(+), 6 deletions(-) >>> >>> diff --git a/xen/arch/x86/domain_build.c b/xen/arch/x86/domain_build.c >>> index c0ef40f..cb8ecbd 100644 >>> --- a/xen/arch/x86/domain_build.c >>> +++ b/xen/arch/x86/domain_build.c >>> @@ -43,6 +43,11 @@ static long __initdata dom0_nrpages; >>> static long __initdata dom0_min_nrpages; >>> static long __initdata dom0_max_nrpages = LONG_MAX; >>> >>> +/* GFN of the identity map for EPT. */ >>> +#define HVM_IDENT_PT_GFN 0xfeffeu >> The IDENT_PT is only needed on Gen1 VT-x hardware which doesn't support >> unrestricted-guest mode. OTOH, it needs to be matched with VM86_TSS, >> which is also needed if hardware doesn't support unrestricted-guest. >> Also, the IDENT_PT can live anywhere in GFN space. 0xfeffe is just >> convention for HVM guests as nothing else interesting lives there, but a >> PVH dom0 will want to ensure it doesn't alias anything interesting it >> might wish to map. >> >> Now I look at it, there is substantial WTF. The domain builder makes >> IDENT_PT, but HVMLoader makes VM86_TSS. I presume this is a historical >> side effect of IDENT_PT being a prerequisite to even executing >> hvmloader, while VM86_TSS was only a prerequisite to executing the >> rombios payload. Either way, eww :( >> >> I think the VM86_TSS setup needs to move to unconditionally being beside >> IDENT_PT setup in the domain builder, and mirrored here in dom0_hvm() >> creation. I don't think it is reasonable to expect an HVMLite payload >> to set up its own VM86_TSS if it didn't set up IDENT_PT. (OTOH, the >> chances of an HVMLite guest ever needing to return to real mode is slim, >> but in the name of flexibility, it would be nice not to rule it out). >> >> Longterm, it would be nice to disentangle the unrestricted-guest support >> from the main vmx code, and make it able to be compiled out. There is >> lots of it, and it all-but-dead on modern hardware. > Thanks! I didn't know anything about the VM86 TSS stuff, the fact that the > identity page tables and the VM86 TSS are set at completely different points > makes it quite hard to follow :/. > > I've now moved the setup of the VM86 TSS inside the domain builder for both > DomU and Dom0. Thanks. (Guess who has recently had to delve back into this code^W swamp.) > >>> +} >>> + >>> +/* Calculate the biggest usable order given a size in bytes. */ >>> +static inline unsigned int get_order(uint64_t size) >>> +{ >>> + unsigned int order; >>> + uint64_t pg; >>> + >>> + ASSERT((size & ~PAGE_MASK) == 0); >>> + pg = PFN_DOWN(size); >>> + for ( order = 0; pg >= (1 << (order + 1)); order++ ); >>> + >>> + return order; >>> +} >> We already have get_order_from_bytes() and get_order_from_pages(), the >> latter of which looks like it will suit your usecase. > Not really, or at least they don't do the same as get_order. This function > calculates the maximum order you can use so that there are no pages left > over, (ie: if you have a size of 3145728bytes (3MiB), this function will > return order 9 (2MiB), while the other ones will return order 10 (4MiB)). I > don't really understand while other places in code request bigger orders and > then free the leftovers, isn't this also causing memory shattering? Sounds like we want something like get_order_{floor,ceil}() which makes it obvious which way non-power-of-two get rounded. > >> As a TODO item, I really would like to borrow some of the Linux >> infrastructure to calculate orders of constants at compile time, because >> a large number of callers of the existing get_order_*() functions are >> performing unnecessary runtime calculation. For those which need >> runtime calculation, some careful use of ffs() would be preferable to a >> loop. >> >>> + >>> +/* Populate an HVM memory range using the biggest possible order. */ >>> +static void __init hvm_populate_memory_range(struct domain *d, uint64_t >>> start, >>> + uint64_t size) >>> +{ >>> + static unsigned int __initdata memflags = MEMF_no_dma|MEMF_exact_node; >>> + unsigned int order; >>> + struct page_info *page; >>> + int rc; >>> + >>> + ASSERT((size & ~PAGE_MASK) == 0 && (start & ~PAGE_MASK) == 0); >>> + >>> + order = MAX_ORDER; >>> + while ( size != 0 ) >>> + { >>> + order = min(get_order(size), order); >>> + page = alloc_domheap_pages(d, order, memflags); >>> + if ( page == NULL ) >>> + { >>> + if ( order == 0 && memflags ) >>> + { >>> + /* Try again without any memflags. */ >>> + memflags = 0; >>> + order = MAX_ORDER; >>> + continue; >>> + } >>> + if ( order == 0 ) >>> + panic("Unable to allocate memory with order 0!\n"); >>> + order--; >>> + continue; >>> + } >> It would be far more efficient to try and allocate only 1G and 2M >> blocks. Most of memory is free at this point, and it would allow the >> use of HAP superpage mappings, which will be a massive performance boost >> if they aren't shattered. > That's what I'm trying to do, but we might have to use pages of lower order > when filling the smaller gaps. As a general principle, we should try not to have any gaps. This also extends to guests using more intelligence when deciding now to mutate its physmap. > As an example, this are the stats when > building a domain with 6048M of RAM: > > (XEN) Memory allocation stats: > (XEN) Order 18: 5GB > (XEN) Order 17: 512MB > (XEN) Order 15: 256MB > (XEN) Order 14: 128MB > (XEN) Order 12: 16MB > (XEN) Order 10: 8MB > (XEN) Order 9: 4MB > (XEN) Order 8: 2MB > (XEN) Order 7: 1MB > (XEN) Order 6: 512KB > (XEN) Order 5: 256KB > (XEN) Order 4: 128KB > (XEN) Order 3: 64KB > (XEN) Order 2: 32KB > (XEN) Order 1: 16KB > (XEN) Order 0: 4KB > > IMHO, they are quite good. What are the RAM characteristics of the host? Do you have any idea what the hap superpage characteristics are like after the guest has booted? In a case like this, I think it would be entirely reasonable to round up to the nearest 2MB, and avoid all of those small page mappings. ~Andrew _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |