diff options
author | Dave Hansen <haveblue@us.ibm.com> | 2005-10-29 21:16:54 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-10-30 00:40:44 -0400 |
commit | 3947be1969a9ce455ec30f60ef51efb10e4323d1 (patch) | |
tree | 0b4b3b4c268beb7aa88cb685cce48b6bb5053c47 /include/linux/memory.h | |
parent | bdc8cb984576ab5b550c8b24c6fa111a873503e3 (diff) |
[PATCH] memory hotplug: sysfs and add/remove functions
This adds generic memory add/remove and supporting functions for memory
hotplug into a new file as well as a memory hotplug kernel config option.
Individual architecture patches will follow.
For now, disable memory hotplug when swsusp is enabled. There's a lot of
churn there right now. We'll fix it up properly once it calms down.
Signed-off-by: Matt Tolentino <matthew.e.tolentino@intel.com>
Signed-off-by: Dave Hansen <haveblue@us.ibm.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'include/linux/memory.h')
-rw-r--r-- | include/linux/memory.h | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/include/linux/memory.h b/include/linux/memory.h new file mode 100644 index 000000000000..0def328ab5cf --- /dev/null +++ b/include/linux/memory.h | |||
@@ -0,0 +1,94 @@ | |||
1 | /* | ||
2 | * include/linux/memory.h - generic memory definition | ||
3 | * | ||
4 | * This is mainly for topological representation. We define the | ||
5 | * basic "struct memory_block" here, which can be embedded in per-arch | ||
6 | * definitions or NUMA information. | ||
7 | * | ||
8 | * Basic handling of the devices is done in drivers/base/memory.c | ||
9 | * and system devices are handled in drivers/base/sys.c. | ||
10 | * | ||
11 | * Memory block are exported via sysfs in the class/memory/devices/ | ||
12 | * directory. | ||
13 | * | ||
14 | */ | ||
15 | #ifndef _LINUX_MEMORY_H_ | ||
16 | #define _LINUX_MEMORY_H_ | ||
17 | |||
18 | #include <linux/sysdev.h> | ||
19 | #include <linux/node.h> | ||
20 | #include <linux/compiler.h> | ||
21 | |||
22 | #include <asm/semaphore.h> | ||
23 | |||
24 | struct memory_block { | ||
25 | unsigned long phys_index; | ||
26 | unsigned long state; | ||
27 | /* | ||
28 | * This serializes all state change requests. It isn't | ||
29 | * held during creation because the control files are | ||
30 | * created long after the critical areas during | ||
31 | * initialization. | ||
32 | */ | ||
33 | struct semaphore state_sem; | ||
34 | int phys_device; /* to which fru does this belong? */ | ||
35 | void *hw; /* optional pointer to fw/hw data */ | ||
36 | int (*phys_callback)(struct memory_block *); | ||
37 | struct sys_device sysdev; | ||
38 | }; | ||
39 | |||
40 | /* These states are exposed to userspace as text strings in sysfs */ | ||
41 | #define MEM_ONLINE (1<<0) /* exposed to userspace */ | ||
42 | #define MEM_GOING_OFFLINE (1<<1) /* exposed to userspace */ | ||
43 | #define MEM_OFFLINE (1<<2) /* exposed to userspace */ | ||
44 | |||
45 | /* | ||
46 | * All of these states are currently kernel-internal for notifying | ||
47 | * kernel components and architectures. | ||
48 | * | ||
49 | * For MEM_MAPPING_INVALID, all notifier chains with priority >0 | ||
50 | * are called before pfn_to_page() becomes invalid. The priority=0 | ||
51 | * entry is reserved for the function that actually makes | ||
52 | * pfn_to_page() stop working. Any notifiers that want to be called | ||
53 | * after that should have priority <0. | ||
54 | */ | ||
55 | #define MEM_MAPPING_INVALID (1<<3) | ||
56 | |||
57 | #ifndef CONFIG_MEMORY_HOTPLUG | ||
58 | static inline int memory_dev_init(void) | ||
59 | { | ||
60 | return 0; | ||
61 | } | ||
62 | static inline int register_memory_notifier(struct notifier_block *nb) | ||
63 | { | ||
64 | return 0; | ||
65 | } | ||
66 | static inline void unregister_memory_notifier(struct notifier_block *nb) | ||
67 | { | ||
68 | } | ||
69 | #else | ||
70 | extern int register_memory(struct memory_block *, struct mem_section *section, struct node *); | ||
71 | extern int register_new_memory(struct mem_section *); | ||
72 | extern int unregister_memory_section(struct mem_section *); | ||
73 | extern int memory_dev_init(void); | ||
74 | extern int register_memory_notifier(struct notifier_block *nb); | ||
75 | extern void unregister_memory_notifier(struct notifier_block *nb); | ||
76 | |||
77 | #define CONFIG_MEM_BLOCK_SIZE (PAGES_PER_SECTION<<PAGE_SHIFT) | ||
78 | |||
79 | extern int invalidate_phys_mapping(unsigned long, unsigned long); | ||
80 | struct notifier_block; | ||
81 | |||
82 | extern int register_memory_notifier(struct notifier_block *nb); | ||
83 | extern void unregister_memory_notifier(struct notifier_block *nb); | ||
84 | |||
85 | extern struct sysdev_class memory_sysdev_class; | ||
86 | #endif /* CONFIG_MEMORY_HOTPLUG */ | ||
87 | |||
88 | #define hotplug_memory_notifier(fn, pri) { \ | ||
89 | static struct notifier_block fn##_mem_nb = \ | ||
90 | { .notifier_call = fn, .priority = pri }; \ | ||
91 | register_memory_notifier(&fn##_mem_nb); \ | ||
92 | } | ||
93 | |||
94 | #endif /* _LINUX_MEMORY_H_ */ | ||