[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 05/12] xen: introduce reserve_heap_pages
On 30.04.2020 18:21, Stefano Stabellini wrote: > On Thu, 30 Apr 2020, Jan Beulich wrote: >> On 30.04.2020 00:46, Stefano Stabellini wrote: >>> On Fri, 17 Apr 2020, Jan Beulich wrote: >>>> On 15.04.2020 03:02, Stefano Stabellini wrote: >>>>> Introduce a function named reserve_heap_pages (similar to >>>>> alloc_heap_pages) that allocates a requested memory range. Call >>>>> __alloc_heap_pages for the implementation. >>>>> >>>>> Change __alloc_heap_pages so that the original page doesn't get >>>>> modified, giving back unneeded memory top to bottom rather than bottom >>>>> to top. >>>> >>>> While it may be less of a problem within a zone, doing so is >>>> against our general "return high pages first" policy. >>> >>> Is this something you'd be OK with anyway? >> >> As a last resort, maybe. But it really depends on why it needs to be >> this way. >> >>> If not, do you have a suggestion on how to do it better? I couldn't find >>> a nice way to do it without code duplication, or a big nasty 'if' in the >>> middle of the function. >> >> I'd first need to understand the problem to solve. > > OK, I'll make an example. > > reserve_heap_pages wants to reserve the range 0x10000000 - 0x20000000. > > reserve_heap_pages get the struct page_info for 0x10000000 and calls > alloc_pages_from_buddy to allocate an order of 28. > > alloc_pages_from_buddy realizes that the free memory area starting from > 0x10000000 is actually of order 30, even larger than the requested order > of 28. The free area is 0x10000000 - 0x50000000. > > alloc_pages_from_buddy instead of just allocating an order of 28 > starting from 0x10000000, it would allocate the "top" order of 28 in the > free area. So it would allocate: 0x40000000 - 0x50000000, returning > 0x40000000. > > Of course, this doesn't work for reserve_heap_pages. > > > This patch changes the behavior of alloc_pages_from_buddy so that in a > situation like the above, it would return 0x10000000 - 0x20000000 > (leaving the rest of the free area unallocated.) So what if then, for the same order-30 (really order-18 if I assume you name addresses, not frame numbers), a reservation request came in for the highest order-28 sub-region? You'd again be screwed if you relied on which part of a larger buddy gets returned by the lower level function you call. I can't help thinking that basing reservation on allocation functions can't really be made work for all possible cases. Instead reservation requests need to check that the requested range is free _and_ split the potentially larger range according to the request. Jan
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |