lkml.org 
[lkml]   [2004]   [Jul]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    SubjectRe: [PATCH] memory hotremoval for linux-2.6.7 [1/16]
    From


    --- linux-2.6.7.ORG/include/linux/mm_inline.h Sat Jul 10 12:42:43 2032
    +++ linux-2.6.7/include/linux/mm_inline.h Sat Jul 10 12:34:19 2032
    @@ -38,3 +38,42 @@ del_page_from_lru(struct zone *zone, str
    zone->nr_inactive--;
    }
    }
    +
    +static inline struct page *
    +steal_page_from_lru(struct zone *zone, struct page *page)
    +{
    + if (!TestClearPageLRU(page))
    + BUG();
    + list_del(&page->lru);
    + if (get_page_testone(page)) {
    + /*
    + * It was already free! release_pages() or put_page()
    + * are about to remove it from the LRU and free it. So
    + * put the refcount back and put the page back on the
    + * LRU
    + */
    + __put_page(page);
    + SetPageLRU(page);
    + if (PageActive(page))
    + list_add(&page->lru, &zone->active_list);
    + else
    + list_add(&page->lru, &zone->inactive_list);
    + return NULL;
    + }
    + if (PageActive(page))
    + zone->nr_active--;
    + else
    + zone->nr_inactive--;
    + return page;
    +}
    +
    +static inline void
    +putback_page_to_lru(struct zone *zone, struct page *page)
    +{
    + if (TestSetPageLRU(page))
    + BUG();
    + if (PageActive(page))
    + add_page_to_active_list(zone, page);
    + else
    + add_page_to_inactive_list(zone, page);
    +}
    --- linux-2.6.7.ORG/mm/vmscan.c Sat Jul 10 12:42:43 2032
    +++ linux-2.6.7/mm/vmscan.c Sat Jul 10 12:41:29 2032
    @@ -557,23 +557,11 @@ static void shrink_cache(struct zone *zo

    prefetchw_prev_lru_page(page,
    &zone->inactive_list, flags);
    -
    - if (!TestClearPageLRU(page))
    - BUG();
    - list_del(&page->lru);
    - if (get_page_testone(page)) {
    - /*
    - * It is being freed elsewhere
    - */
    - __put_page(page);
    - SetPageLRU(page);
    - list_add(&page->lru, &zone->inactive_list);
    + if (steal_page_from_lru(zone, page) == NULL)
    continue;
    - }
    list_add(&page->lru, &page_list);
    nr_taken++;
    }
    - zone->nr_inactive -= nr_taken;
    zone->pages_scanned += nr_taken;
    spin_unlock_irq(&zone->lru_lock);

    @@ -596,13 +584,8 @@ static void shrink_cache(struct zone *zo
    */
    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);
    + putback_page_to_lru(zone, page);
    if (!pagevec_add(&pvec, page)) {
    spin_unlock_irq(&zone->lru_lock);
    __pagevec_release(&pvec);
    @@ -655,26 +638,12 @@ refill_inactive_zone(struct zone *zone,
    while (pgscanned < nr_pages && !list_empty(&zone->active_list)) {
    page = lru_to_page(&zone->active_list);
    prefetchw_prev_lru_page(page, &zone->active_list, flags);
    - if (!TestClearPageLRU(page))
    - BUG();
    - list_del(&page->lru);
    - if (get_page_testone(page)) {
    - /*
    - * It was already free! release_pages() or put_page()
    - * are about to remove it from the LRU and free it. So
    - * put the refcount back and put the page back on the
    - * LRU
    - */
    - __put_page(page);
    - SetPageLRU(page);
    - list_add(&page->lru, &zone->active_list);
    - } else {
    + if (steal_page_from_lru(zone, page) != NULL) {
    list_add(&page->lru, &l_hold);
    pgmoved++;
    }
    pgscanned++;
    }
    - zone->nr_active -= pgmoved;
    spin_unlock_irq(&zone->lru_lock);

    /*
    -
    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-03-22 14:04    [W:0.030 / U:1.748 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site