On 4/14/21 4:38 AM, lipeifeng@xxxxxxxx wrote:
From: lipeifeng <lipeifeng@xxxxxxxx>
This patch would "sort" the free-pages in buddy by pages-PFN to concentrate
low-order-pages allocation in the front area of memory and high-order-pages
allcation on the contrary so that few memory-pollution in the back area of
memory and the probablity of high-order-pages allocation would be increased
significantly.
-----------------------------------------------------------------------
1) Divide memory into several segments by pages-PFN
"Multi_freearea" would divide memory into FREE_AREA_COUNTS segments
by pages-PFN,each memory-segment corresponds to a free_area.
Example: machine(4G of physical memery) and FREE_AREA_COUNTS(4):
page-PFN:0x0 0x40000(1G) 0x80000(2G) 0xc0000(3G) 0xFFFFF(4G)
|------------|--------------|--------------|-------------|
free_area: [0][] [1][] [2][] [3][]
NOTE: Selecting the corresponding freearea when pages are freed back
to buddy:
- pages-PFN[0, free_area_segment[0].max_pfn] -> free_area[0][]
- pages-PFN[free_area_segment[flc - 1].max_pfn,
free_area_segment[flc].max_pfn] -> free_area[flc][]
(flc > 0)
By this way, all pages in the same segment/free_area is within a
certain range of pages-PFN.
2) Select the corresponding freearea to alloc-pages
"Multi_freearea" would select the corresponding free_area by the
allocation-order when alloc-pages.
- order < HIGH_ORDER_TO_FLC:
free_area[0] -> ... -> free_area[FREE_AREA_COUNTS - 1]
- order >= HIGH_ORDER_TO_FLC:
free_area[FREE_AREA_COUNTS - 1] -> ... -> free_area[0]
Example:
The machine(4G of physical memery) and FREE_AREA_COUNTS(4)
and HIGH_ORDER_TO_FLC(3).
If user allocs page(order = 0),it would take page from
free_area[0][] first, if that fails,try free_area[1][] and so on.
If user allocs page(order = 4),it would take page from
free_area[3][] first, if that fails,try free_area[2][] and so on.
By this way,low-order pages will be concentrated in the front area
of memory.Because of few memory-pollution in the back area of memory,
the sussessful probablity of high-order allocation would be improved.
3) Adjust the location of free-pages in the free_list
"Multi_freearea" would place free-pages in the head of free_list if
pages-PFN is smaller than free_area_segment[flc]->median_pfn and in
the tail of free_list on the contrary.
Example:
page-PFN: free_area_segment[flc]->median_pfn
|
free_list: page->page->page->...|...page->page->page
pages-PFN:| < median_pfn | >= median_pfn |
Because it would take pages from the head of the freelist first in
buddy system,the free-pages in the tail are more likely to keep in the
buddy system.The closer the PFN of pages kept in buddy system, the
greater the probablity of merging that into high-order pages.
I think this part 3) would be worth to be tried separately first, as it's not a
big change compared to the other ones.