lkml.org 
[lkml]   [2010]   [Sep]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[092/129] memory hotplug: fix next block calculation in is_removable
    2.6.35-stable review patch.  If anyone has any objections, please let us know.

    ------------------

    From: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>

    commit 0dcc48c15f63ee86c2fcd33968b08d651f0360a5 upstream.

    next_active_pageblock() is for finding next _used_ freeblock. It skips
    several blocks when it finds there are a chunk of free pages lager than
    pageblock. But it has 2 bugs.

    1. We have no lock. page_order(page) - pageblock_order can be minus.
    2. pageblocks_stride += is wrong. it should skip page_order(p) of pages.

    Signed-off-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
    Cc: Michal Hocko <mhocko@suse.cz>
    Cc: Wu Fengguang <fengguang.wu@intel.com>
    Cc: Mel Gorman <mel@csn.ul.ie>
    Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

    ---
    mm/memory_hotplug.c | 16 ++++++++--------
    1 file changed, 8 insertions(+), 8 deletions(-)

    --- a/mm/memory_hotplug.c
    +++ b/mm/memory_hotplug.c
    @@ -584,19 +584,19 @@ static inline int pageblock_free(struct
    /* Return the start of the next active pageblock after a given page */
    static struct page *next_active_pageblock(struct page *page)
    {
    - int pageblocks_stride;
    -
    /* Ensure the starting page is pageblock-aligned */
    BUG_ON(page_to_pfn(page) & (pageblock_nr_pages - 1));

    - /* Move forward by at least 1 * pageblock_nr_pages */
    - pageblocks_stride = 1;
    -
    /* If the entire pageblock is free, move to the end of free page */
    - if (pageblock_free(page))
    - pageblocks_stride += page_order(page) - pageblock_order;
    + if (pageblock_free(page)) {
    + int order;
    + /* be careful. we don't have locks, page_order can be changed.*/
    + order = page_order(page);
    + if ((order < MAX_ORDER) && (order >= pageblock_order))
    + return page + (1 << order);
    + }

    - return page + (pageblocks_stride * pageblock_nr_pages);
    + return page + pageblock_nr_pages;
    }

    /* Checks if this range of memory is likely to be hot-removable. */



    \
     
     \ /
      Last update: 2010-09-18 21:25    [W:8.312 / U:0.516 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site