On Wed, Jun 20, 2018 at 09:11:39AM +0000, Wang, Wei W wrote:
On Tuesday, June 19, 2018 10:43 PM, Michael S. Tsirk wrote:
quoted
On Tue, Jun 19, 2018 at 08:13:37PM +0800, Wei Wang wrote:
quoted
On 06/19/2018 11:05 AM, Michael S. Tsirkin wrote:
quoted
On Tue, Jun 19, 2018 at 01:06:48AM +0000, Wang, Wei W wrote:
quoted
On Monday, June 18, 2018 10:29 AM, Michael S. Tsirkin wrote:
quoted
On Sat, Jun 16, 2018 at 01:09:44AM +0000, Wang, Wei W wrote:
quoted
Not necessarily, I think. We have min(4m_page_blocks / 512,
1024) above,
so the maximum memory that can be reported is 2TB. For larger
guests, e.g.
quoted
quoted
quoted
quoted
4TB, the optimization can still offer 2TB free memory (better
than no optimization).
Maybe it's better, maybe it isn't. It certainly muddies the waters even
more.
quoted
quoted
quoted
quoted
I'd rather we had a better plan. From that POV I like what
Matthew Wilcox suggested for this which is to steal the necessary # of
entries off the list.
quoted
quoted
quoted
Actually what Matthew suggested doesn't make a difference here.
That method always steal the first free page blocks, and sure can
be changed to take more. But all these can be achieved via kmalloc
I'd do get_user_pages really. You don't want pages split, etc.
Oops sorry. I meant get_free_pages .
Yes, we can use __get_free_pages, and the max allocation is MAX_ORDER - 1, which can report up to 2TB free memory.
"getting two pages isn't harder", do you mean passing two arrays (two allocations by get_free_pages(,MAX_ORDER -1)) to the mm API?
Yes, or generally a list of pages with as many as needed.
Please see if the following logic aligns to what you think:
uint32_t i, max_hints, hints_per_page, hints_per_array, total_arrays;
unsigned long *arrays;
/*
* Each array size is MAX_ORDER_NR_PAGES. If one array is not enough to
* store all the hints, we need to allocate multiple arrays.
* max_hints: the max number of 4MB free page blocks
* hints_per_page: the number of hints each page can store
* hints_per_array: the number of hints an array can store
* total_arrays: the number of arrays we need
*/
max_hints = totalram_pages / MAX_ORDER_NR_PAGES;
hints_per_page = PAGE_SIZE / sizeof(__le64);
hints_per_array = hints_per_page * MAX_ORDER_NR_PAGES;
total_arrays = max_hints / hints_per_array +
!!(max_hints % hints_per_array);
arrays = kmalloc(total_arrays * sizeof(unsigned long), GFP_KERNEL);
for (i = 0; i < total_arrays; i++) {
arrays[i] = __get_free_pages(__GFP_ATOMIC | __GFP_NOMEMALLOC, MAX_ORDER - 1);
if (!arrays[i])
goto out;
}
- the mm API needs to be changed to support storing hints to multiple separated arrays offered by the caller.
Best,
Wei
Yes. And add an API to just count entries so we know how many arrays to allocate.
--
MST