[PATCH] Catch notification of memory add event of ACPI via container driver. (avoid...
authorYasunori Goto <y-goto@jp.fujitsu.com>
Tue, 27 Jun 2006 09:53:29 +0000 (02:53 -0700)
committerLinus Torvalds <torvalds@g5.osdl.org>
Wed, 28 Jun 2006 00:32:35 +0000 (17:32 -0700)
When acpi_memory_device_init() is called at boottime to register struct
memory acpi_memory_device, acpi_bus_add() are called via
acpi_driver_attach().

But it also calls ops->start() function.  It is called even if the memory
blocks are initialized at early boottime.  In this case add_memory() return
-EEXIST, and the memory blocks becomes INVALID state even if it is normal.

This is patch to avoid calling add_memory() for already available memory.

[akpm@osdl.org: coding cleanups]
Signed-off-by: Yasunori Goto <y-goto@jp.fujitsu.com>
Cc: "Brown, Len" <len.brown@intel.com>
Cc: Dave Hansen <haveblue@us.ibm.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
drivers/acpi/acpi_memhotplug.c

index 3721f8dd0de34954dfb697ceb0172c380989fa39..5652569b37621dbeedfb670527484bab25d062ba 100644 (file)
@@ -234,6 +234,17 @@ static int acpi_memory_enable_device(struct acpi_memory_device *mem_device)
         * (i.e. memory-hot-remove function)
         */
        list_for_each_entry(info, &mem_device->res_list, list) {
+               u64 start_pfn, end_pfn;
+
+               start_pfn = info->start_addr >> PAGE_SHIFT;
+               end_pfn = (info->start_addr + info->length - 1) >> PAGE_SHIFT;
+
+               if (pfn_valid(start_pfn) || pfn_valid(end_pfn)) {
+                       /* already enabled. try next area */
+                       num_enabled++;
+                       continue;
+               }
+
                result = add_memory(info->start_addr, info->length);
                if (result)
                        continue;