diff options
author | Bernhard Walle <bwalle@suse.de> | 2008-02-07 03:15:17 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2008-02-07 11:42:25 -0500 |
commit | 72a7fe3967dbf86cb34e24fbf1d957fe24d2f246 (patch) | |
tree | c19f7d0b530577359840e959cce204939caf0649 /arch/s390/kernel/setup.c | |
parent | 25fad945a7f7ff2cf06e437381c6a1121784dbd9 (diff) |
Introduce flags for reserve_bootmem()
This patchset adds a flags variable to reserve_bootmem() and uses the
BOOTMEM_EXCLUSIVE flag in crashkernel reservation code to detect collisions
between crashkernel area and already used memory.
This patch:
Change the reserve_bootmem() function to accept a new flag BOOTMEM_EXCLUSIVE.
If that flag is set, the function returns with -EBUSY if the memory already
has been reserved in the past. This is to avoid conflicts.
Because that code runs before SMP initialisation, there's no race condition
inside reserve_bootmem_core().
[akpm@linux-foundation.org: coding-style fixes]
[akpm@linux-foundation.org: fix powerpc build]
Signed-off-by: Bernhard Walle <bwalle@suse.de>
Cc: <linux-arch@vger.kernel.org>
Cc: "Eric W. Biederman" <ebiederm@xmission.com>
Cc: Vivek Goyal <vgoyal@in.ibm.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'arch/s390/kernel/setup.c')
-rw-r--r-- | arch/s390/kernel/setup.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/arch/s390/kernel/setup.c b/arch/s390/kernel/setup.c index 29ae165d1749..f9f8779022a0 100644 --- a/arch/s390/kernel/setup.c +++ b/arch/s390/kernel/setup.c | |||
@@ -649,21 +649,24 @@ setup_memory(void) | |||
649 | /* | 649 | /* |
650 | * Reserve memory used for lowcore/command line/kernel image. | 650 | * Reserve memory used for lowcore/command line/kernel image. |
651 | */ | 651 | */ |
652 | reserve_bootmem(0, (unsigned long)_ehead); | 652 | reserve_bootmem(0, (unsigned long)_ehead, BOOTMEM_DEFAULT); |
653 | reserve_bootmem((unsigned long)_stext, | 653 | reserve_bootmem((unsigned long)_stext, |
654 | PFN_PHYS(start_pfn) - (unsigned long)_stext); | 654 | PFN_PHYS(start_pfn) - (unsigned long)_stext, |
655 | BOOTMEM_DEFAULT); | ||
655 | /* | 656 | /* |
656 | * Reserve the bootmem bitmap itself as well. We do this in two | 657 | * Reserve the bootmem bitmap itself as well. We do this in two |
657 | * steps (first step was init_bootmem()) because this catches | 658 | * steps (first step was init_bootmem()) because this catches |
658 | * the (very unlikely) case of us accidentally initializing the | 659 | * the (very unlikely) case of us accidentally initializing the |
659 | * bootmem allocator with an invalid RAM area. | 660 | * bootmem allocator with an invalid RAM area. |
660 | */ | 661 | */ |
661 | reserve_bootmem(start_pfn << PAGE_SHIFT, bootmap_size); | 662 | reserve_bootmem(start_pfn << PAGE_SHIFT, bootmap_size, |
663 | BOOTMEM_DEFAULT); | ||
662 | 664 | ||
663 | #ifdef CONFIG_BLK_DEV_INITRD | 665 | #ifdef CONFIG_BLK_DEV_INITRD |
664 | if (INITRD_START && INITRD_SIZE) { | 666 | if (INITRD_START && INITRD_SIZE) { |
665 | if (INITRD_START + INITRD_SIZE <= memory_end) { | 667 | if (INITRD_START + INITRD_SIZE <= memory_end) { |
666 | reserve_bootmem(INITRD_START, INITRD_SIZE); | 668 | reserve_bootmem(INITRD_START, INITRD_SIZE, |
669 | BOOTMEM_DEFAULT); | ||
667 | initrd_start = INITRD_START; | 670 | initrd_start = INITRD_START; |
668 | initrd_end = initrd_start + INITRD_SIZE; | 671 | initrd_end = initrd_start + INITRD_SIZE; |
669 | } else { | 672 | } else { |