> With that said I have a few ideas that may help to address the 4 > issues called out above. The basic idea is simple. We use a high water > mark based on zone->free_area[order].nr_free to determine when to wake > up a thread to start hinting memory out of a given free area. From > there we allocate non-"Offline" pages from the free area and assign > them to the hinting queue up to 64MB at a time. Once the hinting is > completed we mark them "Offline" and add them to the tail of the > free_area. Doing this we should cycle the non-"Offline" pages slowly > out of the free_area. In addition the search cost should be minimal > since all of the "Offline" pages should be aggregated to the tail of > the free_area so all pages allocated off of the free_area will be the > non-"Offline" pages until we shift over to them all being "Offline". > This should be effective for MAX_ORDER - 1 and MAX_ORDER - 2 pages > since the only real consumer of add_to_free_area_tail is > __free_one_page which uses it to place a page with an order less than > MAX_ORDER - 2 on the tail of a free_area assuming that it should be > freeing the buddy of that page shortly. The only other issue with > adding to tail would be the memory shuffling which was recently added, > but I don't see that as being something that will be enabled in most > cases so we could probably just make the features mutually exclusive, > at least for now. > > So if I am not mistaken this would essentially require a couple > changes to the mm infrastructure in order for this to work. > > First we would need to split nr_free into two counters, something like > nr_freed and nr_bound. You could use nr_freed - nr_bound to get the > value currently used for nr_free. When we pulled the pages for hinting > we would reduce the nr_freed value and then add back to it when the > pages are returned. When pages are allocated they would increment the > nr_bound value. The idea behind this is that we can record nr_free > when we collect the pages and save it to some local value. This value > could then tell us how many new pages have been added that have not > been hinted upon. > > In addition we will need some way to identify which pages have been > hinted on and which have not. The way I believe easiest to do this > would be to overload the PageType value so that we could essentially > have two values for "Buddy" pages. We would have our standard "Buddy" > pages, and "Buddy" pages that also have the "Offline" value set in the > PageType field. Tracking the Online vs Offline pages this way would > actually allow us to do this with almost no overhead as the mapcount > value is already being reset to clear the "Buddy" flag so adding a > "Offline" flag to this clearing should come at no additional cost.
BTW I like the idea of allocating pages that have already been hinted as last "choice", allocating pages that have not been hinted yet first. -- Thanks, David / dhildenb