Re: Trying to make use of hotplug memory for xen balloon driver

From: Jeremy Fitzhardinge
Date: Wed Mar 26 2008 - 20:16:12 EST


Dave Hansen wrote:
Yeah, this is your problem. You've only allocated the iomem *resource*
for the memory area, which means that you've basically claimed the
physical addresses.

But, you don't have any 'struct page's there.

We really screwed up the memory hotplug code and ended up with some
incredibly arcane function names. You might want to look at
add_memory(). It is hidden away in mm/memory_hotplug.c :)

Sorry, I should have been clearer. add_memory_resource() is a function I added; it's effectively add_memory() with the resource-allocating part factored out:

--- a/include/linux/memory_hotplug.h
+++ b/include/linux/memory_hotplug.h
@@ -171,7 +171,10 @@

#endif /* ! CONFIG_MEMORY_HOTPLUG */

+struct resource;
+
extern int add_memory(int nid, u64 start, u64 size);
+extern int add_memory_resource(int nid, struct resource *res);
extern int arch_add_memory(int nid, u64 start, u64 size);
extern int remove_memory(u64 start, u64 size);
extern int sparse_add_one_section(struct zone *zone, unsigned long start_pfn,
===================================================================
--- a/mm/memory_hotplug.c
+++ b/mm/memory_hotplug.c
@@ -278,14 +278,28 @@

int add_memory(int nid, u64 start, u64 size)
{
- pg_data_t *pgdat = NULL;
- int new_pgdat = 0;
struct resource *res;
int ret;

res = register_memory_resource(start, size);
if (!res)
return -EEXIST;
+
+ ret = add_memory_resource(nid, res);
+
+ if (ret)
+ release_memory_resource(res);
+
+ return ret;
+}
+
+int add_memory_resource(int nid, struct resource *res)
+{
+ pg_data_t *pgdat = NULL;
+ int new_pgdat = 0;
+ int ret;
+ u64 start = res->start;
+ u64 size = res->end - res->start + 1;

if (!node_online(nid)) {
pgdat = hotadd_new_pgdat(nid, start);
@@ -320,8 +334,6 @@
/* rollback pgdat allocation and others */
if (new_pgdat)
rollback_node_hotadd(nid, pgdat);
- if (res)
- release_memory_resource(res);

return ret;
}


You might also note that most of the ppc64 memory hotplug is driven by
userspace. The hypervisor actually contacts a daemon on the guest to
tell it where its new memory is. That daemon does the addition
through /sys/devices/system/memory/probe.

X86 Xen does it with a combination of hypervisor and userspace. Mostly it comes down to asking the hypervisor to provide a machine page to put under a guest pseudo-physical page.

J
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/