[patch] mm, hotplug: avoid compiling memory hotremove functions when disabled

2013-04-10 Thread David Rientjes
__remove_pages() is only necessary for CONFIG_MEMORY_HOTREMOVE.  PowerPC
pseries will return -EOPNOTSUPP if unsupported.

Adding an #ifdef causes several other functions it depends on to also
become unnecessary, which saves in .text when disabled (it's disabled in
most defconfigs besides powerpc, including x86).  remove_memory_block()
becomes static since it is not referenced outside of
drivers/base/memory.c.

Build tested on x86 and powerpc with CONFIG_MEMORY_HOTREMOVE both enabled
and disabled.

Signed-off-by: David Rientjes rient...@google.com
---
 arch/powerpc/platforms/pseries/hotplug-memory.c | 12 +
 drivers/base/memory.c   | 44 +++
 include/linux/memory.h  |  3 +-
 include/linux/memory_hotplug.h  |  4 +-
 mm/memory_hotplug.c | 68 +++
 mm/sparse.c | 72 +
 6 files changed, 113 insertions(+), 90 deletions(-)

diff --git a/arch/powerpc/platforms/pseries/hotplug-memory.c 
b/arch/powerpc/platforms/pseries/hotplug-memory.c
--- a/arch/powerpc/platforms/pseries/hotplug-memory.c
+++ b/arch/powerpc/platforms/pseries/hotplug-memory.c
@@ -72,6 +72,7 @@ unsigned long memory_block_size_bytes(void)
return get_memblock_size();
 }
 
+#ifdef CONFIG_MEMORY_HOTREMOVE
 static int pseries_remove_memblock(unsigned long base, unsigned int 
memblock_size)
 {
unsigned long start, start_pfn;
@@ -153,6 +154,17 @@ static int pseries_remove_memory(struct device_node *np)
ret = pseries_remove_memblock(base, lmb_size);
return ret;
 }
+#else
+static inline int pseries_remove_memblock(unsigned long base,
+ unsigned int memblock_size)
+{
+   return -EOPNOTSUPP;
+}
+static inline int pseries_remove_memory(struct device_node *np)
+{
+   return -EOPNOTSUPP;
+}
+#endif /* CONFIG_MEMORY_HOTREMOVE */
 
 static int pseries_add_memory(struct device_node *np)
 {
diff --git a/drivers/base/memory.c b/drivers/base/memory.c
--- a/drivers/base/memory.c
+++ b/drivers/base/memory.c
@@ -93,16 +93,6 @@ int register_memory(struct memory_block *memory)
return error;
 }
 
-static void
-unregister_memory(struct memory_block *memory)
-{
-   BUG_ON(memory-dev.bus != memory_subsys);
-
-   /* drop the ref. we got in remove_memory_block() */
-   kobject_put(memory-dev.kobj);
-   device_unregister(memory-dev);
-}
-
 unsigned long __weak memory_block_size_bytes(void)
 {
return MIN_MEMORY_BLOCK_SIZE;
@@ -637,8 +627,28 @@ static int add_memory_section(int nid, struct mem_section 
*section,
return ret;
 }
 
-int remove_memory_block(unsigned long node_id, struct mem_section *section,
-   int phys_device)
+/*
+ * need an interface for the VM to add new memory regions,
+ * but without onlining it.
+ */
+int register_new_memory(int nid, struct mem_section *section)
+{
+   return add_memory_section(nid, section, NULL, MEM_OFFLINE, HOTPLUG);
+}
+
+#ifdef CONFIG_MEMORY_HOTREMOVE
+static void
+unregister_memory(struct memory_block *memory)
+{
+   BUG_ON(memory-dev.bus != memory_subsys);
+
+   /* drop the ref. we got in remove_memory_block() */
+   kobject_put(memory-dev.kobj);
+   device_unregister(memory-dev);
+}
+
+static int remove_memory_block(unsigned long node_id,
+  struct mem_section *section, int phys_device)
 {
struct memory_block *mem;
 
@@ -661,15 +671,6 @@ int remove_memory_block(unsigned long node_id, struct 
mem_section *section,
return 0;
 }
 
-/*
- * need an interface for the VM to add new memory regions,
- * but without onlining it.
- */
-int register_new_memory(int nid, struct mem_section *section)
-{
-   return add_memory_section(nid, section, NULL, MEM_OFFLINE, HOTPLUG);
-}
-
 int unregister_memory_section(struct mem_section *section)
 {
if (!present_section(section))
@@ -677,6 +678,7 @@ int unregister_memory_section(struct mem_section *section)
 
return remove_memory_block(0, section, 0);
 }
+#endif /* CONFIG_MEMORY_HOTREMOVE */
 
 /*
  * offline one memory block. If the memory block has been offlined, do nothing.
diff --git a/include/linux/memory.h b/include/linux/memory.h
--- a/include/linux/memory.h
+++ b/include/linux/memory.h
@@ -114,9 +114,10 @@ extern void unregister_memory_notifier(struct 
notifier_block *nb);
 extern int register_memory_isolate_notifier(struct notifier_block *nb);
 extern void unregister_memory_isolate_notifier(struct notifier_block *nb);
 extern int register_new_memory(int, struct mem_section *);
+#ifdef CONFIG_MEMORY_HOTREMOVE
 extern int unregister_memory_section(struct mem_section *);
+#endif
 extern int memory_dev_init(void);
-extern int remove_memory_block(unsigned long, struct mem_section *, int);
 extern int memory_notify(unsigned long val, void *v);
 extern int memory_isolate_notify(unsigned long val, void *v);
 extern 

Re: [patch] mm, hotplug: avoid compiling memory hotremove functions when disabled

2013-04-10 Thread Toshi Kani
On Tue, 2013-04-09 at 23:07 -0700, David Rientjes wrote:
 __remove_pages() is only necessary for CONFIG_MEMORY_HOTREMOVE.  PowerPC
 pseries will return -EOPNOTSUPP if unsupported.
 
 Adding an #ifdef causes several other functions it depends on to also
 become unnecessary, which saves in .text when disabled (it's disabled in
 most defconfigs besides powerpc, including x86).  remove_memory_block()
 becomes static since it is not referenced outside of
 drivers/base/memory.c.
 
 Build tested on x86 and powerpc with CONFIG_MEMORY_HOTREMOVE both enabled
 and disabled.
 
 Signed-off-by: David Rientjes rient...@google.com

Acked-by: Toshi Kani toshi.k...@hp.com

Thanks,
-Toshi


 ---
  arch/powerpc/platforms/pseries/hotplug-memory.c | 12 +
  drivers/base/memory.c   | 44 +++
  include/linux/memory.h  |  3 +-
  include/linux/memory_hotplug.h  |  4 +-
  mm/memory_hotplug.c | 68 +++
  mm/sparse.c | 72 
 +
  6 files changed, 113 insertions(+), 90 deletions(-)
 
 diff --git a/arch/powerpc/platforms/pseries/hotplug-memory.c 
 b/arch/powerpc/platforms/pseries/hotplug-memory.c
 --- a/arch/powerpc/platforms/pseries/hotplug-memory.c
 +++ b/arch/powerpc/platforms/pseries/hotplug-memory.c
 @@ -72,6 +72,7 @@ unsigned long memory_block_size_bytes(void)
   return get_memblock_size();
  }
  
 +#ifdef CONFIG_MEMORY_HOTREMOVE
  static int pseries_remove_memblock(unsigned long base, unsigned int 
 memblock_size)
  {
   unsigned long start, start_pfn;
 @@ -153,6 +154,17 @@ static int pseries_remove_memory(struct device_node *np)
   ret = pseries_remove_memblock(base, lmb_size);
   return ret;
  }
 +#else
 +static inline int pseries_remove_memblock(unsigned long base,
 +   unsigned int memblock_size)
 +{
 + return -EOPNOTSUPP;
 +}
 +static inline int pseries_remove_memory(struct device_node *np)
 +{
 + return -EOPNOTSUPP;
 +}
 +#endif /* CONFIG_MEMORY_HOTREMOVE */
  
  static int pseries_add_memory(struct device_node *np)
  {
 diff --git a/drivers/base/memory.c b/drivers/base/memory.c
 --- a/drivers/base/memory.c
 +++ b/drivers/base/memory.c
 @@ -93,16 +93,6 @@ int register_memory(struct memory_block *memory)
   return error;
  }
  
 -static void
 -unregister_memory(struct memory_block *memory)
 -{
 - BUG_ON(memory-dev.bus != memory_subsys);
 -
 - /* drop the ref. we got in remove_memory_block() */
 - kobject_put(memory-dev.kobj);
 - device_unregister(memory-dev);
 -}
 -
  unsigned long __weak memory_block_size_bytes(void)
  {
   return MIN_MEMORY_BLOCK_SIZE;
 @@ -637,8 +627,28 @@ static int add_memory_section(int nid, struct 
 mem_section *section,
   return ret;
  }
  
 -int remove_memory_block(unsigned long node_id, struct mem_section *section,
 - int phys_device)
 +/*
 + * need an interface for the VM to add new memory regions,
 + * but without onlining it.
 + */
 +int register_new_memory(int nid, struct mem_section *section)
 +{
 + return add_memory_section(nid, section, NULL, MEM_OFFLINE, HOTPLUG);
 +}
 +
 +#ifdef CONFIG_MEMORY_HOTREMOVE
 +static void
 +unregister_memory(struct memory_block *memory)
 +{
 + BUG_ON(memory-dev.bus != memory_subsys);
 +
 + /* drop the ref. we got in remove_memory_block() */
 + kobject_put(memory-dev.kobj);
 + device_unregister(memory-dev);
 +}
 +
 +static int remove_memory_block(unsigned long node_id,
 +struct mem_section *section, int phys_device)
  {
   struct memory_block *mem;
  
 @@ -661,15 +671,6 @@ int remove_memory_block(unsigned long node_id, struct 
 mem_section *section,
   return 0;
  }
  
 -/*
 - * need an interface for the VM to add new memory regions,
 - * but without onlining it.
 - */
 -int register_new_memory(int nid, struct mem_section *section)
 -{
 - return add_memory_section(nid, section, NULL, MEM_OFFLINE, HOTPLUG);
 -}
 -
  int unregister_memory_section(struct mem_section *section)
  {
   if (!present_section(section))
 @@ -677,6 +678,7 @@ int unregister_memory_section(struct mem_section *section)
  
   return remove_memory_block(0, section, 0);
  }
 +#endif /* CONFIG_MEMORY_HOTREMOVE */
  
  /*
   * offline one memory block. If the memory block has been offlined, do 
 nothing.
 diff --git a/include/linux/memory.h b/include/linux/memory.h
 --- a/include/linux/memory.h
 +++ b/include/linux/memory.h
 @@ -114,9 +114,10 @@ extern void unregister_memory_notifier(struct 
 notifier_block *nb);
  extern int register_memory_isolate_notifier(struct notifier_block *nb);
  extern void unregister_memory_isolate_notifier(struct notifier_block *nb);
  extern int register_new_memory(int, struct mem_section *);
 +#ifdef CONFIG_MEMORY_HOTREMOVE
  extern int unregister_memory_section(struct mem_section *);
 +#endif
  extern int