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: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Родитель
f9d531b8dc
Коммит
f02c696800
|
@ -18,6 +18,7 @@
|
|||
#include <linux/node.h>
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/notifier.h>
|
||||
|
||||
#define MIN_MEMORY_BLOCK_SIZE (1UL << SECTION_SIZE_BITS)
|
||||
|
||||
|
@ -127,13 +128,18 @@ enum mem_add_context { BOOT, HOTPLUG };
|
|||
#endif /* CONFIG_MEMORY_HOTPLUG_SPARSE */
|
||||
|
||||
#ifdef CONFIG_MEMORY_HOTPLUG
|
||||
#define hotplug_memory_notifier(fn, pri) { \
|
||||
#define hotplug_memory_notifier(fn, pri) ({ \
|
||||
static __meminitdata struct notifier_block fn##_mem_nb =\
|
||||
{ .notifier_call = fn, .priority = pri };\
|
||||
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
|
||||
#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
|
||||
|
||||
/*
|
||||
|
|
|
@ -47,8 +47,11 @@
|
|||
* runtime initialization.
|
||||
*/
|
||||
|
||||
typedef int (*notifier_fn_t)(struct notifier_block *nb,
|
||||
unsigned long action, void *data);
|
||||
|
||||
struct notifier_block {
|
||||
int (*notifier_call)(struct notifier_block *, unsigned long, void *);
|
||||
notifier_fn_t notifier_call;
|
||||
struct notifier_block __rcu *next;
|
||||
int priority;
|
||||
};
|
||||
|
|
Загрузка…
Ссылка в новой задаче