diff options
author | Yasunori Goto <y-goto@jp.fujitsu.com> | 2007-10-21 19:41:36 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-10-22 11:13:17 -0400 |
commit | 7b78d335ac15b10bbcb0397c635d7f0d569b0270 (patch) | |
tree | 3e49006c0166ff8bcc6e11b401437fc31d875ec8 /drivers/base/memory.c | |
parent | 10020ca246c55744dad815ad4f15e1f488ca55a8 (diff) |
memory hotplug: rearrange memory hotplug notifier
Current memory notifier has some defects yet. (Fortunately, nothing uses
it.) This patch is to fix and rearrange for them.
- Add information of start_pfn, nr_pages, and node id if node status is
changes from/to memoryless node for callback functions.
Callbacks can't do anything without those information.
- Add notification going-online status.
It is necessary for creating per node structure before the node's
pages are available.
- Move GOING_OFFLINE status notification after page isolation.
It is good place for return memory like cache for callback,
because returned page is not used again.
- Make CANCEL events for rollingback when error occurs.
- Delete MEM_MAPPING_INVALID notification. It will be not used.
- Fix compile error of (un)register_memory_notifier().
Signed-off-by: Yasunori Goto <y-goto@jp.fujitsu.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/base/memory.c')
-rw-r--r-- | drivers/base/memory.c | 9 |
1 files changed, 1 insertions, 8 deletions
diff --git a/drivers/base/memory.c b/drivers/base/memory.c index c41d0728efe2..7868707c7eda 100644 --- a/drivers/base/memory.c +++ b/drivers/base/memory.c | |||
@@ -137,7 +137,7 @@ static ssize_t show_mem_state(struct sys_device *dev, char *buf) | |||
137 | return len; | 137 | return len; |
138 | } | 138 | } |
139 | 139 | ||
140 | static inline int memory_notify(unsigned long val, void *v) | 140 | int memory_notify(unsigned long val, void *v) |
141 | { | 141 | { |
142 | return blocking_notifier_call_chain(&memory_chain, val, v); | 142 | return blocking_notifier_call_chain(&memory_chain, val, v); |
143 | } | 143 | } |
@@ -183,7 +183,6 @@ memory_block_action(struct memory_block *mem, unsigned long action) | |||
183 | break; | 183 | break; |
184 | case MEM_OFFLINE: | 184 | case MEM_OFFLINE: |
185 | mem->state = MEM_GOING_OFFLINE; | 185 | mem->state = MEM_GOING_OFFLINE; |
186 | memory_notify(MEM_GOING_OFFLINE, NULL); | ||
187 | start_paddr = page_to_pfn(first_page) << PAGE_SHIFT; | 186 | start_paddr = page_to_pfn(first_page) << PAGE_SHIFT; |
188 | ret = remove_memory(start_paddr, | 187 | ret = remove_memory(start_paddr, |
189 | PAGES_PER_SECTION << PAGE_SHIFT); | 188 | PAGES_PER_SECTION << PAGE_SHIFT); |
@@ -191,7 +190,6 @@ memory_block_action(struct memory_block *mem, unsigned long action) | |||
191 | mem->state = old_state; | 190 | mem->state = old_state; |
192 | break; | 191 | break; |
193 | } | 192 | } |
194 | memory_notify(MEM_MAPPING_INVALID, NULL); | ||
195 | break; | 193 | break; |
196 | default: | 194 | default: |
197 | printk(KERN_WARNING "%s(%p, %ld) unknown action: %ld\n", | 195 | printk(KERN_WARNING "%s(%p, %ld) unknown action: %ld\n", |
@@ -199,11 +197,6 @@ memory_block_action(struct memory_block *mem, unsigned long action) | |||
199 | WARN_ON(1); | 197 | WARN_ON(1); |
200 | ret = -EINVAL; | 198 | ret = -EINVAL; |
201 | } | 199 | } |
202 | /* | ||
203 | * For now, only notify on successful memory operations | ||
204 | */ | ||
205 | if (!ret) | ||
206 | memory_notify(action, NULL); | ||
207 | 200 | ||
208 | return ret; | 201 | return ret; |
209 | } | 202 | } |