All of lore.kernel.org
 help / color / mirror / Atom feed
From: Cody P Schafer <cody@linux.vnet.ibm.com>
To: Xishi Qiu <qiuxishi@huawei.com>
Cc: Andrew Morton <akpm@linux-foundation.org>,
	Mel Gorman <mgorman@suse.de>, Liujiang <jiang.liu@huawei.com>,
	Minchan Kim <minchan@kernel.org>,
	Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>,
	b.zolnierkie@samsung.com, linux-mm@kvack.org,
	LKML <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH] mm/hotplug: fix a drain pcp bug when offline pages
Date: Thu, 01 Aug 2013 11:59:12 -0700	[thread overview]
Message-ID: <51FAB000.9050407@linux.vnet.ibm.com> (raw)
In-Reply-To: <51FA2800.9070706@huawei.com>

On 08/01/2013 02:18 AM, Xishi Qiu wrote:
> __offline_pages()
>     start_isolate_page_range()
>        set_migratetype_isolate()
>           set_pageblock_migratetype() -> this pageblock will be marked as MIGRATE_ISOLATE
>           move_freepages_block() -> pages in PageBuddy will be moved into MIGRATE_ISOLATE list
>           drain_all_pages() -> drain PCP
>              free_pcppages_bulk()
>                 mt = get_freepage_migratetype(page); -> PCP's migratetype is not MIGRATE_ISOLATE
>                 __free_one_page(page, zone, 0, mt); -> so PCP will not be freed into into MIGRATE_ISOLATE list
>
> In this case, the PCP may be allocated again, because they are not in
> PageBuddy's MIGRATE_ISOLATE list. This will cause offline_pages failed.
>
> Signed-off-by: Xishi Qiu <qiuxishi@huawei.com>
> ---
>   mm/page_alloc.c     |   10 ++++++----
>   mm/page_isolation.c |   15 ++++++++++++++-
>   2 files changed, 20 insertions(+), 5 deletions(-)
>
> diff --git a/mm/page_alloc.c b/mm/page_alloc.c
> index b100255..d873471 100644
> --- a/mm/page_alloc.c
> +++ b/mm/page_alloc.c
> @@ -965,11 +965,13 @@ int move_freepages(struct zone *zone,
>   		}
>
>   		order = page_order(page);
> -		list_move(&page->lru,
> -			  &zone->free_area[order].free_list[migratetype]);
> -		set_freepage_migratetype(page, migratetype);
> +		if (get_freepage_migratetype(page) != migratetype) {
> +			list_move(&page->lru,
> +				&zone->free_area[order].free_list[migratetype]);
> +			set_freepage_migratetype(page, migratetype);
> +			pages_moved += 1 << order;
> +		}
>   		page += 1 << order;
> -		pages_moved += 1 << order;

So this looks like it changes the return from move_freepages() to be the 
"pages moved" from "the pages now belonging to the passed migrate type".

The user of move_freepages_block()'s return value (and thus the return 
value of move_freepages()) in mm/page_alloc.c expects that it is the 
original meaning. The users in page_isolation.c expect it is the new 
meaning. Those need to be reconciled.

>   	}
>
>   	return pages_moved;
> diff --git a/mm/page_isolation.c b/mm/page_isolation.c
> index 383bdbb..ba1afc9 100644
> --- a/mm/page_isolation.c
> +++ b/mm/page_isolation.c
> @@ -65,8 +65,21 @@ out:
>   	}
>
>   	spin_unlock_irqrestore(&zone->lock, flags);
> -	if (!ret)
> +
> +	if (!ret) {
>   		drain_all_pages();
> +		/*
> +		 * When drain_all_pages() frees cached pages into the buddy
> +		 * system, it uses the stale migratetype cached in the
> +		 * page->index field, so try to move free pages to ISOLATE
> +		 * list again.
> +		 */
> +		spin_lock_irqsave(&zone->lock, flags);
> +		nr_pages = move_freepages_block(zone, page, MIGRATE_ISOLATE);
> +		__mod_zone_freepage_state(zone, -nr_pages, migratetype);
> +		spin_unlock_irqrestore(&zone->lock, flags);
> +	}
> +

Could we teach drain_all_pages() to use the right migrate type instead 
(or add something similar that does)? (pages could be reallocated 
between the drain_all_pages() and move_freepages_block()).

>   	return ret;
>   }
>

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

WARNING: multiple messages have this Message-ID (diff)
From: Cody P Schafer <cody@linux.vnet.ibm.com>
To: Xishi Qiu <qiuxishi@huawei.com>
Cc: Andrew Morton <akpm@linux-foundation.org>,
	Mel Gorman <mgorman@suse.de>, Liujiang <jiang.liu@huawei.com>,
	Minchan Kim <minchan@kernel.org>,
	Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>,
	b.zolnierkie@samsung.com, linux-mm@kvack.org,
	LKML <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH] mm/hotplug: fix a drain pcp bug when offline pages
Date: Thu, 01 Aug 2013 11:59:12 -0700	[thread overview]
Message-ID: <51FAB000.9050407@linux.vnet.ibm.com> (raw)
In-Reply-To: <51FA2800.9070706@huawei.com>

On 08/01/2013 02:18 AM, Xishi Qiu wrote:
> __offline_pages()
>     start_isolate_page_range()
>        set_migratetype_isolate()
>           set_pageblock_migratetype() -> this pageblock will be marked as MIGRATE_ISOLATE
>           move_freepages_block() -> pages in PageBuddy will be moved into MIGRATE_ISOLATE list
>           drain_all_pages() -> drain PCP
>              free_pcppages_bulk()
>                 mt = get_freepage_migratetype(page); -> PCP's migratetype is not MIGRATE_ISOLATE
>                 __free_one_page(page, zone, 0, mt); -> so PCP will not be freed into into MIGRATE_ISOLATE list
>
> In this case, the PCP may be allocated again, because they are not in
> PageBuddy's MIGRATE_ISOLATE list. This will cause offline_pages failed.
>
> Signed-off-by: Xishi Qiu <qiuxishi@huawei.com>
> ---
>   mm/page_alloc.c     |   10 ++++++----
>   mm/page_isolation.c |   15 ++++++++++++++-
>   2 files changed, 20 insertions(+), 5 deletions(-)
>
> diff --git a/mm/page_alloc.c b/mm/page_alloc.c
> index b100255..d873471 100644
> --- a/mm/page_alloc.c
> +++ b/mm/page_alloc.c
> @@ -965,11 +965,13 @@ int move_freepages(struct zone *zone,
>   		}
>
>   		order = page_order(page);
> -		list_move(&page->lru,
> -			  &zone->free_area[order].free_list[migratetype]);
> -		set_freepage_migratetype(page, migratetype);
> +		if (get_freepage_migratetype(page) != migratetype) {
> +			list_move(&page->lru,
> +				&zone->free_area[order].free_list[migratetype]);
> +			set_freepage_migratetype(page, migratetype);
> +			pages_moved += 1 << order;
> +		}
>   		page += 1 << order;
> -		pages_moved += 1 << order;

So this looks like it changes the return from move_freepages() to be the 
"pages moved" from "the pages now belonging to the passed migrate type".

The user of move_freepages_block()'s return value (and thus the return 
value of move_freepages()) in mm/page_alloc.c expects that it is the 
original meaning. The users in page_isolation.c expect it is the new 
meaning. Those need to be reconciled.

>   	}
>
>   	return pages_moved;
> diff --git a/mm/page_isolation.c b/mm/page_isolation.c
> index 383bdbb..ba1afc9 100644
> --- a/mm/page_isolation.c
> +++ b/mm/page_isolation.c
> @@ -65,8 +65,21 @@ out:
>   	}
>
>   	spin_unlock_irqrestore(&zone->lock, flags);
> -	if (!ret)
> +
> +	if (!ret) {
>   		drain_all_pages();
> +		/*
> +		 * When drain_all_pages() frees cached pages into the buddy
> +		 * system, it uses the stale migratetype cached in the
> +		 * page->index field, so try to move free pages to ISOLATE
> +		 * list again.
> +		 */
> +		spin_lock_irqsave(&zone->lock, flags);
> +		nr_pages = move_freepages_block(zone, page, MIGRATE_ISOLATE);
> +		__mod_zone_freepage_state(zone, -nr_pages, migratetype);
> +		spin_unlock_irqrestore(&zone->lock, flags);
> +	}
> +

Could we teach drain_all_pages() to use the right migrate type instead 
(or add something similar that does)? (pages could be reallocated 
between the drain_all_pages() and move_freepages_block()).

>   	return ret;
>   }
>


  reply	other threads:[~2013-08-01 18:59 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-08-01  9:18 [PATCH] mm/hotplug: fix a drain pcp bug when offline pages Xishi Qiu
2013-08-01  9:18 ` Xishi Qiu
2013-08-01 18:59 ` Cody P Schafer [this message]
2013-08-01 18:59   ` Cody P Schafer
2013-08-02  2:30   ` Xishi Qiu
2013-08-02  2:30     ` Xishi Qiu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=51FAB000.9050407@linux.vnet.ibm.com \
    --to=cody@linux.vnet.ibm.com \
    --cc=akpm@linux-foundation.org \
    --cc=b.zolnierkie@samsung.com \
    --cc=isimatu.yasuaki@jp.fujitsu.com \
    --cc=jiang.liu@huawei.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=mgorman@suse.de \
    --cc=minchan@kernel.org \
    --cc=qiuxishi@huawei.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.