forked from luck/tmp_suning_uos_patched
memory-hotplug: introduce new arch_remove_memory() for removing page table
For removing memory, we need to remove page tables. But it depends on architecture. So the patch introduce arch_remove_memory() for removing page table. Now it only calls __remove_pages(). Note: __remove_pages() for some archtecuture is not implemented (I don't know how to implement it for s390). Signed-off-by: Wen Congyang <wency@cn.fujitsu.com> Signed-off-by: Tang Chen <tangchen@cn.fujitsu.com> Acked-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com> Cc: Jiang Liu <jiang.liu@huawei.com> Cc: Jianguo Wu <wujianguo@huawei.com> Cc: Kamezawa Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Cc: Lai Jiangshan <laijs@cn.fujitsu.com> Cc: Wu Jianguo <wujianguo@huawei.com> Cc: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com> Cc: Ingo Molnar <mingo@elte.hu> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: "H. Peter Anvin" <hpa@zytor.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
46c66c4b7b
commit
24d335ca36
|
@ -688,6 +688,24 @@ int arch_add_memory(int nid, u64 start, u64 size)
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_MEMORY_HOTREMOVE
|
||||||
|
int arch_remove_memory(u64 start, u64 size)
|
||||||
|
{
|
||||||
|
unsigned long start_pfn = start >> PAGE_SHIFT;
|
||||||
|
unsigned long nr_pages = size >> PAGE_SHIFT;
|
||||||
|
struct zone *zone;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
zone = page_zone(pfn_to_page(start_pfn));
|
||||||
|
ret = __remove_pages(zone, start_pfn, nr_pages);
|
||||||
|
if (ret)
|
||||||
|
pr_warn("%s: Problem encountered in __remove_pages() as"
|
||||||
|
" ret=%d\n", __func__, ret);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -133,6 +133,18 @@ int arch_add_memory(int nid, u64 start, u64 size)
|
||||||
|
|
||||||
return __add_pages(nid, zone, start_pfn, nr_pages);
|
return __add_pages(nid, zone, start_pfn, nr_pages);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_MEMORY_HOTREMOVE
|
||||||
|
int arch_remove_memory(u64 start, u64 size)
|
||||||
|
{
|
||||||
|
unsigned long start_pfn = start >> PAGE_SHIFT;
|
||||||
|
unsigned long nr_pages = size >> PAGE_SHIFT;
|
||||||
|
struct zone *zone;
|
||||||
|
|
||||||
|
zone = page_zone(pfn_to_page(start_pfn));
|
||||||
|
return __remove_pages(zone, start_pfn, nr_pages);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
#endif /* CONFIG_MEMORY_HOTPLUG */
|
#endif /* CONFIG_MEMORY_HOTPLUG */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -228,4 +228,16 @@ int arch_add_memory(int nid, u64 start, u64 size)
|
||||||
vmem_remove_mapping(start, size);
|
vmem_remove_mapping(start, size);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_MEMORY_HOTREMOVE
|
||||||
|
int arch_remove_memory(u64 start, u64 size)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* There is no hardware or firmware interface which could trigger a
|
||||||
|
* hot memory remove on s390. So there is nothing that needs to be
|
||||||
|
* implemented.
|
||||||
|
*/
|
||||||
|
return -EBUSY;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
#endif /* CONFIG_MEMORY_HOTPLUG */
|
#endif /* CONFIG_MEMORY_HOTPLUG */
|
||||||
|
|
|
@ -558,4 +558,21 @@ int memory_add_physaddr_to_nid(u64 addr)
|
||||||
EXPORT_SYMBOL_GPL(memory_add_physaddr_to_nid);
|
EXPORT_SYMBOL_GPL(memory_add_physaddr_to_nid);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_MEMORY_HOTREMOVE
|
||||||
|
int arch_remove_memory(u64 start, u64 size)
|
||||||
|
{
|
||||||
|
unsigned long start_pfn = start >> PAGE_SHIFT;
|
||||||
|
unsigned long nr_pages = size >> PAGE_SHIFT;
|
||||||
|
struct zone *zone;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
zone = page_zone(pfn_to_page(start_pfn));
|
||||||
|
ret = __remove_pages(zone, start_pfn, nr_pages);
|
||||||
|
if (unlikely(ret))
|
||||||
|
pr_warn("%s: Failed, __remove_pages() == %d\n", __func__,
|
||||||
|
ret);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
#endif /* CONFIG_MEMORY_HOTPLUG */
|
#endif /* CONFIG_MEMORY_HOTPLUG */
|
||||||
|
|
|
@ -935,6 +935,14 @@ int remove_memory(u64 start, u64 size)
|
||||||
{
|
{
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_MEMORY_HOTREMOVE
|
||||||
|
int arch_remove_memory(u64 start, u64 size)
|
||||||
|
{
|
||||||
|
/* TODO */
|
||||||
|
return -EBUSY;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct kmem_cache *pgd_cache;
|
struct kmem_cache *pgd_cache;
|
||||||
|
|
|
@ -862,6 +862,18 @@ int arch_add_memory(int nid, u64 start, u64 size)
|
||||||
|
|
||||||
return __add_pages(nid, zone, start_pfn, nr_pages);
|
return __add_pages(nid, zone, start_pfn, nr_pages);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_MEMORY_HOTREMOVE
|
||||||
|
int arch_remove_memory(u64 start, u64 size)
|
||||||
|
{
|
||||||
|
unsigned long start_pfn = start >> PAGE_SHIFT;
|
||||||
|
unsigned long nr_pages = size >> PAGE_SHIFT;
|
||||||
|
struct zone *zone;
|
||||||
|
|
||||||
|
zone = page_zone(pfn_to_page(start_pfn));
|
||||||
|
return __remove_pages(zone, start_pfn, nr_pages);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -707,6 +707,21 @@ int arch_add_memory(int nid, u64 start, u64 size)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(arch_add_memory);
|
EXPORT_SYMBOL_GPL(arch_add_memory);
|
||||||
|
|
||||||
|
#ifdef CONFIG_MEMORY_HOTREMOVE
|
||||||
|
int __ref arch_remove_memory(u64 start, u64 size)
|
||||||
|
{
|
||||||
|
unsigned long start_pfn = start >> PAGE_SHIFT;
|
||||||
|
unsigned long nr_pages = size >> PAGE_SHIFT;
|
||||||
|
struct zone *zone;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
zone = page_zone(pfn_to_page(start_pfn));
|
||||||
|
ret = __remove_pages(zone, start_pfn, nr_pages);
|
||||||
|
WARN_ON_ONCE(ret);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
#endif /* CONFIG_MEMORY_HOTPLUG */
|
#endif /* CONFIG_MEMORY_HOTPLUG */
|
||||||
|
|
||||||
static struct kcore_list kcore_vsyscall;
|
static struct kcore_list kcore_vsyscall;
|
||||||
|
|
|
@ -96,6 +96,7 @@ extern void __online_page_free(struct page *page);
|
||||||
|
|
||||||
#ifdef CONFIG_MEMORY_HOTREMOVE
|
#ifdef CONFIG_MEMORY_HOTREMOVE
|
||||||
extern bool is_pageblock_removable_nolock(struct page *page);
|
extern bool is_pageblock_removable_nolock(struct page *page);
|
||||||
|
extern int arch_remove_memory(u64 start, u64 size);
|
||||||
#endif /* CONFIG_MEMORY_HOTREMOVE */
|
#endif /* CONFIG_MEMORY_HOTREMOVE */
|
||||||
|
|
||||||
/* reasonably generic interface to expand the physical pages in a zone */
|
/* reasonably generic interface to expand the physical pages in a zone */
|
||||||
|
|
|
@ -1513,6 +1513,8 @@ int __ref remove_memory(u64 start, u64 size)
|
||||||
/* remove memmap entry */
|
/* remove memmap entry */
|
||||||
firmware_map_remove(start, start + size, "System RAM");
|
firmware_map_remove(start, start + size, "System RAM");
|
||||||
|
|
||||||
|
arch_remove_memory(start, size);
|
||||||
|
|
||||||
unlock_memory_hotplug();
|
unlock_memory_hotplug();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user