lkml.org 
[lkml]   [2009]   [Mar]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 22/25] Update NR_FREE_PAGES only as necessary
    Date
    When pages are being freed to the buddy allocator, the zone
    NR_FREE_PAGES counter must be updated. In the case of bulk per-cpu page
    freeing, it's updated once per page. This retouches cache lines more
    than necessary. Update the counters one per per-cpu bulk free.

    Signed-off-by: Mel Gorman <mel@csn.ul.ie>
    Reviewed-by: Christoph Lameter <cl@linux-foundation.org>
    ---
    mm/page_alloc.c | 12 ++++++------
    1 files changed, 6 insertions(+), 6 deletions(-)

    diff --git a/mm/page_alloc.c b/mm/page_alloc.c
    index 3117209..6584465 100644
    --- a/mm/page_alloc.c
    +++ b/mm/page_alloc.c
    @@ -459,7 +459,6 @@ static inline void __free_one_page(struct page *page,
    int migratetype)
    {
    unsigned long page_idx;
    - int order_size = 1 << order;

    if (unlikely(PageCompound(page)))
    if (unlikely(destroy_compound_page(page, order)))
    @@ -469,10 +468,9 @@ static inline void __free_one_page(struct page *page,

    page_idx = page_to_pfn(page) & ((1 << MAX_ORDER) - 1);

    - VM_BUG_ON(page_idx & (order_size - 1));
    + VM_BUG_ON(page_idx & ((1 << order) - 1));
    VM_BUG_ON(bad_range(zone, page));

    - __mod_zone_page_state(zone, NR_FREE_PAGES, order_size);
    while (order < MAX_ORDER-1) {
    unsigned long combined_idx;
    struct page *buddy;
    @@ -527,6 +525,8 @@ static void free_pages_bulk(struct zone *zone, int count,
    spin_lock(&zone->lock);
    zone_clear_flag(zone, ZONE_ALL_UNRECLAIMABLE);
    zone->pages_scanned = 0;
    +
    + __mod_zone_page_state(zone, NR_FREE_PAGES, count);
    while (count--) {
    struct page *page;

    @@ -545,6 +545,8 @@ static void free_one_page(struct zone *zone, struct page *page, int order,
    spin_lock(&zone->lock);
    zone_clear_flag(zone, ZONE_ALL_UNRECLAIMABLE);
    zone->pages_scanned = 0;
    +
    + __mod_zone_page_state(zone, NR_FREE_PAGES, 1 << order);
    __free_one_page(page, zone, order, migratetype);
    spin_unlock(&zone->lock);
    }
    @@ -689,7 +691,6 @@ struct page *__rmqueue_smallest(struct zone *zone, unsigned int order,
    list_del(&page->lru);
    rmv_page_order(page);
    area->nr_free--;
    - __mod_zone_page_state(zone, NR_FREE_PAGES, - (1UL << order));
    expand(zone, page, order, current_order, area, migratetype);
    return page;
    }
    @@ -829,8 +830,6 @@ __rmqueue_fallback(struct zone *zone, int order, int start_migratetype)
    /* Remove the page from the freelists */
    list_del(&page->lru);
    rmv_page_order(page);
    - __mod_zone_page_state(zone, NR_FREE_PAGES,
    - -(1UL << order));

    if (current_order == pageblock_order)
    set_pageblock_migratetype(page,
    @@ -904,6 +903,7 @@ static int rmqueue_bulk(struct zone *zone, unsigned int order,
    set_page_private(page, migratetype);
    list = &page->lru;
    }
    + __mod_zone_page_state(zone, NR_FREE_PAGES, -(i << order));
    spin_unlock(&zone->lock);
    return i;
    }
    --
    1.5.6.5


    \
     
     \ /
      Last update: 2009-03-20 11:17    [W:0.025 / U:0.800 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site