Commit f02c6968 authored by Andrew Morton's avatar Andrew Morton Committed by Linus Torvalds

include/linux/memory.h: implement register_hotmemory_notifier()

When CONFIG_MEMORY_HOTPLUG=n, we don't want the memory-hotplug notifier
handlers to be included in the .o files, for space reasons.

The existing hotplug_memory_notifier() tries to handle this but testing
with gcc-4.4.4 shows that it doesn't work - the hotplug functions are
still present in the .o files.

So implement a new register_hotmemory_notifier() which is a copy of
register_hotcpu_notifier(), and which actually works as desired.
hotplug_memory_notifier() and register_memory_notifier() callsites
should be converted to use this new register_hotmemory_notifier().

While we're there, let's repair the existing hotplug_memory_notifier():
it simply stomps on the register_memory_notifier() return value, so
well-behaved code cannot check for errors.  Apparently non of the
existing callers were well-behaved :(

Cc: Andrew Shewmaker <agshew@gmail.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent f9d531b8
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#include <linux/node.h> #include <linux/node.h>
#include <linux/compiler.h> #include <linux/compiler.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/notifier.h>
#define MIN_MEMORY_BLOCK_SIZE (1UL << SECTION_SIZE_BITS) #define MIN_MEMORY_BLOCK_SIZE (1UL << SECTION_SIZE_BITS)
...@@ -127,13 +128,18 @@ enum mem_add_context { BOOT, HOTPLUG }; ...@@ -127,13 +128,18 @@ enum mem_add_context { BOOT, HOTPLUG };
#endif /* CONFIG_MEMORY_HOTPLUG_SPARSE */ #endif /* CONFIG_MEMORY_HOTPLUG_SPARSE */
#ifdef CONFIG_MEMORY_HOTPLUG #ifdef CONFIG_MEMORY_HOTPLUG
#define hotplug_memory_notifier(fn, pri) { \ #define hotplug_memory_notifier(fn, pri) ({ \
static __meminitdata struct notifier_block fn##_mem_nb =\ static __meminitdata struct notifier_block fn##_mem_nb =\
{ .notifier_call = fn, .priority = pri }; \ { .notifier_call = fn, .priority = pri };\
register_memory_notifier(&fn##_mem_nb); \ register_memory_notifier(&fn##_mem_nb); \
} })
#define register_hotmemory_notifier(nb) register_memory_notifier(nb)
#define unregister_hotmemory_notifier(nb) unregister_memory_notifier(nb)
#else #else
#define hotplug_memory_notifier(fn, pri) do { } while (0) #define hotplug_memory_notifier(fn, pri) (0)
/* These aren't inline functions due to a GCC bug. */
#define register_hotmemory_notifier(nb) ({ (void)(nb); 0; })
#define unregister_hotmemory_notifier(nb) ({ (void)(nb); })
#endif #endif
/* /*
......
...@@ -47,8 +47,11 @@ ...@@ -47,8 +47,11 @@
* runtime initialization. * runtime initialization.
*/ */
typedef int (*notifier_fn_t)(struct notifier_block *nb,
unsigned long action, void *data);
struct notifier_block { struct notifier_block {
int (*notifier_call)(struct notifier_block *, unsigned long, void *); notifier_fn_t notifier_call;
struct notifier_block __rcu *next; struct notifier_block __rcu *next;
int priority; int priority;
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment