Re: [PATCH 12/21] x86, acpi: Try to find if SRAT is overrided earlier.
From: Tang Chen
Date: Wed Jul 24 2013 - 02:56:05 EST
On 07/24/2013 04:27 AM, Tejun Heo wrote:
On Fri, Jul 19, 2013 at 03:59:25PM +0800, Tang Chen wrote:
As we mentioned in previous patches, to prevent the kernel
Prolly best to briefly describe what the overall goal is about.
Sure. Here is the overall picture, and will add it to log.
Linux cannot migrate pages used by the kernel due to the direct mapping
(va = pa + PAGE_OFFSET), any memory used by the kernel cannot be
So in memory hotplug platform, we have to prevent the kernel from using
The ACPI table SRAT (System Resource Affinity Table) contains info to
which memory is hotpluggble. After SRAT is parsed, we are aware of which
memory is hotpluggable.
At the early time when system is booting, SRAT has not been parsed. The boot
memory allocator memblock will allocate any memory to the kernel. So we need
SRAT parsed before memblock starts to work.
In this patch, we are going to parse SRAT earlier, right after memblock
Generally speaking, SRAT is provided by firmware. But
functionality allows users to customize their own SRAT in initrd, and
the one from firmware. So if we want to parse SRAT earlier, we also need
SRAT override earlier.
First, we introduce early_acpi_override_srat() to check if SRAT will be
Second, we introduce reserve_hotpluggable_memory() to reserve
which will firstly call early_acpi_override_srat() to find out which
hotpluggable in the override SRAT.
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
index 28d2e60..9717760 100644
@@ -1078,6 +1078,15 @@ void __init setup_arch(char **cmdline_p)
/* Initialize ACPI root table */
+ * Linux kernel cannot migrate kernel pages, as a result, memory used
+ * by the kernel cannot be hot-removed. Reserve hotpluggable memory to
+ * prevent memblock from allocating hotpluggable memory for the kernel.
Hmmm, so you're gonna reserve all hotpluggable memory areas until
everything is up and running, which probably is why allocating
node_data on hotpluggable node doesn't work, right?
Yes, that's right. The node_data of hotpluggable node is now put on another
+phys_addr_t __init early_acpi_override_srat(void)
+ int i;
+ u32 length;
+ long offset;
+ void *ramdisk_vaddr;
+ struct acpi_table_header *table;
+ unsigned long map_step = NR_FIX_BTMAPS<< PAGE_SHIFT;
+ phys_addr_t ramdisk_image = get_ramdisk_image();
+ char cpio_path = "kernel/firmware/acpi/";
+ struct cpio_data file;
Don't we usually put variable declarations with initializers before
others? For some reason, the above block is painful to look at.
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/