All of lore.kernel.org
 help / color / mirror / Atom feed
From: Tang Chen <tangchen@cn.fujitsu.com>
To: Kamezawa Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Cc: akpm@linux-foundation.org, rientjes@google.com, liuj97@gmail.com,
	len.brown@intel.com, benh@kernel.crashing.org, paulus@samba.org,
	cl@linux.com, minchan.kim@gmail.com,
	kosaki.motohiro@jp.fujitsu.com, isimatu.yasuaki@jp.fujitsu.com,
	wujianguo@huawei.com, wency@cn.fujitsu.com, hpa@zytor.com,
	linfeng@cn.fujitsu.com, laijs@cn.fujitsu.com, mgorman@suse.de,
	yinghai@kernel.org, x86@kernel.org, linux-mm@kvack.org,
	linux-kernel@vger.kernel.org, linuxppc-dev@lists.ozlabs.org,
	linux-acpi@vger.kernel.org, linux-s390@vger.kernel.org,
	linux-sh@vger.kernel.org, linux-ia64@vger.kernel.org,
	cmetcalf@tilera.com, sparclinux@vger.kernel.org
Subject: Re: [PATCH v5 03/14] memory-hotplug: remove redundant codes
Date: Thu, 27 Dec 2012 11:09:19 +0800	[thread overview]
Message-ID: <50DBBBDF.4090806@cn.fujitsu.com> (raw)
In-Reply-To: <50DA6D04.8020906@jp.fujitsu.com>

Hi Kamezawa-san,

Thanks for the reviewing. Please see below. :)

On 12/26/2012 11:20 AM, Kamezawa Hiroyuki wrote:
> (2012/12/24 21:09), Tang Chen wrote:
>> From: Wen Congyang<wency@cn.fujitsu.com>
>>
>> offlining memory blocks and checking whether memory blocks are offlined
>> are very similar. This patch introduces a new function to remove
>> redundant codes.
>>
>> Signed-off-by: Wen Congyang<wency@cn.fujitsu.com>
>> ---
>>    mm/memory_hotplug.c |  101 ++++++++++++++++++++++++++++-----------------------
>>    1 files changed, 55 insertions(+), 46 deletions(-)
>>
>> diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c
>> index d43d97b..dbb04d8 100644
>> --- a/mm/memory_hotplug.c
>> +++ b/mm/memory_hotplug.c
>> @@ -1381,20 +1381,14 @@ int offline_pages(unsigned long start_pfn, unsigned long nr_pages)
>>    	return __offline_pages(start_pfn, start_pfn + nr_pages, 120 * HZ);
>>    }
>>
>> -int remove_memory(u64 start, u64 size)
> 
> please add explanation of this function here. If (*func) returns val other than 0,
> this function will fail and returns callback's return value...right ?
> 

Yes, it will always return the func()'s return value. I'll add the
comment here. :)

> 
>> +static int walk_memory_range(unsigned long start_pfn, unsigned long end_pfn,
>> +		void *arg, int (*func)(struct memory_block *, void *))
>>    {
>>    	struct memory_block *mem = NULL;
>>    	struct mem_section *section;
>> -	unsigned long start_pfn, end_pfn;
>>    	unsigned long pfn, section_nr;
>>    	int ret;
>> -	int return_on_error = 0;
>> -	int retry = 0;
>> -
>> -	start_pfn = PFN_DOWN(start);
>> -	end_pfn = start_pfn + PFN_DOWN(size);
>>
>> -repeat:
> 
> Shouldn't we check lock is held here ? (VM_BUG_ON(!mutex_is_locked(&mem_hotplug_mutex);

Well, I think, after applying this patch, walk_memory_range() will be
a separated function. And it can be used somewhere else where we don't
hold this lock. But for now, we can do this check.  :)

> 
> 
>>    	for (pfn = start_pfn; pfn<  end_pfn; pfn += PAGES_PER_SECTION) {
>>    		section_nr = pfn_to_section_nr(pfn);
>>    		if (!present_section_nr(section_nr))
>> @@ -1411,22 +1405,61 @@ repeat:
>>    		if (!mem)
>>    			continue;
>>
>> -		ret = offline_memory_block(mem);
>> +		ret = func(mem, arg);
>>    		if (ret) {
>> -			if (return_on_error) {
>> -				kobject_put(&mem->dev.kobj);
>> -				return ret;
>> -			} else {
>> -				retry = 1;
>> -			}
>> +			kobject_put(&mem->dev.kobj);
>> +			return ret;
>>    		}
>>    	}
>>
>>    	if (mem)
>>    		kobject_put(&mem->dev.kobj);
>>
>> -	if (retry) {
>> -		return_on_error = 1;
>> +	return 0;
>> +}
>> +
>> +static int offline_memory_block_cb(struct memory_block *mem, void *arg)
>> +{
>> +	int *ret = arg;
>> +	int error = offline_memory_block(mem);
>> +
>> +	if (error != 0&&  *ret == 0)
>> +		*ret = error;
>> +
>> +	return 0;
> 
> Always returns 0 and run through all mem blocks for scan-and-retry, right ?
> You need explanation here !

Yes, I'll add the comment. :)

> 
> 
>> +}
>> +
>> +static int is_memblock_offlined_cb(struct memory_block *mem, void *arg)
>> +{
>> +	int ret = !is_memblock_offlined(mem);
>> +
>> +	if (unlikely(ret))
>> +		pr_warn("removing memory fails, because memory "
>> +			"[%#010llx-%#010llx] is onlined\n",
>> +			PFN_PHYS(section_nr_to_pfn(mem->start_section_nr)),
>> +			PFN_PHYS(section_nr_to_pfn(mem->end_section_nr + 1))-1);
>> +
>> +	return ret;
>> +}
>> +
>> +int remove_memory(u64 start, u64 size)
>> +{
>> +	unsigned long start_pfn, end_pfn;
>> +	int ret = 0;
>> +	int retry = 1;
>> +
>> +	start_pfn = PFN_DOWN(start);
>> +	end_pfn = start_pfn + PFN_DOWN(size);
>> +
>> +repeat:
> 
> please explan why you repeat here .

This repeat is add in patch1. It aims to solve the problem we were
talking about in patch1. I'll add the comment here. :)

> 
>> +	walk_memory_range(start_pfn, end_pfn,&ret,
>> +			  offline_memory_block_cb);
>> +	if (ret) {
>> +		if (!retry)
>> +			return ret;
>> +
>> +		retry = 0;
>> +		ret = 0;
>>    		goto repeat;
>>    	}
>>
>> @@ -1444,37 +1477,13 @@ repeat:
>>    	 * memory blocks are offlined.
>>    	 */
>>
>> -	for (pfn = start_pfn; pfn<  end_pfn; pfn += PAGES_PER_SECTION) {
>> -		section_nr = pfn_to_section_nr(pfn);
>> -		if (!present_section_nr(section_nr))
>> -			continue;
>> -
>> -		section = __nr_to_section(section_nr);
>> -		/* same memblock? */
>> -		if (mem)
>> -			if ((section_nr>= mem->start_section_nr)&&
>> -			    (section_nr<= mem->end_section_nr))
>> -				continue;
>> -
>> -		mem = find_memory_block_hinted(section, mem);
>> -		if (!mem)
>> -			continue;
>> -
>> -		ret = is_memblock_offlined(mem);
>> -		if (!ret) {
>> -			pr_warn("removing memory fails, because memory "
>> -				"[%#010llx-%#010llx] is onlined\n",
>> -				PFN_PHYS(section_nr_to_pfn(mem->start_section_nr)),
>> -				PFN_PHYS(section_nr_to_pfn(mem->end_section_nr + 1)) - 1);
>> -
>> -			kobject_put(&mem->dev.kobj);
>> -			unlock_memory_hotplug();
>> -			return ret;
>> -		}
> 
> please explain what you do here. confirming all memory blocks are offlined
> before returning 0 ....right ?

Will be added. :)

Thanks. :)

> 
>> +	ret = walk_memory_range(start_pfn, end_pfn, NULL,
>> +				is_memblock_offlined_cb);
>> +	if (ret) {
>> +		unlock_memory_hotplug();
>> +		return ret;
>>    	}
>>
>> -	if (mem)
>> -		kobject_put(&mem->dev.kobj);
>>    	unlock_memory_hotplug();
>>
>>    	return 0;
>>
> 
> Thanks,
> -Kame
> 
> 

--
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: Tang Chen <tangchen@cn.fujitsu.com>
To: Kamezawa Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Cc: akpm@linux-foundation.org, rientjes@google.com, liuj97@gmail.com,
	len.brown@intel.com, benh@kernel.crashing.org, paulus@samba.org,
	cl@linux.com, minchan.kim@gmail.com,
	kosaki.motohiro@jp.fujitsu.com, isimatu.yasuaki@jp.fujitsu.com,
	wujianguo@huawei.com, wency@cn.fujitsu.com, hpa@zytor.com,
	linfeng@cn.fujitsu.com, laijs@cn.fujitsu.com, mgorman@suse.de,
	yinghai@kernel.org, x86@kernel.org, linux-mm@kvack.org,
	linux-kernel@vger.kernel.org, linuxppc-dev@lists.ozlabs.org,
	linux-acpi@vger.kernel.org, linux-s390@vger.kernel.org,
	linux-sh@vger.kernel.org, linux-ia64@vger.kernel.org,
	cmetcalf@tilera.com, sparclinux@vger.kernel.org
Subject: Re: [PATCH v5 03/14] memory-hotplug: remove redundant codes
Date: Thu, 27 Dec 2012 03:09:19 +0000	[thread overview]
Message-ID: <50DBBBDF.4090806@cn.fujitsu.com> (raw)
In-Reply-To: <50DA6D04.8020906@jp.fujitsu.com>

Hi Kamezawa-san,

Thanks for the reviewing. Please see below. :)

On 12/26/2012 11:20 AM, Kamezawa Hiroyuki wrote:
> (2012/12/24 21:09), Tang Chen wrote:
>> From: Wen Congyang<wency@cn.fujitsu.com>
>>
>> offlining memory blocks and checking whether memory blocks are offlined
>> are very similar. This patch introduces a new function to remove
>> redundant codes.
>>
>> Signed-off-by: Wen Congyang<wency@cn.fujitsu.com>
>> ---
>>    mm/memory_hotplug.c |  101 ++++++++++++++++++++++++++++-----------------------
>>    1 files changed, 55 insertions(+), 46 deletions(-)
>>
>> diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c
>> index d43d97b..dbb04d8 100644
>> --- a/mm/memory_hotplug.c
>> +++ b/mm/memory_hotplug.c
>> @@ -1381,20 +1381,14 @@ int offline_pages(unsigned long start_pfn, unsigned long nr_pages)
>>    	return __offline_pages(start_pfn, start_pfn + nr_pages, 120 * HZ);
>>    }
>>
>> -int remove_memory(u64 start, u64 size)
> 
> please add explanation of this function here. If (*func) returns val other than 0,
> this function will fail and returns callback's return value...right ?
> 

Yes, it will always return the func()'s return value. I'll add the
comment here. :)

> 
>> +static int walk_memory_range(unsigned long start_pfn, unsigned long end_pfn,
>> +		void *arg, int (*func)(struct memory_block *, void *))
>>    {
>>    	struct memory_block *mem = NULL;
>>    	struct mem_section *section;
>> -	unsigned long start_pfn, end_pfn;
>>    	unsigned long pfn, section_nr;
>>    	int ret;
>> -	int return_on_error = 0;
>> -	int retry = 0;
>> -
>> -	start_pfn = PFN_DOWN(start);
>> -	end_pfn = start_pfn + PFN_DOWN(size);
>>
>> -repeat:
> 
> Shouldn't we check lock is held here ? (VM_BUG_ON(!mutex_is_locked(&mem_hotplug_mutex);

Well, I think, after applying this patch, walk_memory_range() will be
a separated function. And it can be used somewhere else where we don't
hold this lock. But for now, we can do this check.  :)

> 
> 
>>    	for (pfn = start_pfn; pfn<  end_pfn; pfn += PAGES_PER_SECTION) {
>>    		section_nr = pfn_to_section_nr(pfn);
>>    		if (!present_section_nr(section_nr))
>> @@ -1411,22 +1405,61 @@ repeat:
>>    		if (!mem)
>>    			continue;
>>
>> -		ret = offline_memory_block(mem);
>> +		ret = func(mem, arg);
>>    		if (ret) {
>> -			if (return_on_error) {
>> -				kobject_put(&mem->dev.kobj);
>> -				return ret;
>> -			} else {
>> -				retry = 1;
>> -			}
>> +			kobject_put(&mem->dev.kobj);
>> +			return ret;
>>    		}
>>    	}
>>
>>    	if (mem)
>>    		kobject_put(&mem->dev.kobj);
>>
>> -	if (retry) {
>> -		return_on_error = 1;
>> +	return 0;
>> +}
>> +
>> +static int offline_memory_block_cb(struct memory_block *mem, void *arg)
>> +{
>> +	int *ret = arg;
>> +	int error = offline_memory_block(mem);
>> +
>> +	if (error != 0&&  *ret = 0)
>> +		*ret = error;
>> +
>> +	return 0;
> 
> Always returns 0 and run through all mem blocks for scan-and-retry, right ?
> You need explanation here !

Yes, I'll add the comment. :)

> 
> 
>> +}
>> +
>> +static int is_memblock_offlined_cb(struct memory_block *mem, void *arg)
>> +{
>> +	int ret = !is_memblock_offlined(mem);
>> +
>> +	if (unlikely(ret))
>> +		pr_warn("removing memory fails, because memory "
>> +			"[%#010llx-%#010llx] is onlined\n",
>> +			PFN_PHYS(section_nr_to_pfn(mem->start_section_nr)),
>> +			PFN_PHYS(section_nr_to_pfn(mem->end_section_nr + 1))-1);
>> +
>> +	return ret;
>> +}
>> +
>> +int remove_memory(u64 start, u64 size)
>> +{
>> +	unsigned long start_pfn, end_pfn;
>> +	int ret = 0;
>> +	int retry = 1;
>> +
>> +	start_pfn = PFN_DOWN(start);
>> +	end_pfn = start_pfn + PFN_DOWN(size);
>> +
>> +repeat:
> 
> please explan why you repeat here .

This repeat is add in patch1. It aims to solve the problem we were
talking about in patch1. I'll add the comment here. :)

> 
>> +	walk_memory_range(start_pfn, end_pfn,&ret,
>> +			  offline_memory_block_cb);
>> +	if (ret) {
>> +		if (!retry)
>> +			return ret;
>> +
>> +		retry = 0;
>> +		ret = 0;
>>    		goto repeat;
>>    	}
>>
>> @@ -1444,37 +1477,13 @@ repeat:
>>    	 * memory blocks are offlined.
>>    	 */
>>
>> -	for (pfn = start_pfn; pfn<  end_pfn; pfn += PAGES_PER_SECTION) {
>> -		section_nr = pfn_to_section_nr(pfn);
>> -		if (!present_section_nr(section_nr))
>> -			continue;
>> -
>> -		section = __nr_to_section(section_nr);
>> -		/* same memblock? */
>> -		if (mem)
>> -			if ((section_nr>= mem->start_section_nr)&&
>> -			    (section_nr<= mem->end_section_nr))
>> -				continue;
>> -
>> -		mem = find_memory_block_hinted(section, mem);
>> -		if (!mem)
>> -			continue;
>> -
>> -		ret = is_memblock_offlined(mem);
>> -		if (!ret) {
>> -			pr_warn("removing memory fails, because memory "
>> -				"[%#010llx-%#010llx] is onlined\n",
>> -				PFN_PHYS(section_nr_to_pfn(mem->start_section_nr)),
>> -				PFN_PHYS(section_nr_to_pfn(mem->end_section_nr + 1)) - 1);
>> -
>> -			kobject_put(&mem->dev.kobj);
>> -			unlock_memory_hotplug();
>> -			return ret;
>> -		}
> 
> please explain what you do here. confirming all memory blocks are offlined
> before returning 0 ....right ?

Will be added. :)

Thanks. :)

> 
>> +	ret = walk_memory_range(start_pfn, end_pfn, NULL,
>> +				is_memblock_offlined_cb);
>> +	if (ret) {
>> +		unlock_memory_hotplug();
>> +		return ret;
>>    	}
>>
>> -	if (mem)
>> -		kobject_put(&mem->dev.kobj);
>>    	unlock_memory_hotplug();
>>
>>    	return 0;
>>
> 
> Thanks,
> -Kame
> 
> 


WARNING: multiple messages have this Message-ID (diff)
From: Tang Chen <tangchen@cn.fujitsu.com>
To: Kamezawa Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Cc: linux-ia64@vger.kernel.org, linux-sh@vger.kernel.org,
	linux-mm@kvack.org, paulus@samba.org, hpa@zytor.com,
	sparclinux@vger.kernel.org, cl@linux.com,
	linux-s390@vger.kernel.org, x86@kernel.org,
	linux-acpi@vger.kernel.org, isimatu.yasuaki@jp.fujitsu.com,
	linfeng@cn.fujitsu.com, mgorman@suse.de,
	kosaki.motohiro@jp.fujitsu.com, rientjes@google.com,
	liuj97@gmail.com, len.brown@intel.com, wency@cn.fujitsu.com,
	cmetcalf@tilera.com, wujianguo@huawei.com, yinghai@kernel.org,
	laijs@cn.fujitsu.com, linux-kernel@vger.kernel.org,
	minchan.kim@gmail.com, akpm@linux-foundation.org,
	linuxppc-dev@lists.ozlabs.org
Subject: Re: [PATCH v5 03/14] memory-hotplug: remove redundant codes
Date: Thu, 27 Dec 2012 11:09:19 +0800	[thread overview]
Message-ID: <50DBBBDF.4090806@cn.fujitsu.com> (raw)
In-Reply-To: <50DA6D04.8020906@jp.fujitsu.com>

Hi Kamezawa-san,

Thanks for the reviewing. Please see below. :)

On 12/26/2012 11:20 AM, Kamezawa Hiroyuki wrote:
> (2012/12/24 21:09), Tang Chen wrote:
>> From: Wen Congyang<wency@cn.fujitsu.com>
>>
>> offlining memory blocks and checking whether memory blocks are offlined
>> are very similar. This patch introduces a new function to remove
>> redundant codes.
>>
>> Signed-off-by: Wen Congyang<wency@cn.fujitsu.com>
>> ---
>>    mm/memory_hotplug.c |  101 ++++++++++++++++++++++++++++-----------------------
>>    1 files changed, 55 insertions(+), 46 deletions(-)
>>
>> diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c
>> index d43d97b..dbb04d8 100644
>> --- a/mm/memory_hotplug.c
>> +++ b/mm/memory_hotplug.c
>> @@ -1381,20 +1381,14 @@ int offline_pages(unsigned long start_pfn, unsigned long nr_pages)
>>    	return __offline_pages(start_pfn, start_pfn + nr_pages, 120 * HZ);
>>    }
>>
>> -int remove_memory(u64 start, u64 size)
> 
> please add explanation of this function here. If (*func) returns val other than 0,
> this function will fail and returns callback's return value...right ?
> 

Yes, it will always return the func()'s return value. I'll add the
comment here. :)

> 
>> +static int walk_memory_range(unsigned long start_pfn, unsigned long end_pfn,
>> +		void *arg, int (*func)(struct memory_block *, void *))
>>    {
>>    	struct memory_block *mem = NULL;
>>    	struct mem_section *section;
>> -	unsigned long start_pfn, end_pfn;
>>    	unsigned long pfn, section_nr;
>>    	int ret;
>> -	int return_on_error = 0;
>> -	int retry = 0;
>> -
>> -	start_pfn = PFN_DOWN(start);
>> -	end_pfn = start_pfn + PFN_DOWN(size);
>>
>> -repeat:
> 
> Shouldn't we check lock is held here ? (VM_BUG_ON(!mutex_is_locked(&mem_hotplug_mutex);

Well, I think, after applying this patch, walk_memory_range() will be
a separated function. And it can be used somewhere else where we don't
hold this lock. But for now, we can do this check.  :)

> 
> 
>>    	for (pfn = start_pfn; pfn<  end_pfn; pfn += PAGES_PER_SECTION) {
>>    		section_nr = pfn_to_section_nr(pfn);
>>    		if (!present_section_nr(section_nr))
>> @@ -1411,22 +1405,61 @@ repeat:
>>    		if (!mem)
>>    			continue;
>>
>> -		ret = offline_memory_block(mem);
>> +		ret = func(mem, arg);
>>    		if (ret) {
>> -			if (return_on_error) {
>> -				kobject_put(&mem->dev.kobj);
>> -				return ret;
>> -			} else {
>> -				retry = 1;
>> -			}
>> +			kobject_put(&mem->dev.kobj);
>> +			return ret;
>>    		}
>>    	}
>>
>>    	if (mem)
>>    		kobject_put(&mem->dev.kobj);
>>
>> -	if (retry) {
>> -		return_on_error = 1;
>> +	return 0;
>> +}
>> +
>> +static int offline_memory_block_cb(struct memory_block *mem, void *arg)
>> +{
>> +	int *ret = arg;
>> +	int error = offline_memory_block(mem);
>> +
>> +	if (error != 0&&  *ret == 0)
>> +		*ret = error;
>> +
>> +	return 0;
> 
> Always returns 0 and run through all mem blocks for scan-and-retry, right ?
> You need explanation here !

Yes, I'll add the comment. :)

> 
> 
>> +}
>> +
>> +static int is_memblock_offlined_cb(struct memory_block *mem, void *arg)
>> +{
>> +	int ret = !is_memblock_offlined(mem);
>> +
>> +	if (unlikely(ret))
>> +		pr_warn("removing memory fails, because memory "
>> +			"[%#010llx-%#010llx] is onlined\n",
>> +			PFN_PHYS(section_nr_to_pfn(mem->start_section_nr)),
>> +			PFN_PHYS(section_nr_to_pfn(mem->end_section_nr + 1))-1);
>> +
>> +	return ret;
>> +}
>> +
>> +int remove_memory(u64 start, u64 size)
>> +{
>> +	unsigned long start_pfn, end_pfn;
>> +	int ret = 0;
>> +	int retry = 1;
>> +
>> +	start_pfn = PFN_DOWN(start);
>> +	end_pfn = start_pfn + PFN_DOWN(size);
>> +
>> +repeat:
> 
> please explan why you repeat here .

This repeat is add in patch1. It aims to solve the problem we were
talking about in patch1. I'll add the comment here. :)

> 
>> +	walk_memory_range(start_pfn, end_pfn,&ret,
>> +			  offline_memory_block_cb);
>> +	if (ret) {
>> +		if (!retry)
>> +			return ret;
>> +
>> +		retry = 0;
>> +		ret = 0;
>>    		goto repeat;
>>    	}
>>
>> @@ -1444,37 +1477,13 @@ repeat:
>>    	 * memory blocks are offlined.
>>    	 */
>>
>> -	for (pfn = start_pfn; pfn<  end_pfn; pfn += PAGES_PER_SECTION) {
>> -		section_nr = pfn_to_section_nr(pfn);
>> -		if (!present_section_nr(section_nr))
>> -			continue;
>> -
>> -		section = __nr_to_section(section_nr);
>> -		/* same memblock? */
>> -		if (mem)
>> -			if ((section_nr>= mem->start_section_nr)&&
>> -			    (section_nr<= mem->end_section_nr))
>> -				continue;
>> -
>> -		mem = find_memory_block_hinted(section, mem);
>> -		if (!mem)
>> -			continue;
>> -
>> -		ret = is_memblock_offlined(mem);
>> -		if (!ret) {
>> -			pr_warn("removing memory fails, because memory "
>> -				"[%#010llx-%#010llx] is onlined\n",
>> -				PFN_PHYS(section_nr_to_pfn(mem->start_section_nr)),
>> -				PFN_PHYS(section_nr_to_pfn(mem->end_section_nr + 1)) - 1);
>> -
>> -			kobject_put(&mem->dev.kobj);
>> -			unlock_memory_hotplug();
>> -			return ret;
>> -		}
> 
> please explain what you do here. confirming all memory blocks are offlined
> before returning 0 ....right ?

Will be added. :)

Thanks. :)

> 
>> +	ret = walk_memory_range(start_pfn, end_pfn, NULL,
>> +				is_memblock_offlined_cb);
>> +	if (ret) {
>> +		unlock_memory_hotplug();
>> +		return ret;
>>    	}
>>
>> -	if (mem)
>> -		kobject_put(&mem->dev.kobj);
>>    	unlock_memory_hotplug();
>>
>>    	return 0;
>>
> 
> Thanks,
> -Kame
> 
> 

WARNING: multiple messages have this Message-ID (diff)
From: Tang Chen <tangchen@cn.fujitsu.com>
To: Kamezawa Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Cc: akpm@linux-foundation.org, rientjes@google.com, liuj97@gmail.com,
	len.brown@intel.com, benh@kernel.crashing.org, paulus@samba.org,
	cl@linux.com, minchan.kim@gmail.com,
	kosaki.motohiro@jp.fujitsu.com, isimatu.yasuaki@jp.fujitsu.com,
	wujianguo@huawei.com, wency@cn.fujitsu.com, hpa@zytor.com,
	linfeng@cn.fujitsu.com, laijs@cn.fujitsu.com, mgorman@suse.de,
	yinghai@kernel.org, x86@kernel.org, linux-mm@kvack.org,
	linux-kernel@vger.kernel.org, linuxppc-dev@lists.ozlabs.org,
	linux-acpi@vger.kernel.org, linux-s390@vger.kernel.org,
	linux-sh@vger.kernel.org, linux-ia64@vger.kernel.org,
	cmetcalf@tilera.com, sparclinux@vger.kernel.org
Subject: Re: [PATCH v5 03/14] memory-hotplug: remove redundant codes
Date: Thu, 27 Dec 2012 11:09:19 +0800	[thread overview]
Message-ID: <50DBBBDF.4090806@cn.fujitsu.com> (raw)
In-Reply-To: <50DA6D04.8020906@jp.fujitsu.com>

Hi Kamezawa-san,

Thanks for the reviewing. Please see below. :)

On 12/26/2012 11:20 AM, Kamezawa Hiroyuki wrote:
> (2012/12/24 21:09), Tang Chen wrote:
>> From: Wen Congyang<wency@cn.fujitsu.com>
>>
>> offlining memory blocks and checking whether memory blocks are offlined
>> are very similar. This patch introduces a new function to remove
>> redundant codes.
>>
>> Signed-off-by: Wen Congyang<wency@cn.fujitsu.com>
>> ---
>>    mm/memory_hotplug.c |  101 ++++++++++++++++++++++++++++-----------------------
>>    1 files changed, 55 insertions(+), 46 deletions(-)
>>
>> diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c
>> index d43d97b..dbb04d8 100644
>> --- a/mm/memory_hotplug.c
>> +++ b/mm/memory_hotplug.c
>> @@ -1381,20 +1381,14 @@ int offline_pages(unsigned long start_pfn, unsigned long nr_pages)
>>    	return __offline_pages(start_pfn, start_pfn + nr_pages, 120 * HZ);
>>    }
>>
>> -int remove_memory(u64 start, u64 size)
> 
> please add explanation of this function here. If (*func) returns val other than 0,
> this function will fail and returns callback's return value...right ?
> 

Yes, it will always return the func()'s return value. I'll add the
comment here. :)

> 
>> +static int walk_memory_range(unsigned long start_pfn, unsigned long end_pfn,
>> +		void *arg, int (*func)(struct memory_block *, void *))
>>    {
>>    	struct memory_block *mem = NULL;
>>    	struct mem_section *section;
>> -	unsigned long start_pfn, end_pfn;
>>    	unsigned long pfn, section_nr;
>>    	int ret;
>> -	int return_on_error = 0;
>> -	int retry = 0;
>> -
>> -	start_pfn = PFN_DOWN(start);
>> -	end_pfn = start_pfn + PFN_DOWN(size);
>>
>> -repeat:
> 
> Shouldn't we check lock is held here ? (VM_BUG_ON(!mutex_is_locked(&mem_hotplug_mutex);

Well, I think, after applying this patch, walk_memory_range() will be
a separated function. And it can be used somewhere else where we don't
hold this lock. But for now, we can do this check.  :)

> 
> 
>>    	for (pfn = start_pfn; pfn<  end_pfn; pfn += PAGES_PER_SECTION) {
>>    		section_nr = pfn_to_section_nr(pfn);
>>    		if (!present_section_nr(section_nr))
>> @@ -1411,22 +1405,61 @@ repeat:
>>    		if (!mem)
>>    			continue;
>>
>> -		ret = offline_memory_block(mem);
>> +		ret = func(mem, arg);
>>    		if (ret) {
>> -			if (return_on_error) {
>> -				kobject_put(&mem->dev.kobj);
>> -				return ret;
>> -			} else {
>> -				retry = 1;
>> -			}
>> +			kobject_put(&mem->dev.kobj);
>> +			return ret;
>>    		}
>>    	}
>>
>>    	if (mem)
>>    		kobject_put(&mem->dev.kobj);
>>
>> -	if (retry) {
>> -		return_on_error = 1;
>> +	return 0;
>> +}
>> +
>> +static int offline_memory_block_cb(struct memory_block *mem, void *arg)
>> +{
>> +	int *ret = arg;
>> +	int error = offline_memory_block(mem);
>> +
>> +	if (error != 0&&  *ret == 0)
>> +		*ret = error;
>> +
>> +	return 0;
> 
> Always returns 0 and run through all mem blocks for scan-and-retry, right ?
> You need explanation here !

Yes, I'll add the comment. :)

> 
> 
>> +}
>> +
>> +static int is_memblock_offlined_cb(struct memory_block *mem, void *arg)
>> +{
>> +	int ret = !is_memblock_offlined(mem);
>> +
>> +	if (unlikely(ret))
>> +		pr_warn("removing memory fails, because memory "
>> +			"[%#010llx-%#010llx] is onlined\n",
>> +			PFN_PHYS(section_nr_to_pfn(mem->start_section_nr)),
>> +			PFN_PHYS(section_nr_to_pfn(mem->end_section_nr + 1))-1);
>> +
>> +	return ret;
>> +}
>> +
>> +int remove_memory(u64 start, u64 size)
>> +{
>> +	unsigned long start_pfn, end_pfn;
>> +	int ret = 0;
>> +	int retry = 1;
>> +
>> +	start_pfn = PFN_DOWN(start);
>> +	end_pfn = start_pfn + PFN_DOWN(size);
>> +
>> +repeat:
> 
> please explan why you repeat here .

This repeat is add in patch1. It aims to solve the problem we were
talking about in patch1. I'll add the comment here. :)

> 
>> +	walk_memory_range(start_pfn, end_pfn,&ret,
>> +			  offline_memory_block_cb);
>> +	if (ret) {
>> +		if (!retry)
>> +			return ret;
>> +
>> +		retry = 0;
>> +		ret = 0;
>>    		goto repeat;
>>    	}
>>
>> @@ -1444,37 +1477,13 @@ repeat:
>>    	 * memory blocks are offlined.
>>    	 */
>>
>> -	for (pfn = start_pfn; pfn<  end_pfn; pfn += PAGES_PER_SECTION) {
>> -		section_nr = pfn_to_section_nr(pfn);
>> -		if (!present_section_nr(section_nr))
>> -			continue;
>> -
>> -		section = __nr_to_section(section_nr);
>> -		/* same memblock? */
>> -		if (mem)
>> -			if ((section_nr>= mem->start_section_nr)&&
>> -			    (section_nr<= mem->end_section_nr))
>> -				continue;
>> -
>> -		mem = find_memory_block_hinted(section, mem);
>> -		if (!mem)
>> -			continue;
>> -
>> -		ret = is_memblock_offlined(mem);
>> -		if (!ret) {
>> -			pr_warn("removing memory fails, because memory "
>> -				"[%#010llx-%#010llx] is onlined\n",
>> -				PFN_PHYS(section_nr_to_pfn(mem->start_section_nr)),
>> -				PFN_PHYS(section_nr_to_pfn(mem->end_section_nr + 1)) - 1);
>> -
>> -			kobject_put(&mem->dev.kobj);
>> -			unlock_memory_hotplug();
>> -			return ret;
>> -		}
> 
> please explain what you do here. confirming all memory blocks are offlined
> before returning 0 ....right ?

Will be added. :)

Thanks. :)

> 
>> +	ret = walk_memory_range(start_pfn, end_pfn, NULL,
>> +				is_memblock_offlined_cb);
>> +	if (ret) {
>> +		unlock_memory_hotplug();
>> +		return ret;
>>    	}
>>
>> -	if (mem)
>> -		kobject_put(&mem->dev.kobj);
>>    	unlock_memory_hotplug();
>>
>>    	return 0;
>>
> 
> Thanks,
> -Kame
> 
> 


  reply	other threads:[~2012-12-27  3:09 UTC|newest]

Thread overview: 194+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-12-24 12:09 [PATCH v5 00/14] memory-hotplug: hot-remove physical memory Tang Chen
2012-12-24 12:09 ` Tang Chen
2012-12-24 12:09 ` Tang Chen
2012-12-24 12:09 ` Tang Chen
2012-12-24 12:09 ` [PATCH v5 01/14] memory-hotplug: try to offline the memory twice to avoid dependence Tang Chen
2012-12-24 12:09   ` Tang Chen
2012-12-24 12:09   ` Tang Chen
2012-12-24 12:09   ` Tang Chen
2012-12-25  8:35   ` Glauber Costa
2012-12-25  8:35     ` Glauber Costa
2012-12-25  8:35     ` Glauber Costa
2012-12-25  8:35     ` Glauber Costa
2012-12-25  8:35     ` Glauber Costa
2012-12-30  5:58     ` Wen Congyang
2012-12-30  5:58       ` Wen Congyang
2012-12-30  5:58       ` Wen Congyang
2012-12-30  5:58       ` Wen Congyang
2013-01-09 15:09       ` Glauber Costa
2013-01-09 15:09         ` Glauber Costa
2013-01-09 15:09         ` Glauber Costa
2013-01-09 15:09         ` Glauber Costa
2013-01-09 15:09         ` Glauber Costa
2013-01-10  1:38         ` Tang Chen
2013-01-10  1:38           ` Tang Chen
2013-01-10  1:38           ` Tang Chen
2013-01-10  1:38           ` Tang Chen
2013-02-06  3:07         ` Tang Chen
2013-02-06  3:07           ` Tang Chen
2013-02-06  3:07           ` Tang Chen
2013-02-06  3:07           ` Tang Chen
2013-02-06  9:17           ` Tang Chen
2013-02-06  9:17             ` Tang Chen
2013-02-06  9:17             ` Tang Chen
2013-02-06  9:17             ` Tang Chen
2013-02-06 10:10             ` Tang Chen
2013-02-06 10:10               ` Tang Chen
2013-02-06 10:10               ` Tang Chen
2013-02-06 10:10               ` Tang Chen
2013-02-06 14:24               ` Glauber Costa
2013-02-06 14:24                 ` Glauber Costa
2013-02-06 14:24                 ` Glauber Costa
2013-02-06 14:24                 ` Glauber Costa
2013-02-06 14:24                 ` Glauber Costa
2013-02-07  7:56                 ` Tang Chen
2013-02-07  7:56                   ` Tang Chen
2013-02-07  7:56                   ` Tang Chen
2013-02-07  7:56                   ` Tang Chen
2012-12-26  3:02   ` Kamezawa Hiroyuki
2012-12-26  3:02     ` Kamezawa Hiroyuki
2012-12-26  3:02     ` Kamezawa Hiroyuki
2012-12-26  3:02     ` Kamezawa Hiroyuki
2012-12-30  5:49     ` Wen Congyang
2012-12-30  5:49       ` Wen Congyang
2012-12-30  5:49       ` Wen Congyang
2012-12-30  5:49       ` Wen Congyang
2012-12-24 12:09 ` [PATCH v5 02/14] memory-hotplug: check whether all memory blocks are offlined or not when removing memory Tang Chen
2012-12-24 12:09   ` Tang Chen
2012-12-24 12:09   ` Tang Chen
2012-12-24 12:09   ` [PATCH v5 02/14] memory-hotplug: check whether all memory blocks are offlined or not when removing m Tang Chen
2012-12-26  3:10   ` [PATCH v5 02/14] memory-hotplug: check whether all memory blocks are offlined or not when removing memory Kamezawa Hiroyuki
2012-12-26  3:10     ` Kamezawa Hiroyuki
2012-12-26  3:10     ` Kamezawa Hiroyuki
2012-12-26  3:10     ` [PATCH v5 02/14] memory-hotplug: check whether all memory blocks are offlined or not when removi Kamezawa Hiroyuki
2012-12-27  3:10     ` [PATCH v5 02/14] memory-hotplug: check whether all memory blocks are offlined or not when removing memory Tang Chen
2012-12-27  3:10       ` Tang Chen
2012-12-27  3:10       ` Tang Chen
2012-12-27  3:10       ` [PATCH v5 02/14] memory-hotplug: check whether all memory blocks are offlined or not when removi Tang Chen
2012-12-24 12:09 ` [PATCH v5 03/14] memory-hotplug: remove redundant codes Tang Chen
2012-12-24 12:09   ` Tang Chen
2012-12-24 12:09   ` Tang Chen
2012-12-24 12:09   ` Tang Chen
2012-12-26  3:20   ` Kamezawa Hiroyuki
2012-12-26  3:20     ` Kamezawa Hiroyuki
2012-12-26  3:20     ` Kamezawa Hiroyuki
2012-12-26  3:20     ` Kamezawa Hiroyuki
2012-12-27  3:09     ` Tang Chen [this message]
2012-12-27  3:09       ` Tang Chen
2012-12-27  3:09       ` Tang Chen
2012-12-27  3:09       ` Tang Chen
2012-12-24 12:09 ` [PATCH v5 04/14] memory-hotplug: remove /sys/firmware/memmap/X sysfs Tang Chen
2012-12-24 12:09   ` Tang Chen
2012-12-24 12:09   ` Tang Chen
2012-12-24 12:09   ` Tang Chen
2012-12-26  3:30   ` Kamezawa Hiroyuki
2012-12-26  3:30     ` Kamezawa Hiroyuki
2012-12-26  3:30     ` Kamezawa Hiroyuki
2012-12-26  3:30     ` Kamezawa Hiroyuki
2012-12-27  3:09     ` Tang Chen
2012-12-27  3:09       ` Tang Chen
2012-12-27  3:09       ` Tang Chen
2012-12-27  3:09       ` Tang Chen
2013-01-02 14:24       ` Christoph Lameter
2013-01-02 14:24         ` Christoph Lameter
2013-01-02 14:24         ` Christoph Lameter
2013-01-02 14:24         ` Christoph Lameter
2012-12-24 12:09 ` [PATCH v5 05/14] memory-hotplug: introduce new function arch_remove_memory() for removing page table depends on architecture Tang Chen
2012-12-24 12:09   ` Tang Chen
2012-12-24 12:09   ` Tang Chen
2012-12-24 12:09   ` [PATCH v5 05/14] memory-hotplug: introduce new function arch_remove_memory() for removing page table Tang Chen
2012-12-26  3:37   ` [PATCH v5 05/14] memory-hotplug: introduce new function arch_remove_memory() for removing page table depends on architecture Kamezawa Hiroyuki
2012-12-26  3:37     ` Kamezawa Hiroyuki
2012-12-26  3:37     ` Kamezawa Hiroyuki
2012-12-26  3:37     ` [PATCH v5 05/14] memory-hotplug: introduce new function arch_remove_memory() for removing page t Kamezawa Hiroyuki
2012-12-24 12:09 ` [PATCH v5 06/14] memory-hotplug: implement register_page_bootmem_info_section of sparse-vmemmap Tang Chen
2012-12-24 12:09   ` Tang Chen
2012-12-24 12:09   ` Tang Chen
2012-12-24 12:09   ` Tang Chen
2012-12-25  8:09   ` Jianguo Wu
2012-12-25  8:09     ` Jianguo Wu
2012-12-25  8:09     ` Jianguo Wu
2012-12-25  8:09     ` Jianguo Wu
2012-12-25  8:09     ` Jianguo Wu
2012-12-26  3:21     ` Tang Chen
2012-12-26  3:21       ` Tang Chen
2012-12-26  3:21       ` Tang Chen
2012-12-26  3:21       ` Tang Chen
2012-12-24 12:09 ` [PATCH v5 07/14] memory-hotplug: move pgdat_resize_lock into sparse_remove_one_section() Tang Chen
2012-12-24 12:09   ` Tang Chen
2012-12-24 12:09   ` Tang Chen
2012-12-24 12:09   ` Tang Chen
2012-12-26  3:47   ` Kamezawa Hiroyuki
2012-12-26  3:47     ` Kamezawa Hiroyuki
2012-12-26  3:47     ` Kamezawa Hiroyuki
2012-12-26  3:47     ` Kamezawa Hiroyuki
2012-12-26  6:20     ` Tang Chen
2012-12-26  6:20       ` Tang Chen
2012-12-26  6:20       ` Tang Chen
2012-12-26  6:20       ` Tang Chen
2012-12-24 12:09 ` [PATCH v5 08/14] memory-hotplug: Common APIs to support page tables hot-remove Tang Chen
2012-12-24 12:09   ` Tang Chen
2012-12-24 12:09   ` Tang Chen
2012-12-24 12:09   ` Tang Chen
2012-12-25  8:17   ` Jianguo Wu
2012-12-25  8:17     ` Jianguo Wu
2012-12-25  8:17     ` Jianguo Wu
2012-12-25  8:17     ` Jianguo Wu
2012-12-26  2:49     ` Tang Chen
2012-12-26  2:49       ` Tang Chen
2012-12-26  2:49       ` Tang Chen
2012-12-26  2:49       ` Tang Chen
2012-12-26  3:11       ` Tang Chen
2012-12-26  3:11         ` Tang Chen
2012-12-26  3:11         ` Tang Chen
2012-12-26  3:11         ` Tang Chen
2012-12-26  3:19         ` Tang Chen
2012-12-26  3:19           ` Tang Chen
2012-12-26  3:19           ` Tang Chen
2012-12-26  3:19           ` Tang Chen
2012-12-24 12:09 ` [PATCH v5 09/14] memory-hotplug: remove page table of x86_64 architecture Tang Chen
2012-12-24 12:09   ` Tang Chen
2012-12-24 12:09   ` Tang Chen
2012-12-24 12:09   ` Tang Chen
2012-12-24 12:09 ` [PATCH v5 10/14] memory-hotplug: remove memmap of sparse-vmemmap Tang Chen
2012-12-24 12:09   ` Tang Chen
2012-12-24 12:09   ` Tang Chen
2012-12-24 12:09   ` Tang Chen
2012-12-24 12:09 ` [PATCH v5 11/14] memory-hotplug: Integrated __remove_section() of CONFIG_SPARSEMEM_VMEMMAP Tang Chen
2012-12-24 12:09   ` Tang Chen
2012-12-24 12:09   ` Tang Chen
2012-12-24 12:09   ` Tang Chen
2012-12-24 12:09 ` [PATCH v5 12/14] memory-hotplug: memory_hotplug: clear zone when removing the memory Tang Chen
2012-12-24 12:09   ` Tang Chen
2012-12-24 12:09   ` Tang Chen
2012-12-24 12:09   ` Tang Chen
2012-12-24 12:09 ` [PATCH v5 13/14] memory-hotplug: remove sysfs file of node Tang Chen
2012-12-24 12:09   ` Tang Chen
2012-12-24 12:09   ` Tang Chen
2012-12-24 12:09   ` Tang Chen
2012-12-24 12:09 ` [PATCH v5 14/14] memory-hotplug: free node_data when a node is offlined Tang Chen
2012-12-24 12:09   ` Tang Chen
2012-12-24 12:09   ` Tang Chen
2012-12-24 12:09   ` Tang Chen
2012-12-26  3:55   ` Kamezawa Hiroyuki
2012-12-26  3:55     ` Kamezawa Hiroyuki
2012-12-26  3:55     ` Kamezawa Hiroyuki
2012-12-26  3:55     ` Kamezawa Hiroyuki
2012-12-27 12:16     ` Wen Congyang
2012-12-27 12:16       ` Wen Congyang
2012-12-27 12:16       ` Wen Congyang
2012-12-27 12:16       ` Wen Congyang
2012-12-28  0:28       ` Kamezawa Hiroyuki
2012-12-28  0:28         ` Kamezawa Hiroyuki
2012-12-28  0:28         ` Kamezawa Hiroyuki
2012-12-28  0:28         ` Kamezawa Hiroyuki
2012-12-30  5:55         ` Wen Congyang
2012-12-30  6:02           ` Wen Congyang
2012-12-30  6:02           ` Wen Congyang
2012-12-30  6:02           ` Wen Congyang
2012-12-30  5:55           ` Wen Congyang
2012-12-30  5:55           ` Wen Congyang
2013-01-07  5:30           ` Kamezawa Hiroyuki
2013-01-07  5:30             ` Kamezawa Hiroyuki
2013-01-07  5:30             ` Kamezawa Hiroyuki
2013-01-07  5:30             ` Kamezawa Hiroyuki

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=50DBBBDF.4090806@cn.fujitsu.com \
    --to=tangchen@cn.fujitsu.com \
    --cc=akpm@linux-foundation.org \
    --cc=benh@kernel.crashing.org \
    --cc=cl@linux.com \
    --cc=cmetcalf@tilera.com \
    --cc=hpa@zytor.com \
    --cc=isimatu.yasuaki@jp.fujitsu.com \
    --cc=kamezawa.hiroyu@jp.fujitsu.com \
    --cc=kosaki.motohiro@jp.fujitsu.com \
    --cc=laijs@cn.fujitsu.com \
    --cc=len.brown@intel.com \
    --cc=linfeng@cn.fujitsu.com \
    --cc=linux-acpi@vger.kernel.org \
    --cc=linux-ia64@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=linux-s390@vger.kernel.org \
    --cc=linux-sh@vger.kernel.org \
    --cc=linuxppc-dev@lists.ozlabs.org \
    --cc=liuj97@gmail.com \
    --cc=mgorman@suse.de \
    --cc=minchan.kim@gmail.com \
    --cc=paulus@samba.org \
    --cc=rientjes@google.com \
    --cc=sparclinux@vger.kernel.org \
    --cc=wency@cn.fujitsu.com \
    --cc=wujianguo@huawei.com \
    --cc=x86@kernel.org \
    --cc=yinghai@kernel.org \
    /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.