All of lore.kernel.org
 help / color / mirror / Atom feed
From: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>
To: Wen Congyang <wency@cn.fujitsu.com>
Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org,
	linuxppc-dev@lists.ozlabs.org, linux-acpi@vger.kernel.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, akpm@linux-foundation.org,
	kosaki.motohiro@jp.fujitsu.com
Subject: Re: [RFC PATCH v2 4/13] memory-hotplug : remove /sys/firmware/memmap/X sysfs
Date: Mon, 9 Jul 2012 17:18:35 +0900	[thread overview]
Message-ID: <4FFA93DB.6010403@jp.fujitsu.com> (raw)
In-Reply-To: <4FF6ADD9.7040600@cn.fujitsu.com>

Hi Wen,

2012/07/06 18:20, Wen Congyang wrote:
> At 07/06/2012 04:27 PM, Yasuaki Ishimatsu Wrote:
>> Hi Wen,
>>
>> 2012/07/04 19:01, Wen Congyang wrote:
>>> At 07/04/2012 01:52 PM, Yasuaki Ishimatsu Wrote:
>>>> Hi Wen,
>>>>
>>>> 2012/07/04 14:08, Wen Congyang wrote:
>>>>> At 07/04/2012 12:45 PM, Yasuaki Ishimatsu Wrote:
>>>>>> Hi Wen,
>>>>>>
>>>>>> 2012/07/03 15:35, Wen Congyang wrote:
>>>>>>> At 07/03/2012 01:56 PM, Yasuaki Ishimatsu Wrote:
>>>>>>>> When (hot)adding memory into system, /sys/firmware/memmap/X/{end, start, type}
>>>>>>>> sysfs files are created. But there is no code to remove these files. The patch
>>>>>>>> implements the function to remove them.
>>>>>>>>
>>>>>>>> Note : The code does not free firmware_map_entry since there is no way to free
>>>>>>>>            memory which is allocated by bootmem.
>>>>>>>>
>>>>>>>> CC: David Rientjes <rientjes@google.com>
>>>>>>>> CC: Jiang Liu <liuj97@gmail.com>
>>>>>>>> CC: Len Brown <len.brown@intel.com>
>>>>>>>> CC: Benjamin Herrenschmidt <benh@kernel.crashing.org>
>>>>>>>> CC: Paul Mackerras <paulus@samba.org>
>>>>>>>> CC: Christoph Lameter <cl@linux.com>
>>>>>>>> Cc: Minchan Kim <minchan.kim@gmail.com>
>>>>>>>> CC: Andrew Morton <akpm@linux-foundation.org>
>>>>>>>> CC: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
>>>>>>>> Signed-off-by: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>
>>>>>>>>
>>>>>>>> ---
>>>>>>>>      drivers/firmware/memmap.c    |   70 +++++++++++++++++++++++++++++++++++++++++++
>>>>>>>>      include/linux/firmware-map.h |    6 +++
>>>>>>>>      mm/memory_hotplug.c          |    6 +++
>>>>>>>>      3 files changed, 81 insertions(+), 1 deletion(-)
>>>>>>>>
>>>>>>>> Index: linux-3.5-rc4/mm/memory_hotplug.c
>>>>>>>> ===================================================================
>>>>>>>> --- linux-3.5-rc4.orig/mm/memory_hotplug.c	2012-07-03 14:22:00.190240794 +0900
>>>>>>>> +++ linux-3.5-rc4/mm/memory_hotplug.c	2012-07-03 14:22:03.549198802 +0900
>>>>>>>> @@ -661,7 +661,11 @@ EXPORT_SYMBOL_GPL(add_memory);
>>>>>>>>
>>>>>>>>      int remove_memory(int nid, u64 start, u64 size)
>>>>>>>>      {
>>>>>>>> -	return -EBUSY;
>>>>>>>> +	lock_memory_hotplug();
>>>>>>>> +	/* remove memmap entry */
>>>>>>>> +	firmware_map_remove(start, start + size - 1, "System RAM");
>>>>>>>> +	unlock_memory_hotplug();
>>>>>>>> +	return 0;
>>>>>>>>
>>>>>>>>      }
>>>>>>>>      EXPORT_SYMBOL_GPL(remove_memory);
>>>>>>>> Index: linux-3.5-rc4/include/linux/firmware-map.h
>>>>>>>> ===================================================================
>>>>>>>> --- linux-3.5-rc4.orig/include/linux/firmware-map.h	2012-07-03 14:21:45.766421116 +0900
>>>>>>>> +++ linux-3.5-rc4/include/linux/firmware-map.h	2012-07-03 14:22:03.550198789 +0900
>>>>>>>> @@ -25,6 +25,7 @@
>>>>>>>>
>>>>>>>>      int firmware_map_add_early(u64 start, u64 end, const char *type);
>>>>>>>>      int firmware_map_add_hotplug(u64 start, u64 end, const char *type);
>>>>>>>> +int firmware_map_remove(u64 start, u64 end, const char *type);
>>>>>>>>
>>>>>>>>      #else /* CONFIG_FIRMWARE_MEMMAP */
>>>>>>>>
>>>>>>>> @@ -38,6 +39,11 @@ static inline int firmware_map_add_hotpl
>>>>>>>>      	return 0;
>>>>>>>>      }
>>>>>>>>
>>>>>>>> +static inline int firmware_map_remove(u64 start, u64 end, const char *type)
>>>>>>>> +{
>>>>>>>> +	return 0;
>>>>>>>> +}
>>>>>>>> +
>>>>>>>>      #endif /* CONFIG_FIRMWARE_MEMMAP */
>>>>>>>>
>>>>>>>>      #endif /* _LINUX_FIRMWARE_MAP_H */
>>>>>>>> Index: linux-3.5-rc4/drivers/firmware/memmap.c
>>>>>>>> ===================================================================
>>>>>>>> --- linux-3.5-rc4.orig/drivers/firmware/memmap.c	2012-07-03 14:21:45.761421180 +0900
>>>>>>>> +++ linux-3.5-rc4/drivers/firmware/memmap.c	2012-07-03 14:22:03.569198549 +0900
>>>>>>>> @@ -79,7 +79,16 @@ static const struct sysfs_ops memmap_att
>>>>>>>>      	.show = memmap_attr_show,
>>>>>>>>      };
>>>>>>>>
>>>>>>>> +static void release_firmware_map_entry(struct kobject *kobj)
>>>>>>>> +{
>>>>>>>> +	/*
>>>>>>>> +	 * FIXME : There is no idea.
>>>>>>>> +	 *         How to free the entry which allocated bootmem?
>>>>>>>> +	 */
>>>>>>>
>>>>>>> I find a function free_bootmem(), but I am not sure whether it can work here.
>>>>>>
>>>>>> It cannot work here.
>>>>>>
>>>>>>> Another problem: how to check whether the entry uses bootmem?
>>>>>>
>>>>>> When firmware_map_entry is allocated by kzalloc(), the page has PG_slab.
>>>>>
>>>>> This is not true. In my test, I find the page does not have PG_slab sometimes.
>>>>
>>>> I think that it depends on the allocated size. firmware_map_entry size is
>>>> smaller than PAGE_SIZE. So the page has PG_Slab.
>>>
>>> In my test, I add printk in the function firmware_map_add_hotplug() to display
>>> page's flags. And sometimes the page is not allocated by slab(I use PageSlab()
>>> to verify it).
>>
>> How did you check it? Could you send your debug patch?
> 
> When the memory is not allocated from slab, the flags is 0x10000000008000.

Thank you for sending the patch.
I think the page to not have PageSlab is a compound page. So we can check
whether the entry is allocate from bootmem or not as follow:

static void release_firmware_map_entry(struct kobject *kobj)
{
	struct firmware_map_entry *entry = to_memmap_entry(kobj);
	struct page *head_page;

	head_page = virt_to_head_page(entry);
	if (PageSlab(head_page))
		kfree(etnry);
	else
		/* the entry is allocated from bootmem */
}

Thanks,
Yasuaki Ishimatsu

> 
>  From 8dd51368d6c03edf7edc89cab17441e3741c39c7 Mon Sep 17 00:00:00 2001
> From: Wen Congyang <wency@cn.fujitsu.com>
> Date: Wed, 4 Jul 2012 16:05:26 +0800
> Subject: [PATCH] debug
> 
> ---
>   drivers/firmware/memmap.c |    7 +++++++
>   1 files changed, 7 insertions(+), 0 deletions(-)
> 
> diff --git a/drivers/firmware/memmap.c b/drivers/firmware/memmap.c
> index adc0710..993ba3f 100644
> --- a/drivers/firmware/memmap.c
> +++ b/drivers/firmware/memmap.c
> @@ -21,6 +21,7 @@
>   #include <linux/types.h>
>   #include <linux/bootmem.h>
>   #include <linux/slab.h>
> +#include <linux/mm.h>
>   
>   /*
>    * Data types ------------------------------------------------------------------
> @@ -160,11 +161,17 @@ static int add_sysfs_fw_map_entry(struct firmware_map_entry *entry)
>   int __meminit firmware_map_add_hotplug(u64 start, u64 end, const char *type)
>   {
>   	struct firmware_map_entry *entry;
> +	struct page *entry_page;
>   
>   	entry = kzalloc(sizeof(struct firmware_map_entry), GFP_ATOMIC);
>   	if (!entry)
>   		return -ENOMEM;
>   
> +	entry_page = virt_to_page(entry);
> +	printk(KERN_WARNING "flags: %lx\n", entry_page->flags);
> +	if (PageSlab(entry_page)) {
> +		printk(KERN_WARNING "page is allocated from slab\n");
> +	}
>   	firmware_map_add_entry(start, end, type, entry);
>   	/* create the memmap entry */
>   	add_sysfs_fw_map_entry(entry);
> 




WARNING: multiple messages have this Message-ID (diff)
From: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>
To: Wen Congyang <wency@cn.fujitsu.com>
Cc: len.brown@intel.com, linux-acpi@vger.kernel.org,
	linux-kernel@vger.kernel.org, linux-mm@kvack.org,
	paulus@samba.org, minchan.kim@gmail.com,
	kosaki.motohiro@jp.fujitsu.com, rientjes@google.com,
	cl@linux.com, linuxppc-dev@lists.ozlabs.org,
	akpm@linux-foundation.org, liuj97@gmail.com
Subject: Re: [RFC PATCH v2 4/13] memory-hotplug : remove /sys/firmware/memmap/X sysfs
Date: Mon, 9 Jul 2012 17:18:35 +0900	[thread overview]
Message-ID: <4FFA93DB.6010403@jp.fujitsu.com> (raw)
In-Reply-To: <4FF6ADD9.7040600@cn.fujitsu.com>

Hi Wen,

2012/07/06 18:20, Wen Congyang wrote:
> At 07/06/2012 04:27 PM, Yasuaki Ishimatsu Wrote:
>> Hi Wen,
>>
>> 2012/07/04 19:01, Wen Congyang wrote:
>>> At 07/04/2012 01:52 PM, Yasuaki Ishimatsu Wrote:
>>>> Hi Wen,
>>>>
>>>> 2012/07/04 14:08, Wen Congyang wrote:
>>>>> At 07/04/2012 12:45 PM, Yasuaki Ishimatsu Wrote:
>>>>>> Hi Wen,
>>>>>>
>>>>>> 2012/07/03 15:35, Wen Congyang wrote:
>>>>>>> At 07/03/2012 01:56 PM, Yasuaki Ishimatsu Wrote:
>>>>>>>> When (hot)adding memory into system, /sys/firmware/memmap/X/{end, start, type}
>>>>>>>> sysfs files are created. But there is no code to remove these files. The patch
>>>>>>>> implements the function to remove them.
>>>>>>>>
>>>>>>>> Note : The code does not free firmware_map_entry since there is no way to free
>>>>>>>>            memory which is allocated by bootmem.
>>>>>>>>
>>>>>>>> CC: David Rientjes <rientjes@google.com>
>>>>>>>> CC: Jiang Liu <liuj97@gmail.com>
>>>>>>>> CC: Len Brown <len.brown@intel.com>
>>>>>>>> CC: Benjamin Herrenschmidt <benh@kernel.crashing.org>
>>>>>>>> CC: Paul Mackerras <paulus@samba.org>
>>>>>>>> CC: Christoph Lameter <cl@linux.com>
>>>>>>>> Cc: Minchan Kim <minchan.kim@gmail.com>
>>>>>>>> CC: Andrew Morton <akpm@linux-foundation.org>
>>>>>>>> CC: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
>>>>>>>> Signed-off-by: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>
>>>>>>>>
>>>>>>>> ---
>>>>>>>>      drivers/firmware/memmap.c    |   70 +++++++++++++++++++++++++++++++++++++++++++
>>>>>>>>      include/linux/firmware-map.h |    6 +++
>>>>>>>>      mm/memory_hotplug.c          |    6 +++
>>>>>>>>      3 files changed, 81 insertions(+), 1 deletion(-)
>>>>>>>>
>>>>>>>> Index: linux-3.5-rc4/mm/memory_hotplug.c
>>>>>>>> ===================================================================
>>>>>>>> --- linux-3.5-rc4.orig/mm/memory_hotplug.c	2012-07-03 14:22:00.190240794 +0900
>>>>>>>> +++ linux-3.5-rc4/mm/memory_hotplug.c	2012-07-03 14:22:03.549198802 +0900
>>>>>>>> @@ -661,7 +661,11 @@ EXPORT_SYMBOL_GPL(add_memory);
>>>>>>>>
>>>>>>>>      int remove_memory(int nid, u64 start, u64 size)
>>>>>>>>      {
>>>>>>>> -	return -EBUSY;
>>>>>>>> +	lock_memory_hotplug();
>>>>>>>> +	/* remove memmap entry */
>>>>>>>> +	firmware_map_remove(start, start + size - 1, "System RAM");
>>>>>>>> +	unlock_memory_hotplug();
>>>>>>>> +	return 0;
>>>>>>>>
>>>>>>>>      }
>>>>>>>>      EXPORT_SYMBOL_GPL(remove_memory);
>>>>>>>> Index: linux-3.5-rc4/include/linux/firmware-map.h
>>>>>>>> ===================================================================
>>>>>>>> --- linux-3.5-rc4.orig/include/linux/firmware-map.h	2012-07-03 14:21:45.766421116 +0900
>>>>>>>> +++ linux-3.5-rc4/include/linux/firmware-map.h	2012-07-03 14:22:03.550198789 +0900
>>>>>>>> @@ -25,6 +25,7 @@
>>>>>>>>
>>>>>>>>      int firmware_map_add_early(u64 start, u64 end, const char *type);
>>>>>>>>      int firmware_map_add_hotplug(u64 start, u64 end, const char *type);
>>>>>>>> +int firmware_map_remove(u64 start, u64 end, const char *type);
>>>>>>>>
>>>>>>>>      #else /* CONFIG_FIRMWARE_MEMMAP */
>>>>>>>>
>>>>>>>> @@ -38,6 +39,11 @@ static inline int firmware_map_add_hotpl
>>>>>>>>      	return 0;
>>>>>>>>      }
>>>>>>>>
>>>>>>>> +static inline int firmware_map_remove(u64 start, u64 end, const char *type)
>>>>>>>> +{
>>>>>>>> +	return 0;
>>>>>>>> +}
>>>>>>>> +
>>>>>>>>      #endif /* CONFIG_FIRMWARE_MEMMAP */
>>>>>>>>
>>>>>>>>      #endif /* _LINUX_FIRMWARE_MAP_H */
>>>>>>>> Index: linux-3.5-rc4/drivers/firmware/memmap.c
>>>>>>>> ===================================================================
>>>>>>>> --- linux-3.5-rc4.orig/drivers/firmware/memmap.c	2012-07-03 14:21:45.761421180 +0900
>>>>>>>> +++ linux-3.5-rc4/drivers/firmware/memmap.c	2012-07-03 14:22:03.569198549 +0900
>>>>>>>> @@ -79,7 +79,16 @@ static const struct sysfs_ops memmap_att
>>>>>>>>      	.show = memmap_attr_show,
>>>>>>>>      };
>>>>>>>>
>>>>>>>> +static void release_firmware_map_entry(struct kobject *kobj)
>>>>>>>> +{
>>>>>>>> +	/*
>>>>>>>> +	 * FIXME : There is no idea.
>>>>>>>> +	 *         How to free the entry which allocated bootmem?
>>>>>>>> +	 */
>>>>>>>
>>>>>>> I find a function free_bootmem(), but I am not sure whether it can work here.
>>>>>>
>>>>>> It cannot work here.
>>>>>>
>>>>>>> Another problem: how to check whether the entry uses bootmem?
>>>>>>
>>>>>> When firmware_map_entry is allocated by kzalloc(), the page has PG_slab.
>>>>>
>>>>> This is not true. In my test, I find the page does not have PG_slab sometimes.
>>>>
>>>> I think that it depends on the allocated size. firmware_map_entry size is
>>>> smaller than PAGE_SIZE. So the page has PG_Slab.
>>>
>>> In my test, I add printk in the function firmware_map_add_hotplug() to display
>>> page's flags. And sometimes the page is not allocated by slab(I use PageSlab()
>>> to verify it).
>>
>> How did you check it? Could you send your debug patch?
> 
> When the memory is not allocated from slab, the flags is 0x10000000008000.

Thank you for sending the patch.
I think the page to not have PageSlab is a compound page. So we can check
whether the entry is allocate from bootmem or not as follow:

static void release_firmware_map_entry(struct kobject *kobj)
{
	struct firmware_map_entry *entry = to_memmap_entry(kobj);
	struct page *head_page;

	head_page = virt_to_head_page(entry);
	if (PageSlab(head_page))
		kfree(etnry);
	else
		/* the entry is allocated from bootmem */
}

Thanks,
Yasuaki Ishimatsu

> 
>  From 8dd51368d6c03edf7edc89cab17441e3741c39c7 Mon Sep 17 00:00:00 2001
> From: Wen Congyang <wency@cn.fujitsu.com>
> Date: Wed, 4 Jul 2012 16:05:26 +0800
> Subject: [PATCH] debug
> 
> ---
>   drivers/firmware/memmap.c |    7 +++++++
>   1 files changed, 7 insertions(+), 0 deletions(-)
> 
> diff --git a/drivers/firmware/memmap.c b/drivers/firmware/memmap.c
> index adc0710..993ba3f 100644
> --- a/drivers/firmware/memmap.c
> +++ b/drivers/firmware/memmap.c
> @@ -21,6 +21,7 @@
>   #include <linux/types.h>
>   #include <linux/bootmem.h>
>   #include <linux/slab.h>
> +#include <linux/mm.h>
>   
>   /*
>    * Data types ------------------------------------------------------------------
> @@ -160,11 +161,17 @@ static int add_sysfs_fw_map_entry(struct firmware_map_entry *entry)
>   int __meminit firmware_map_add_hotplug(u64 start, u64 end, const char *type)
>   {
>   	struct firmware_map_entry *entry;
> +	struct page *entry_page;
>   
>   	entry = kzalloc(sizeof(struct firmware_map_entry), GFP_ATOMIC);
>   	if (!entry)
>   		return -ENOMEM;
>   
> +	entry_page = virt_to_page(entry);
> +	printk(KERN_WARNING "flags: %lx\n", entry_page->flags);
> +	if (PageSlab(entry_page)) {
> +		printk(KERN_WARNING "page is allocated from slab\n");
> +	}
>   	firmware_map_add_entry(start, end, type, entry);
>   	/* create the memmap entry */
>   	add_sysfs_fw_map_entry(entry);
> 

WARNING: multiple messages have this Message-ID (diff)
From: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>
To: Wen Congyang <wency@cn.fujitsu.com>
Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org,
	linuxppc-dev@lists.ozlabs.org, linux-acpi@vger.kernel.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, akpm@linux-foundation.org,
	kosaki.motohiro@jp.fujitsu.com
Subject: Re: [RFC PATCH v2 4/13] memory-hotplug : remove /sys/firmware/memmap/X sysfs
Date: Mon, 9 Jul 2012 17:18:35 +0900	[thread overview]
Message-ID: <4FFA93DB.6010403@jp.fujitsu.com> (raw)
In-Reply-To: <4FF6ADD9.7040600@cn.fujitsu.com>

Hi Wen,

2012/07/06 18:20, Wen Congyang wrote:
> At 07/06/2012 04:27 PM, Yasuaki Ishimatsu Wrote:
>> Hi Wen,
>>
>> 2012/07/04 19:01, Wen Congyang wrote:
>>> At 07/04/2012 01:52 PM, Yasuaki Ishimatsu Wrote:
>>>> Hi Wen,
>>>>
>>>> 2012/07/04 14:08, Wen Congyang wrote:
>>>>> At 07/04/2012 12:45 PM, Yasuaki Ishimatsu Wrote:
>>>>>> Hi Wen,
>>>>>>
>>>>>> 2012/07/03 15:35, Wen Congyang wrote:
>>>>>>> At 07/03/2012 01:56 PM, Yasuaki Ishimatsu Wrote:
>>>>>>>> When (hot)adding memory into system, /sys/firmware/memmap/X/{end, start, type}
>>>>>>>> sysfs files are created. But there is no code to remove these files. The patch
>>>>>>>> implements the function to remove them.
>>>>>>>>
>>>>>>>> Note : The code does not free firmware_map_entry since there is no way to free
>>>>>>>>            memory which is allocated by bootmem.
>>>>>>>>
>>>>>>>> CC: David Rientjes <rientjes@google.com>
>>>>>>>> CC: Jiang Liu <liuj97@gmail.com>
>>>>>>>> CC: Len Brown <len.brown@intel.com>
>>>>>>>> CC: Benjamin Herrenschmidt <benh@kernel.crashing.org>
>>>>>>>> CC: Paul Mackerras <paulus@samba.org>
>>>>>>>> CC: Christoph Lameter <cl@linux.com>
>>>>>>>> Cc: Minchan Kim <minchan.kim@gmail.com>
>>>>>>>> CC: Andrew Morton <akpm@linux-foundation.org>
>>>>>>>> CC: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
>>>>>>>> Signed-off-by: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>
>>>>>>>>
>>>>>>>> ---
>>>>>>>>      drivers/firmware/memmap.c    |   70 +++++++++++++++++++++++++++++++++++++++++++
>>>>>>>>      include/linux/firmware-map.h |    6 +++
>>>>>>>>      mm/memory_hotplug.c          |    6 +++
>>>>>>>>      3 files changed, 81 insertions(+), 1 deletion(-)
>>>>>>>>
>>>>>>>> Index: linux-3.5-rc4/mm/memory_hotplug.c
>>>>>>>> ===================================================================
>>>>>>>> --- linux-3.5-rc4.orig/mm/memory_hotplug.c	2012-07-03 14:22:00.190240794 +0900
>>>>>>>> +++ linux-3.5-rc4/mm/memory_hotplug.c	2012-07-03 14:22:03.549198802 +0900
>>>>>>>> @@ -661,7 +661,11 @@ EXPORT_SYMBOL_GPL(add_memory);
>>>>>>>>
>>>>>>>>      int remove_memory(int nid, u64 start, u64 size)
>>>>>>>>      {
>>>>>>>> -	return -EBUSY;
>>>>>>>> +	lock_memory_hotplug();
>>>>>>>> +	/* remove memmap entry */
>>>>>>>> +	firmware_map_remove(start, start + size - 1, "System RAM");
>>>>>>>> +	unlock_memory_hotplug();
>>>>>>>> +	return 0;
>>>>>>>>
>>>>>>>>      }
>>>>>>>>      EXPORT_SYMBOL_GPL(remove_memory);
>>>>>>>> Index: linux-3.5-rc4/include/linux/firmware-map.h
>>>>>>>> ===================================================================
>>>>>>>> --- linux-3.5-rc4.orig/include/linux/firmware-map.h	2012-07-03 14:21:45.766421116 +0900
>>>>>>>> +++ linux-3.5-rc4/include/linux/firmware-map.h	2012-07-03 14:22:03.550198789 +0900
>>>>>>>> @@ -25,6 +25,7 @@
>>>>>>>>
>>>>>>>>      int firmware_map_add_early(u64 start, u64 end, const char *type);
>>>>>>>>      int firmware_map_add_hotplug(u64 start, u64 end, const char *type);
>>>>>>>> +int firmware_map_remove(u64 start, u64 end, const char *type);
>>>>>>>>
>>>>>>>>      #else /* CONFIG_FIRMWARE_MEMMAP */
>>>>>>>>
>>>>>>>> @@ -38,6 +39,11 @@ static inline int firmware_map_add_hotpl
>>>>>>>>      	return 0;
>>>>>>>>      }
>>>>>>>>
>>>>>>>> +static inline int firmware_map_remove(u64 start, u64 end, const char *type)
>>>>>>>> +{
>>>>>>>> +	return 0;
>>>>>>>> +}
>>>>>>>> +
>>>>>>>>      #endif /* CONFIG_FIRMWARE_MEMMAP */
>>>>>>>>
>>>>>>>>      #endif /* _LINUX_FIRMWARE_MAP_H */
>>>>>>>> Index: linux-3.5-rc4/drivers/firmware/memmap.c
>>>>>>>> ===================================================================
>>>>>>>> --- linux-3.5-rc4.orig/drivers/firmware/memmap.c	2012-07-03 14:21:45.761421180 +0900
>>>>>>>> +++ linux-3.5-rc4/drivers/firmware/memmap.c	2012-07-03 14:22:03.569198549 +0900
>>>>>>>> @@ -79,7 +79,16 @@ static const struct sysfs_ops memmap_att
>>>>>>>>      	.show = memmap_attr_show,
>>>>>>>>      };
>>>>>>>>
>>>>>>>> +static void release_firmware_map_entry(struct kobject *kobj)
>>>>>>>> +{
>>>>>>>> +	/*
>>>>>>>> +	 * FIXME : There is no idea.
>>>>>>>> +	 *         How to free the entry which allocated bootmem?
>>>>>>>> +	 */
>>>>>>>
>>>>>>> I find a function free_bootmem(), but I am not sure whether it can work here.
>>>>>>
>>>>>> It cannot work here.
>>>>>>
>>>>>>> Another problem: how to check whether the entry uses bootmem?
>>>>>>
>>>>>> When firmware_map_entry is allocated by kzalloc(), the page has PG_slab.
>>>>>
>>>>> This is not true. In my test, I find the page does not have PG_slab sometimes.
>>>>
>>>> I think that it depends on the allocated size. firmware_map_entry size is
>>>> smaller than PAGE_SIZE. So the page has PG_Slab.
>>>
>>> In my test, I add printk in the function firmware_map_add_hotplug() to display
>>> page's flags. And sometimes the page is not allocated by slab(I use PageSlab()
>>> to verify it).
>>
>> How did you check it? Could you send your debug patch?
> 
> When the memory is not allocated from slab, the flags is 0x10000000008000.

Thank you for sending the patch.
I think the page to not have PageSlab is a compound page. So we can check
whether the entry is allocate from bootmem or not as follow:

static void release_firmware_map_entry(struct kobject *kobj)
{
	struct firmware_map_entry *entry = to_memmap_entry(kobj);
	struct page *head_page;

	head_page = virt_to_head_page(entry);
	if (PageSlab(head_page))
		kfree(etnry);
	else
		/* the entry is allocated from bootmem */
}

Thanks,
Yasuaki Ishimatsu

> 
>  From 8dd51368d6c03edf7edc89cab17441e3741c39c7 Mon Sep 17 00:00:00 2001
> From: Wen Congyang <wency@cn.fujitsu.com>
> Date: Wed, 4 Jul 2012 16:05:26 +0800
> Subject: [PATCH] debug
> 
> ---
>   drivers/firmware/memmap.c |    7 +++++++
>   1 files changed, 7 insertions(+), 0 deletions(-)
> 
> diff --git a/drivers/firmware/memmap.c b/drivers/firmware/memmap.c
> index adc0710..993ba3f 100644
> --- a/drivers/firmware/memmap.c
> +++ b/drivers/firmware/memmap.c
> @@ -21,6 +21,7 @@
>   #include <linux/types.h>
>   #include <linux/bootmem.h>
>   #include <linux/slab.h>
> +#include <linux/mm.h>
>   
>   /*
>    * Data types ------------------------------------------------------------------
> @@ -160,11 +161,17 @@ static int add_sysfs_fw_map_entry(struct firmware_map_entry *entry)
>   int __meminit firmware_map_add_hotplug(u64 start, u64 end, const char *type)
>   {
>   	struct firmware_map_entry *entry;
> +	struct page *entry_page;
>   
>   	entry = kzalloc(sizeof(struct firmware_map_entry), GFP_ATOMIC);
>   	if (!entry)
>   		return -ENOMEM;
>   
> +	entry_page = virt_to_page(entry);
> +	printk(KERN_WARNING "flags: %lx\n", entry_page->flags);
> +	if (PageSlab(entry_page)) {
> +		printk(KERN_WARNING "page is allocated from slab\n");
> +	}
>   	firmware_map_add_entry(start, end, type, entry);
>   	/* create the memmap entry */
>   	add_sysfs_fw_map_entry(entry);
> 



--
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: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>
To: Wen Congyang <wency@cn.fujitsu.com>
Cc: <linux-mm@kvack.org>, <linux-kernel@vger.kernel.org>,
	<linuxppc-dev@lists.ozlabs.org>, <linux-acpi@vger.kernel.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>, <akpm@linux-foundation.org>,
	<kosaki.motohiro@jp.fujitsu.com>
Subject: Re: [RFC PATCH v2 4/13] memory-hotplug : remove /sys/firmware/memmap/X sysfs
Date: Mon, 9 Jul 2012 17:18:35 +0900	[thread overview]
Message-ID: <4FFA93DB.6010403@jp.fujitsu.com> (raw)
In-Reply-To: <4FF6ADD9.7040600@cn.fujitsu.com>

Hi Wen,

2012/07/06 18:20, Wen Congyang wrote:
> At 07/06/2012 04:27 PM, Yasuaki Ishimatsu Wrote:
>> Hi Wen,
>>
>> 2012/07/04 19:01, Wen Congyang wrote:
>>> At 07/04/2012 01:52 PM, Yasuaki Ishimatsu Wrote:
>>>> Hi Wen,
>>>>
>>>> 2012/07/04 14:08, Wen Congyang wrote:
>>>>> At 07/04/2012 12:45 PM, Yasuaki Ishimatsu Wrote:
>>>>>> Hi Wen,
>>>>>>
>>>>>> 2012/07/03 15:35, Wen Congyang wrote:
>>>>>>> At 07/03/2012 01:56 PM, Yasuaki Ishimatsu Wrote:
>>>>>>>> When (hot)adding memory into system, /sys/firmware/memmap/X/{end, start, type}
>>>>>>>> sysfs files are created. But there is no code to remove these files. The patch
>>>>>>>> implements the function to remove them.
>>>>>>>>
>>>>>>>> Note : The code does not free firmware_map_entry since there is no way to free
>>>>>>>>            memory which is allocated by bootmem.
>>>>>>>>
>>>>>>>> CC: David Rientjes <rientjes@google.com>
>>>>>>>> CC: Jiang Liu <liuj97@gmail.com>
>>>>>>>> CC: Len Brown <len.brown@intel.com>
>>>>>>>> CC: Benjamin Herrenschmidt <benh@kernel.crashing.org>
>>>>>>>> CC: Paul Mackerras <paulus@samba.org>
>>>>>>>> CC: Christoph Lameter <cl@linux.com>
>>>>>>>> Cc: Minchan Kim <minchan.kim@gmail.com>
>>>>>>>> CC: Andrew Morton <akpm@linux-foundation.org>
>>>>>>>> CC: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
>>>>>>>> Signed-off-by: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>
>>>>>>>>
>>>>>>>> ---
>>>>>>>>      drivers/firmware/memmap.c    |   70 +++++++++++++++++++++++++++++++++++++++++++
>>>>>>>>      include/linux/firmware-map.h |    6 +++
>>>>>>>>      mm/memory_hotplug.c          |    6 +++
>>>>>>>>      3 files changed, 81 insertions(+), 1 deletion(-)
>>>>>>>>
>>>>>>>> Index: linux-3.5-rc4/mm/memory_hotplug.c
>>>>>>>> ===================================================================
>>>>>>>> --- linux-3.5-rc4.orig/mm/memory_hotplug.c	2012-07-03 14:22:00.190240794 +0900
>>>>>>>> +++ linux-3.5-rc4/mm/memory_hotplug.c	2012-07-03 14:22:03.549198802 +0900
>>>>>>>> @@ -661,7 +661,11 @@ EXPORT_SYMBOL_GPL(add_memory);
>>>>>>>>
>>>>>>>>      int remove_memory(int nid, u64 start, u64 size)
>>>>>>>>      {
>>>>>>>> -	return -EBUSY;
>>>>>>>> +	lock_memory_hotplug();
>>>>>>>> +	/* remove memmap entry */
>>>>>>>> +	firmware_map_remove(start, start + size - 1, "System RAM");
>>>>>>>> +	unlock_memory_hotplug();
>>>>>>>> +	return 0;
>>>>>>>>
>>>>>>>>      }
>>>>>>>>      EXPORT_SYMBOL_GPL(remove_memory);
>>>>>>>> Index: linux-3.5-rc4/include/linux/firmware-map.h
>>>>>>>> ===================================================================
>>>>>>>> --- linux-3.5-rc4.orig/include/linux/firmware-map.h	2012-07-03 14:21:45.766421116 +0900
>>>>>>>> +++ linux-3.5-rc4/include/linux/firmware-map.h	2012-07-03 14:22:03.550198789 +0900
>>>>>>>> @@ -25,6 +25,7 @@
>>>>>>>>
>>>>>>>>      int firmware_map_add_early(u64 start, u64 end, const char *type);
>>>>>>>>      int firmware_map_add_hotplug(u64 start, u64 end, const char *type);
>>>>>>>> +int firmware_map_remove(u64 start, u64 end, const char *type);
>>>>>>>>
>>>>>>>>      #else /* CONFIG_FIRMWARE_MEMMAP */
>>>>>>>>
>>>>>>>> @@ -38,6 +39,11 @@ static inline int firmware_map_add_hotpl
>>>>>>>>      	return 0;
>>>>>>>>      }
>>>>>>>>
>>>>>>>> +static inline int firmware_map_remove(u64 start, u64 end, const char *type)
>>>>>>>> +{
>>>>>>>> +	return 0;
>>>>>>>> +}
>>>>>>>> +
>>>>>>>>      #endif /* CONFIG_FIRMWARE_MEMMAP */
>>>>>>>>
>>>>>>>>      #endif /* _LINUX_FIRMWARE_MAP_H */
>>>>>>>> Index: linux-3.5-rc4/drivers/firmware/memmap.c
>>>>>>>> ===================================================================
>>>>>>>> --- linux-3.5-rc4.orig/drivers/firmware/memmap.c	2012-07-03 14:21:45.761421180 +0900
>>>>>>>> +++ linux-3.5-rc4/drivers/firmware/memmap.c	2012-07-03 14:22:03.569198549 +0900
>>>>>>>> @@ -79,7 +79,16 @@ static const struct sysfs_ops memmap_att
>>>>>>>>      	.show = memmap_attr_show,
>>>>>>>>      };
>>>>>>>>
>>>>>>>> +static void release_firmware_map_entry(struct kobject *kobj)
>>>>>>>> +{
>>>>>>>> +	/*
>>>>>>>> +	 * FIXME : There is no idea.
>>>>>>>> +	 *         How to free the entry which allocated bootmem?
>>>>>>>> +	 */
>>>>>>>
>>>>>>> I find a function free_bootmem(), but I am not sure whether it can work here.
>>>>>>
>>>>>> It cannot work here.
>>>>>>
>>>>>>> Another problem: how to check whether the entry uses bootmem?
>>>>>>
>>>>>> When firmware_map_entry is allocated by kzalloc(), the page has PG_slab.
>>>>>
>>>>> This is not true. In my test, I find the page does not have PG_slab sometimes.
>>>>
>>>> I think that it depends on the allocated size. firmware_map_entry size is
>>>> smaller than PAGE_SIZE. So the page has PG_Slab.
>>>
>>> In my test, I add printk in the function firmware_map_add_hotplug() to display
>>> page's flags. And sometimes the page is not allocated by slab(I use PageSlab()
>>> to verify it).
>>
>> How did you check it? Could you send your debug patch?
> 
> When the memory is not allocated from slab, the flags is 0x10000000008000.

Thank you for sending the patch.
I think the page to not have PageSlab is a compound page. So we can check
whether the entry is allocate from bootmem or not as follow:

static void release_firmware_map_entry(struct kobject *kobj)
{
	struct firmware_map_entry *entry = to_memmap_entry(kobj);
	struct page *head_page;

	head_page = virt_to_head_page(entry);
	if (PageSlab(head_page))
		kfree(etnry);
	else
		/* the entry is allocated from bootmem */
}

Thanks,
Yasuaki Ishimatsu

> 
>  From 8dd51368d6c03edf7edc89cab17441e3741c39c7 Mon Sep 17 00:00:00 2001
> From: Wen Congyang <wency@cn.fujitsu.com>
> Date: Wed, 4 Jul 2012 16:05:26 +0800
> Subject: [PATCH] debug
> 
> ---
>   drivers/firmware/memmap.c |    7 +++++++
>   1 files changed, 7 insertions(+), 0 deletions(-)
> 
> diff --git a/drivers/firmware/memmap.c b/drivers/firmware/memmap.c
> index adc0710..993ba3f 100644
> --- a/drivers/firmware/memmap.c
> +++ b/drivers/firmware/memmap.c
> @@ -21,6 +21,7 @@
>   #include <linux/types.h>
>   #include <linux/bootmem.h>
>   #include <linux/slab.h>
> +#include <linux/mm.h>
>   
>   /*
>    * Data types ------------------------------------------------------------------
> @@ -160,11 +161,17 @@ static int add_sysfs_fw_map_entry(struct firmware_map_entry *entry)
>   int __meminit firmware_map_add_hotplug(u64 start, u64 end, const char *type)
>   {
>   	struct firmware_map_entry *entry;
> +	struct page *entry_page;
>   
>   	entry = kzalloc(sizeof(struct firmware_map_entry), GFP_ATOMIC);
>   	if (!entry)
>   		return -ENOMEM;
>   
> +	entry_page = virt_to_page(entry);
> +	printk(KERN_WARNING "flags: %lx\n", entry_page->flags);
> +	if (PageSlab(entry_page)) {
> +		printk(KERN_WARNING "page is allocated from slab\n");
> +	}
>   	firmware_map_add_entry(start, end, type, entry);
>   	/* create the memmap entry */
>   	add_sysfs_fw_map_entry(entry);
> 




  reply	other threads:[~2012-07-09  8:19 UTC|newest]

Thread overview: 86+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-07-03  5:48 [RFC PATCH v2 0/13] memory-hotplug : hot-remove physical memory Yasuaki Ishimatsu
2012-07-03  5:48 ` Yasuaki Ishimatsu
2012-07-03  5:48 ` Yasuaki Ishimatsu
2012-07-03  5:52 ` [RFC PATCH v2 1/13] memory-hotplug : rename remove_memory to offline_memory Yasuaki Ishimatsu
2012-07-03  5:52   ` Yasuaki Ishimatsu
2012-07-03  5:52   ` Yasuaki Ishimatsu
2012-07-03  5:52   ` Yasuaki Ishimatsu
2012-07-03  5:54 ` [RFC PATCH v2 2/13] memory-hotplug : add physical memory hotplug code to acpi_memory_device_remove Yasuaki Ishimatsu
2012-07-03  5:54   ` Yasuaki Ishimatsu
2012-07-03  5:54   ` Yasuaki Ishimatsu
2012-07-03  5:54   ` Yasuaki Ishimatsu
2012-07-03  6:21   ` Wen Congyang
2012-07-03  6:21     ` Wen Congyang
2012-07-03  6:21     ` Wen Congyang
2012-07-03  7:40     ` Yasuaki Ishimatsu
2012-07-03  7:40       ` Yasuaki Ishimatsu
2012-07-03  7:40       ` Yasuaki Ishimatsu
2012-07-03  7:40       ` Yasuaki Ishimatsu
2012-07-03  7:49       ` Wen Congyang
2012-07-03  7:49         ` Wen Congyang
2012-07-03  7:49         ` Wen Congyang
2012-07-03  5:55 ` [RFC PATCH v2 3/13] unify argument of firmware_map_add_early/hotplug Yasuaki Ishimatsu
2012-07-03  5:55   ` Yasuaki Ishimatsu
2012-07-03  5:55   ` Yasuaki Ishimatsu
2012-07-03  5:55   ` Yasuaki Ishimatsu
2012-07-03  5:56 ` [RFC PATCH v2 4/13] memory-hotplug : remove /sys/firmware/memmap/X sysfs Yasuaki Ishimatsu
2012-07-03  5:56   ` Yasuaki Ishimatsu
2012-07-03  5:56   ` Yasuaki Ishimatsu
2012-07-03  6:35   ` Wen Congyang
2012-07-03  6:35     ` Wen Congyang
2012-07-03  6:35     ` Wen Congyang
2012-07-04  4:45     ` Yasuaki Ishimatsu
2012-07-04  4:45       ` Yasuaki Ishimatsu
2012-07-04  4:45       ` Yasuaki Ishimatsu
2012-07-04  5:08       ` Wen Congyang
2012-07-04  5:08         ` Wen Congyang
2012-07-04  5:08         ` Wen Congyang
2012-07-04  5:52         ` Yasuaki Ishimatsu
2012-07-04  5:52           ` Yasuaki Ishimatsu
2012-07-04  5:52           ` Yasuaki Ishimatsu
2012-07-04 10:01           ` Wen Congyang
2012-07-04 10:01             ` Wen Congyang
2012-07-04 10:01             ` Wen Congyang
2012-07-06  8:27             ` Yasuaki Ishimatsu
2012-07-06  8:27               ` Yasuaki Ishimatsu
2012-07-06  8:27               ` Yasuaki Ishimatsu
2012-07-06  9:20               ` Wen Congyang
2012-07-06  9:20                 ` Wen Congyang
2012-07-06  9:20                 ` Wen Congyang
2012-07-06  9:20                 ` Wen Congyang
2012-07-09  8:18                 ` Yasuaki Ishimatsu [this message]
2012-07-09  8:18                   ` Yasuaki Ishimatsu
2012-07-09  8:18                   ` Yasuaki Ishimatsu
2012-07-09  8:18                   ` Yasuaki Ishimatsu
2012-07-03  5:58 ` [RFC PATCH v2 5/13] memory-hotplug : does not release memory region in PAGES_PER_SECTION chunks Yasuaki Ishimatsu
2012-07-03  5:58   ` Yasuaki Ishimatsu
2012-07-03  5:58   ` Yasuaki Ishimatsu
2012-07-03  5:58   ` Yasuaki Ishimatsu
2012-07-03  5:59 ` [RFC PATCH v2 6/13] memory-hotplug : add memory_block_release Yasuaki Ishimatsu
2012-07-03  5:59   ` Yasuaki Ishimatsu
2012-07-03  5:59   ` Yasuaki Ishimatsu
2012-07-03  6:00 ` [RFC PATCH v2 7/13] memory-hotplug : remove_memory calls __remove_pages Yasuaki Ishimatsu
2012-07-03  6:00   ` Yasuaki Ishimatsu
2012-07-03  6:00   ` Yasuaki Ishimatsu
2012-07-03  6:00   ` Yasuaki Ishimatsu
2012-07-03  6:01 ` [RFC PATCH v2 8/13] memory-hotplug : check page type in get_page_bootmem Yasuaki Ishimatsu
2012-07-03  6:01   ` Yasuaki Ishimatsu
2012-07-03  6:01   ` Yasuaki Ishimatsu
2012-07-03  6:02 ` [RFC PATCH v2 9/13] memory-hotplug : move register_page_bootmem_info_node and put_page_bootmem for sparse-vmemmap Yasuaki Ishimatsu
2012-07-03  6:02   ` Yasuaki Ishimatsu
2012-07-03  6:02   ` Yasuaki Ishimatsu
2012-07-03  6:03 ` [RFC PATCH v2 10/13] memory-hotplug : implement register_page_bootmem_info_section of sparse-vmemmap Yasuaki Ishimatsu
2012-07-03  6:03   ` Yasuaki Ishimatsu
2012-07-03  6:03   ` Yasuaki Ishimatsu
2012-07-03  6:03   ` Yasuaki Ishimatsu
2012-07-03  6:04 ` [RFC PATCH v2 11/13] memory-hotplug : free memmap " Yasuaki Ishimatsu
2012-07-03  6:04   ` Yasuaki Ishimatsu
2012-07-03  6:04   ` Yasuaki Ishimatsu
2012-07-03  6:04   ` Yasuaki Ishimatsu
2012-07-03  6:05 ` [RFC PATCH v2 12/13] memory-hotplug : add node_device_release Yasuaki Ishimatsu
2012-07-03  6:05   ` Yasuaki Ishimatsu
2012-07-03  6:05   ` Yasuaki Ishimatsu
2012-07-03  6:05   ` Yasuaki Ishimatsu
2012-07-03  6:06 ` [RFC PATCH v2 13/13] memory-hotplug : remove sysfs file of node Yasuaki Ishimatsu
2012-07-03  6:06   ` Yasuaki Ishimatsu
2012-07-03  6:06   ` Yasuaki Ishimatsu

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=4FFA93DB.6010403@jp.fujitsu.com \
    --to=isimatu.yasuaki@jp.fujitsu.com \
    --cc=akpm@linux-foundation.org \
    --cc=benh@kernel.crashing.org \
    --cc=cl@linux.com \
    --cc=kosaki.motohiro@jp.fujitsu.com \
    --cc=len.brown@intel.com \
    --cc=linux-acpi@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=linuxppc-dev@lists.ozlabs.org \
    --cc=liuj97@gmail.com \
    --cc=minchan.kim@gmail.com \
    --cc=paulus@samba.org \
    --cc=rientjes@google.com \
    --cc=wency@cn.fujitsu.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.