diff options
author | KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> | 2006-06-27 05:53:36 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-06-27 20:32:36 -0400 |
commit | 2842f11419704f8707fffc82e10d2263427fc130 (patch) | |
tree | 9bc86163ba7b2fa842b3aff2f087be6419f246bb /kernel/resource.c | |
parent | 0a54703904a4a206686b4e8c3f5a6927b60747aa (diff) |
[PATCH] catch valid mem range at onlining memory
This patch allows hot-add memory which is not aligned to section.
Now, hot-added memory has to be aligned to section size. Considering big
section sized archs, this is not useful.
When hot-added memory is registerd as iomem resoruce by iomem resource
patch, we can make use of that information to detect valid memory range.
Note: With this, not-aligned memory can be registerd. To allow hot-add
memory with holes, we have to do more work around add_memory().
(It doesn't allows add memory to already existing mem section.)
Signed-off-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'kernel/resource.c')
-rw-r--r-- | kernel/resource.c | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/kernel/resource.c b/kernel/resource.c index e3080fcc66a3..2404f9b0bc47 100644 --- a/kernel/resource.c +++ b/kernel/resource.c | |||
@@ -232,6 +232,44 @@ int release_resource(struct resource *old) | |||
232 | 232 | ||
233 | EXPORT_SYMBOL(release_resource); | 233 | EXPORT_SYMBOL(release_resource); |
234 | 234 | ||
235 | #ifdef CONFIG_MEMORY_HOTPLUG | ||
236 | /* | ||
237 | * Finds the lowest memory reosurce exists within [res->start.res->end) | ||
238 | * the caller must specify res->start, res->end, res->flags. | ||
239 | * If found, returns 0, res is overwritten, if not found, returns -1. | ||
240 | */ | ||
241 | int find_next_system_ram(struct resource *res) | ||
242 | { | ||
243 | resource_size_t start, end; | ||
244 | struct resource *p; | ||
245 | |||
246 | BUG_ON(!res); | ||
247 | |||
248 | start = res->start; | ||
249 | end = res->end; | ||
250 | |||
251 | read_lock(&resource_lock); | ||
252 | for (p = iomem_resource.child; p ; p = p->sibling) { | ||
253 | /* system ram is just marked as IORESOURCE_MEM */ | ||
254 | if (p->flags != res->flags) | ||
255 | continue; | ||
256 | if (p->start > end) { | ||
257 | p = NULL; | ||
258 | break; | ||
259 | } | ||
260 | if (p->start >= start) | ||
261 | break; | ||
262 | } | ||
263 | read_unlock(&resource_lock); | ||
264 | if (!p) | ||
265 | return -1; | ||
266 | /* copy data */ | ||
267 | res->start = p->start; | ||
268 | res->end = p->end; | ||
269 | return 0; | ||
270 | } | ||
271 | #endif | ||
272 | |||
235 | /* | 273 | /* |
236 | * Find empty slot in the resource tree given range and alignment. | 274 | * Find empty slot in the resource tree given range and alignment. |
237 | */ | 275 | */ |