lkml.org 
[lkml]   [2008]   [Jan]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
From
Subject[PATCH] [2/3] Add a new arch_early_alloc() interface for x86-64 v2
Date

This allows to allocate memory really early before bootmem is setup.
And a symbol that can be tested by the preprocessor.

pgtable.h is probably not the best include for it, but also not the worst.

This starts to allocate at 128MB and falls back to lower memory only
if that fails. Rationale is that this will handle 64MB kdump kernels
loaded at 16MB.

v1->v2: [includes typo fix from Eric Dumazet]
v1->v2: [Move default start to 128MB instead of 32MB]

Cc: peterz@infradead.org

Signed-off-by: Andi Kleen <ak@suse.de>

---
arch/x86/kernel/e820_64.c | 14 ++++++++++++++
include/asm-x86/pgtable_64.h | 3 +++
2 files changed, 17 insertions(+)

Index: linux/arch/x86/kernel/e820_64.c
===================================================================
--- linux.orig/arch/x86/kernel/e820_64.c
+++ linux/arch/x86/kernel/e820_64.c
@@ -819,3 +819,17 @@ int __init arch_get_ram_range(int slot,
max_pfn << PAGE_SHIFT) - *addr;
return i + 1;
}
+
+#define EARLY_ALLOC_START (128<<20)
+__init void *arch_early_alloc(unsigned long size)
+{
+ unsigned long p = find_e820_area(EARLY_ALLOC_START, -1UL, size);
+ if (p == -1ULL) {
+ /* Risk filling the DMA zone */
+ p = find_e820_area(0, -1UL, size);
+ if (p == -1ULL)
+ panic("arch_early_alloc %lu failed", size);
+ }
+ reserve_early(p, p + size);
+ return __va(p);
+}
Index: linux/include/asm-x86/pgtable_64.h
===================================================================
--- linux.orig/include/asm-x86/pgtable_64.h
+++ linux/include/asm-x86/pgtable_64.h
@@ -436,6 +436,9 @@ pte_t *lookup_address(unsigned long addr
#define kc_offset_to_vaddr(o) \
(((o) & (1UL << (__VIRTUAL_MASK_SHIFT-1))) ? ((o) | (~__VIRTUAL_MASK)) : (o))

+#define ARCH_HAS_EARLY_ALLOC
+extern void *arch_early_alloc(unsigned long size);
+
#define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG
#define __HAVE_ARCH_PTEP_GET_AND_CLEAR
#define __HAVE_ARCH_PTEP_GET_AND_CLEAR_FULL

\
 
 \ /
  Last update: 2008-01-03 18:49    [W:0.042 / U:1.004 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site