lkml.org 
[lkml]   [2013]   [Sep]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFC PATCH v4 26/40] mm: Connect Page Allocator(PA) to Region Allocator(RA); add PA <= RA flow
    Date
    Now that we have built up an infrastructure that forms a "Memory Region
    Allocator", connect it with the page allocator. To entities requesting
    memory, the page allocator will function as a front-end, whereas the
    region allocator will act as a back-end to the page allocator.
    (Analogy: page allocator is like free cash, whereas region allocator
    is like a bank).

    Implement the flow of freepages from the region allocator to the page
    allocator. When __rmqueue_smallest() comes out empty handed, try to get
    freepages from the region allocator. If that fails, only then fallback
    to an allocation from a different migratetype. This helps significantly
    in avoiding mixing of allocations of different migratetypes in a single
    region. Thus it helps in keeping entire memory regions homogeneous with
    respect to the type of allocations.

    Simplification: We assume that the freepages of a memory region can be
    completely represented by a set of MAX_ORDER-1 pages. That is, we only
    need to consider the buddy freelists corresponding to MAX_ORDER-1, while
    interacting with the region allocator. Furthermore, we assume that
    pageblock_order == MAX_ORDER-1.

    (These assumptions are used to ease the implementation, so that one can
    quickly evaluate the benefits of the overall design without getting
    bogged down by too many corner cases and constraints. Of course future
    implementations will handle more scenarios and will have reduced dependence
    on such simplifying assumptions.)

    Signed-off-by: Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>
    ---

    mm/page_alloc.c | 12 ++++++++++--
    1 file changed, 10 insertions(+), 2 deletions(-)

    diff --git a/mm/page_alloc.c b/mm/page_alloc.c
    index d08bc91..0d73134 100644
    --- a/mm/page_alloc.c
    +++ b/mm/page_alloc.c
    @@ -1703,10 +1703,18 @@ static struct page *__rmqueue(struct zone *zone, unsigned int order,
    {
    struct page *page;

    -retry_reserve:
    +retry:
    page = __rmqueue_smallest(zone, order, migratetype);

    if (unlikely(!page) && migratetype != MIGRATE_RESERVE) {
    +
    + /*
    + * Try to get a region from the region allocator before falling
    + * back to an allocation from a different migratetype.
    + */
    + if (!del_from_region_allocator(zone, MAX_ORDER-1, migratetype))
    + goto retry;
    +
    page = __rmqueue_fallback(zone, order, migratetype);

    /*
    @@ -1716,7 +1724,7 @@ retry_reserve:
    */
    if (!page) {
    migratetype = MIGRATE_RESERVE;
    - goto retry_reserve;
    + goto retry;
    }
    }



    \
     
     \ /
      Last update: 2013-09-26 01:41    [W:4.131 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site