All of lore.kernel.org
 help / color / mirror / Atom feed
From: Lai Jiangshan <laijs@cn.fujitsu.com>
To: KOSAKI Motohiro <kosaki.motohiro@gmail.com>
Cc: linux-kernel@vger.kernel.org, Mel Gorman <mel@csn.ul.ie>,
	Andrew Morton <akpm@linux-foundation.org>,
	Jiang Liu <jiang.liu@huawei.com>, Xishi Qiu <qiuxishi@huawei.com>,
	Mel Gorman <mgorman@suse.de>, Minchan Kim <minchan@kernel.org>,
	KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>,
	Michal Hocko <mhocko@suse.cz>,
	linux-mm@kvack.org
Subject: Re: [PATCH 3/3] memory_hotplug: Don't modify the zone_start_pfn outside of zone_span_writelock()
Date: Fri, 28 Sep 2012 15:39:31 +0800	[thread overview]
Message-ID: <50655433.7000108@cn.fujitsu.com> (raw)
In-Reply-To: <5064D391.5080102@gmail.com>

Hi, KOSAKI

On 09/28/2012 06:30 AM, KOSAKI Motohiro wrote:
> (9/27/12 2:47 AM), Lai Jiangshan wrote:
>> The __add_zone() maybe call sleep-able init_currently_empty_zone()
>> to init wait_table,
> 
> This doesn't explain why sleepable is critical important. I think sleepable
> is jsut unrelated. The fact is only: to write zone->zone_start_pfn require
> zone_span_writelock, but init_currently_empty_zone() doesn't take it.

You are right, sleepable is not critical important, but the lock is critical.

I am Sorry that I added "sleep-able" and misled guys.

Actually I want to say:

1) to write zone->zone_start_pfn require zone_span_writelock
2) init_currently_empty_zone() is sleepable, so we can't use zone_span_writelock()
   protect the whole init_currently_empty_zone().
3) so we have to move the modification code out of init_currently_empty_zone()
   as this patch does.

> 
> 
>>
>> But this function also modifies the zone_start_pfn without any lock.
>> It is bugy.
> 
> buggy?
> 
> 
>> So we move this modification out, and we ensure the modification
>> of zone_start_pfn is only done with zone_span_writelock() held or in booting.
>>
>> Since zone_start_pfn is not modified by init_currently_empty_zone()
>> grow_zone_span() needs to check zone_start_pfn before update it.
>>
>> CC: Mel Gorman <mel@csn.ul.ie>
>> Signed-off-by: Lai Jiangshan <laijs@cn.fujitsu.com>
>> Reported-by: Yasuaki ISIMATU <isimatu.yasuaki@jp.fujitsu.com>
>> Tested-by: Wen Congyang <wency@cn.fujitsu.com>
>> ---
>>  mm/memory_hotplug.c |    2 +-
>>  mm/page_alloc.c     |    3 +--
>>  2 files changed, 2 insertions(+), 3 deletions(-)
>>
>> diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c
>> index b62d429b..790561f 100644
>> --- a/mm/memory_hotplug.c
>> +++ b/mm/memory_hotplug.c
>> @@ -205,7 +205,7 @@ static void grow_zone_span(struct zone *zone, unsigned long start_pfn,
>>  	zone_span_writelock(zone);
>>  
>>  	old_zone_end_pfn = zone->zone_start_pfn + zone->spanned_pages;
>> -	if (start_pfn < zone->zone_start_pfn)
>> +	if (!zone->zone_start_pfn || start_pfn < zone->zone_start_pfn)
>>  		zone->zone_start_pfn = start_pfn;
> 
> Wrong. zone->zone_start_pfn==0 may be valid pfn. You shouldn't assume it is uninitialized
> value.

Good catch, I will use zone->spanned_pages instead.


Thanks,
Lai

> 
> 
>>  
>>  	zone->spanned_pages = max(old_zone_end_pfn, end_pfn) -
>> diff --git a/mm/page_alloc.c b/mm/page_alloc.c
>> index c13ea75..2545013 100644
>> --- a/mm/page_alloc.c
>> +++ b/mm/page_alloc.c
>> @@ -3997,8 +3997,6 @@ int __meminit init_currently_empty_zone(struct zone *zone,
>>  		return ret;
>>  	pgdat->nr_zones = zone_idx(zone) + 1;
>>  
>> -	zone->zone_start_pfn = zone_start_pfn;
>> -
>>  	mminit_dprintk(MMINIT_TRACE, "memmap_init",
>>  			"Initialising map node %d zone %lu pfns %lu -> %lu\n",
>>  			pgdat->node_id,
>> @@ -4465,6 +4463,7 @@ static void __paginginit free_area_init_core(struct pglist_data *pgdat,
>>  		ret = init_currently_empty_zone(zone, zone_start_pfn,
>>  						size, MEMMAP_EARLY);
>>  		BUG_ON(ret);
>> +		zone->zone_start_pfn = zone_start_pfn;
>>  		memmap_init(size, nid, j, zone_start_pfn);
>>  		zone_start_pfn += size;
>>  	}
>>
> 
> --
> 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/
> 

--
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: Lai Jiangshan <laijs@cn.fujitsu.com>
To: KOSAKI Motohiro <kosaki.motohiro@gmail.com>
Cc: linux-kernel@vger.kernel.org, Mel Gorman <mel@csn.ul.ie>,
	Andrew Morton <akpm@linux-foundation.org>,
	Jiang Liu <jiang.liu@huawei.com>, Xishi Qiu <qiuxishi@huawei.com>,
	Mel Gorman <mgorman@suse.de>, Minchan Kim <minchan@kernel.org>,
	KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>,
	Michal Hocko <mhocko@suse.cz>,
	linux-mm@kvack.org
Subject: Re: [PATCH 3/3] memory_hotplug: Don't modify the zone_start_pfn outside of zone_span_writelock()
Date: Fri, 28 Sep 2012 15:39:31 +0800	[thread overview]
Message-ID: <50655433.7000108@cn.fujitsu.com> (raw)
In-Reply-To: <5064D391.5080102@gmail.com>

Hi, KOSAKI

On 09/28/2012 06:30 AM, KOSAKI Motohiro wrote:
> (9/27/12 2:47 AM), Lai Jiangshan wrote:
>> The __add_zone() maybe call sleep-able init_currently_empty_zone()
>> to init wait_table,
> 
> This doesn't explain why sleepable is critical important. I think sleepable
> is jsut unrelated. The fact is only: to write zone->zone_start_pfn require
> zone_span_writelock, but init_currently_empty_zone() doesn't take it.

You are right, sleepable is not critical important, but the lock is critical.

I am Sorry that I added "sleep-able" and misled guys.

Actually I want to say:

1) to write zone->zone_start_pfn require zone_span_writelock
2) init_currently_empty_zone() is sleepable, so we can't use zone_span_writelock()
   protect the whole init_currently_empty_zone().
3) so we have to move the modification code out of init_currently_empty_zone()
   as this patch does.

> 
> 
>>
>> But this function also modifies the zone_start_pfn without any lock.
>> It is bugy.
> 
> buggy?
> 
> 
>> So we move this modification out, and we ensure the modification
>> of zone_start_pfn is only done with zone_span_writelock() held or in booting.
>>
>> Since zone_start_pfn is not modified by init_currently_empty_zone()
>> grow_zone_span() needs to check zone_start_pfn before update it.
>>
>> CC: Mel Gorman <mel@csn.ul.ie>
>> Signed-off-by: Lai Jiangshan <laijs@cn.fujitsu.com>
>> Reported-by: Yasuaki ISIMATU <isimatu.yasuaki@jp.fujitsu.com>
>> Tested-by: Wen Congyang <wency@cn.fujitsu.com>
>> ---
>>  mm/memory_hotplug.c |    2 +-
>>  mm/page_alloc.c     |    3 +--
>>  2 files changed, 2 insertions(+), 3 deletions(-)
>>
>> diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c
>> index b62d429b..790561f 100644
>> --- a/mm/memory_hotplug.c
>> +++ b/mm/memory_hotplug.c
>> @@ -205,7 +205,7 @@ static void grow_zone_span(struct zone *zone, unsigned long start_pfn,
>>  	zone_span_writelock(zone);
>>  
>>  	old_zone_end_pfn = zone->zone_start_pfn + zone->spanned_pages;
>> -	if (start_pfn < zone->zone_start_pfn)
>> +	if (!zone->zone_start_pfn || start_pfn < zone->zone_start_pfn)
>>  		zone->zone_start_pfn = start_pfn;
> 
> Wrong. zone->zone_start_pfn==0 may be valid pfn. You shouldn't assume it is uninitialized
> value.

Good catch, I will use zone->spanned_pages instead.


Thanks,
Lai

> 
> 
>>  
>>  	zone->spanned_pages = max(old_zone_end_pfn, end_pfn) -
>> diff --git a/mm/page_alloc.c b/mm/page_alloc.c
>> index c13ea75..2545013 100644
>> --- a/mm/page_alloc.c
>> +++ b/mm/page_alloc.c
>> @@ -3997,8 +3997,6 @@ int __meminit init_currently_empty_zone(struct zone *zone,
>>  		return ret;
>>  	pgdat->nr_zones = zone_idx(zone) + 1;
>>  
>> -	zone->zone_start_pfn = zone_start_pfn;
>> -
>>  	mminit_dprintk(MMINIT_TRACE, "memmap_init",
>>  			"Initialising map node %d zone %lu pfns %lu -> %lu\n",
>>  			pgdat->node_id,
>> @@ -4465,6 +4463,7 @@ static void __paginginit free_area_init_core(struct pglist_data *pgdat,
>>  		ret = init_currently_empty_zone(zone, zone_start_pfn,
>>  						size, MEMMAP_EARLY);
>>  		BUG_ON(ret);
>> +		zone->zone_start_pfn = zone_start_pfn;
>>  		memmap_init(size, nid, j, zone_start_pfn);
>>  		zone_start_pfn += size;
>>  	}
>>
> 
> --
> 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/
> 


  reply	other threads:[~2012-09-28  7:37 UTC|newest]

Thread overview: 38+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-09-27  6:47 [PATCH 0/3] memory_hotplug: fix memory hotplug bug Lai Jiangshan
2012-09-27  6:47 ` Lai Jiangshan
2012-09-27  6:47 ` [PATCH 1/3] memory_hotplug: fix stale node_states[N_NORMAL_MEMORY] Lai Jiangshan
2012-09-27  6:47   ` Lai Jiangshan
2012-09-27 14:32   ` Ni zhan Chen
2012-09-27 14:32     ` Ni zhan Chen
2012-09-28  7:32     ` Lai Jiangshan
2012-09-28  7:32       ` Lai Jiangshan
2012-09-27 22:03   ` KOSAKI Motohiro
2012-09-27 22:03     ` KOSAKI Motohiro
2012-10-26  1:39     ` Lai Jiangshan
2012-10-26  1:39       ` Lai Jiangshan
2012-09-27  6:47 ` [PATCH 2/3] slub, hotplug: ignore unrelated node's hot-adding and hot-removing Lai Jiangshan
2012-09-27  6:47   ` Lai Jiangshan
2012-09-27 22:04   ` KOSAKI Motohiro
2012-09-27 22:04     ` KOSAKI Motohiro
2012-09-27 22:35     ` Christoph
2012-09-27 22:35       ` Christoph
2012-09-28  7:19       ` Lai Jiangshan
2012-09-28  7:19         ` Lai Jiangshan
2012-09-28 22:26         ` KOSAKI Motohiro
2012-09-28 22:26           ` KOSAKI Motohiro
2012-10-24  7:06           ` Lai Jiangshan
2012-10-24  7:06             ` Lai Jiangshan
2012-09-27  6:47 ` [PATCH 3/3] memory_hotplug: Don't modify the zone_start_pfn outside of zone_span_writelock() Lai Jiangshan
2012-09-27  6:47   ` Lai Jiangshan
2012-09-27 13:19   ` Ni zhan Chen
2012-09-27 13:19     ` Ni zhan Chen
2012-09-28  7:29     ` Lai Jiangshan
2012-09-28  7:29       ` Lai Jiangshan
2012-09-28  8:04       ` Ni zhan Chen
2012-09-28  8:04         ` Ni zhan Chen
2012-09-27 22:30   ` KOSAKI Motohiro
2012-09-27 22:30     ` KOSAKI Motohiro
2012-09-28  7:39     ` Lai Jiangshan [this message]
2012-09-28  7:39       ` Lai Jiangshan
2012-09-28  0:39 ` [PATCH 0/3] memory_hotplug: fix memory hotplug bug Ni zhan Chen
2012-09-28  0:39   ` Ni zhan Chen

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=50655433.7000108@cn.fujitsu.com \
    --to=laijs@cn.fujitsu.com \
    --cc=akpm@linux-foundation.org \
    --cc=jiang.liu@huawei.com \
    --cc=kamezawa.hiroyu@jp.fujitsu.com \
    --cc=kosaki.motohiro@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=mel@csn.ul.ie \
    --cc=mgorman@suse.de \
    --cc=mhocko@suse.cz \
    --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.