lkml.org 
[lkml]   [2005]   [Dec]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 05/14] page-replace-remove-loop.patch
    Date

    From: Peter Zijlstra <a.p.zijlstra@chello.nl>

    This patch removes the loop in shrink_cache() by directly taking
    sc->nr_to_scan pages.

    Kudos to Wu Fengguang who did a similair patch.

    Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>

    mm/vmscan.c | 88 +++++++++++++++++++++++++++---------------------------------
    1 files changed, 41 insertions(+), 47 deletions(-)

    Index: linux-2.6-git/mm/vmscan.c
    ===================================================================
    --- linux-2.6-git.orig/mm/vmscan.c 2005-12-10 17:13:57.000000000 +0100
    +++ linux-2.6-git/mm/vmscan.c 2005-12-10 18:19:30.000000000 +0100
    @@ -653,61 +653,55 @@ static void shrink_cache(struct zone *zo
    {
    LIST_HEAD(page_list);
    struct pagevec pvec;
    - int max_scan = sc->nr_to_scan;
    -
    - pagevec_init(&pvec, 1);
    + struct page *page;
    + int nr_taken;
    + int nr_scan;
    + int nr_freed;

    lru_add_drain();
    +
    spin_lock_irq(&zone->lru_lock);
    - while (max_scan > 0) {
    - struct page *page;
    - int nr_taken;
    - int nr_scan;
    - int nr_freed;
    -
    - nr_taken = isolate_lru_pages(sc->swap_cluster_max,
    - &zone->inactive_list,
    - &page_list, &nr_scan);
    - zone->nr_inactive -= nr_taken;
    - zone->pages_scanned += nr_scan;
    - spin_unlock_irq(&zone->lru_lock);
    + nr_taken = isolate_lru_pages(sc->nr_to_scan,
    + &zone->inactive_list,
    + &page_list, &nr_scan);
    + zone->nr_inactive -= nr_taken;
    + zone->pages_scanned += nr_scan;
    + spin_unlock_irq(&zone->lru_lock);

    - if (nr_taken == 0)
    - goto done;
    + if (nr_taken == 0)
    + return;

    - max_scan -= nr_scan;
    - if (current_is_kswapd())
    - mod_page_state_zone(zone, pgscan_kswapd, nr_scan);
    - else
    - mod_page_state_zone(zone, pgscan_direct, nr_scan);
    - nr_freed = shrink_list(&page_list, sc);
    - if (current_is_kswapd())
    - mod_page_state(kswapd_steal, nr_freed);
    - mod_page_state_zone(zone, pgsteal, nr_freed);
    - sc->nr_to_reclaim -= nr_freed;
    + if (current_is_kswapd())
    + mod_page_state_zone(zone, pgscan_kswapd, nr_scan);
    + else
    + mod_page_state_zone(zone, pgscan_direct, nr_scan);
    + nr_freed = shrink_list(&page_list, sc);
    + if (current_is_kswapd())
    + mod_page_state(kswapd_steal, nr_freed);
    + mod_page_state_zone(zone, pgsteal, nr_freed);
    + sc->nr_to_reclaim -= nr_freed;

    - spin_lock_irq(&zone->lru_lock);
    - /*
    - * Put back any unfreeable pages.
    - */
    - while (!list_empty(&page_list)) {
    - page = lru_to_page(&page_list);
    - if (TestSetPageLRU(page))
    - BUG();
    - list_del(&page->lru);
    - if (PageActive(page))
    - add_page_to_active_list(zone, page);
    - else
    - add_page_to_inactive_list(zone, page);
    - if (!pagevec_add(&pvec, page)) {
    - spin_unlock_irq(&zone->lru_lock);
    - __pagevec_release(&pvec);
    - spin_lock_irq(&zone->lru_lock);
    - }
    + /*
    + * Put back any unfreeable pages.
    + */
    + pagevec_init(&pvec, 1);
    + spin_lock_irq(&zone->lru_lock);
    + while (!list_empty(&page_list)) {
    + page = lru_to_page(&page_list);
    + if (TestSetPageLRU(page))
    + BUG();
    + list_del(&page->lru);
    + if (PageActive(page))
    + add_page_to_active_list(zone, page);
    + else
    + add_page_to_inactive_list(zone, page);
    + if (!pagevec_add(&pvec, page)) {
    + spin_unlock_irq(&zone->lru_lock);
    + __pagevec_release(&pvec);
    + spin_lock_irq(&zone->lru_lock);
    }
    - }
    + }
    spin_unlock_irq(&zone->lru_lock);
    -done:
    pagevec_release(&pvec);
    }

    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/
    \
     
     \ /
      Last update: 2005-12-30 23:44    [W:4.090 / U:0.964 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site