All of lore.kernel.org
 help / color / mirror / Atom feed
From: tip-bot for Josh Triplett <josh@joshtriplett.org>
To: linux-tip-commits@vger.kernel.org
Cc: linux-kernel@vger.kernel.org, hpa@zytor.com, mingo@kernel.org,
	josh@joshtriplett.org, tglx@linutronix.de, hpa@linux.intel.com,
	matt.fleming@intel.com
Subject: [tip:x86/efi] efi: Defer freeing boot services memory until after ACPI init
Date: Thu, 27 Sep 2012 14:56:58 -0700	[thread overview]
Message-ID: <tip-668b132e837a2d1b346699bad4ae2e85bce52f55@git.kernel.org> (raw)
In-Reply-To: <575b74a90571493561bf7bcf6fc0bdc12779fe35.1347141698.git.josh@joshtriplett.org>

Commit-ID:  668b132e837a2d1b346699bad4ae2e85bce52f55
Gitweb:     http://git.kernel.org/tip/668b132e837a2d1b346699bad4ae2e85bce52f55
Author:     Josh Triplett <josh@joshtriplett.org>
AuthorDate: Sat, 8 Sep 2012 15:06:56 -0700
Committer:  H. Peter Anvin <hpa@linux.intel.com>
CommitDate: Thu, 27 Sep 2012 14:43:32 -0700

efi: Defer freeing boot services memory until after ACPI init

Some new ACPI 5.0 tables reference resources stored in boot services
memory, so keep that memory around until we have ACPI and can extract
data from it.

Signed-off-by: Josh Triplett <josh@joshtriplett.org>
Link: http://lkml.kernel.org/r/575b74a90571493561bf7bcf6fc0bdc12779fe35.1347141698.git.josh@joshtriplett.org
Acked-by: Matt Fleming <matt.fleming@intel.com>
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
---
 arch/x86/platform/efi/efi.c |   31 ++++++++++++++++++-------------
 include/linux/efi.h         |    2 ++
 init/main.c                 |    3 +++
 3 files changed, 23 insertions(+), 13 deletions(-)

diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c
index f55a4ce..b3dbbdb 100644
--- a/arch/x86/platform/efi/efi.c
+++ b/arch/x86/platform/efi/efi.c
@@ -419,10 +419,21 @@ void __init efi_reserve_boot_services(void)
 	}
 }
 
-static void __init efi_free_boot_services(void)
+static void __init efi_unmap_memmap(void)
+{
+	if (memmap.map) {
+		early_iounmap(memmap.map, memmap.nr_map * memmap.desc_size);
+		memmap.map = NULL;
+	}
+}
+
+void __init efi_free_boot_services(void)
 {
 	void *p;
 
+	if (!efi_native)
+		return;
+
 	for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) {
 		efi_memory_desc_t *md = p;
 		unsigned long long start = md->phys_addr;
@@ -438,6 +449,8 @@ static void __init efi_free_boot_services(void)
 
 		free_bootmem_late(start, size);
 	}
+
+	efi_unmap_memmap();
 }
 
 static int __init efi_systab_init(void *phys)
@@ -787,8 +800,10 @@ void __init efi_enter_virtual_mode(void)
 	 * non-native EFI
 	 */
 
-	if (!efi_native)
-		goto out;
+	if (!efi_native) {
+		efi_unmap_memmap();
+		return;
+	}
 
 	/* Merge contiguous regions of the same type and attribute */
 	for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) {
@@ -878,13 +893,6 @@ void __init efi_enter_virtual_mode(void)
 	}
 
 	/*
-	 * Thankfully, it does seem that no runtime services other than
-	 * SetVirtualAddressMap() will touch boot services code, so we can
-	 * get rid of it all at this point
-	 */
-	efi_free_boot_services();
-
-	/*
 	 * Now that EFI is in virtual mode, update the function
 	 * pointers in the runtime service table to the new virtual addresses.
 	 *
@@ -907,9 +915,6 @@ void __init efi_enter_virtual_mode(void)
 	if (__supported_pte_mask & _PAGE_NX)
 		runtime_code_page_mkexec();
 
-out:
-	early_iounmap(memmap.map, memmap.nr_map * memmap.desc_size);
-	memmap.map = NULL;
 	kfree(new_memmap);
 }
 
diff --git a/include/linux/efi.h b/include/linux/efi.h
index 52fbedf..3c72c27 100644
--- a/include/linux/efi.h
+++ b/include/linux/efi.h
@@ -497,8 +497,10 @@ extern void efi_memmap_walk (efi_freemem_callback_t callback, void *arg);
 extern void efi_gettimeofday (struct timespec *ts);
 #ifdef CONFIG_X86
 extern void efi_enter_virtual_mode (void);	/* switch EFI to virtual mode, if possible */
+extern void efi_free_boot_services(void);
 #else
 static void efi_enter_virtual_mode(void) {}
+static void efi_free_boot_services(void) {}
 #endif
 extern u64 efi_get_iobase (void);
 extern u32 efi_mem_type (unsigned long phys_addr);
diff --git a/init/main.c b/init/main.c
index ebb1ba5..78e5491 100644
--- a/init/main.c
+++ b/init/main.c
@@ -629,6 +629,9 @@ asmlinkage void __init start_kernel(void)
 	acpi_early_init(); /* before LAPIC and SMP init */
 	sfi_init_late();
 
+	if (efi_enabled)
+		efi_free_boot_services();
+
 	ftrace_init();
 
 	/* Do the rest non-__init'ed, we're now alive */

  reply	other threads:[~2012-09-27 21:57 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-09-08 22:06 [PATCHv3 0/4] Fix ACPI BGRT support for images located in EFI boot services memory Josh Triplett
2012-09-08 22:06 ` [PATCHv3 1/4] efi: Add a stub for efi_enter_virtual_mode on non-x86 Josh Triplett
2012-09-27 21:56   ` [tip:x86/efi] " tip-bot for Josh Triplett
2012-10-01 20:28   ` [PATCHv3 1/4] " Arnd Bergmann
2012-10-01 20:30     ` Josh Triplett
2012-09-08 22:06 ` [PATCHv3 2/4] efi: Defer freeing boot services memory until after ACPI init Josh Triplett
2012-09-27 21:56   ` tip-bot for Josh Triplett [this message]
2012-09-08 22:09 ` [PATCHv3 3/4] efi: Add a function to look up existing IO memory mappings Josh Triplett
2012-09-27 21:57   ` [tip:x86/efi] " tip-bot for Josh Triplett
2012-09-08 22:09 ` [PATCHv3 4/4] efi: Fix the ACPI BGRT driver for images located in EFI boot services memory Josh Triplett
2012-09-21 19:00   ` Len Brown
2012-09-27 22:00   ` [tip:x86/efi] " tip-bot for Josh Triplett
2012-09-12 15:27 ` [PATCHv3 0/4] Fix ACPI BGRT support " Matt Fleming
2012-09-14 12:46 ` Matt Fleming
  -- strict thread matches above, loose matches on Subject: below --
2012-09-29  0:55 [PATCHv4 1/3] efi: Defer freeing boot services memory until after ACPI init Josh Triplett
2012-09-29 23:13 ` [tip:x86/efi] " tip-bot for Josh Triplett

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=tip-668b132e837a2d1b346699bad4ae2e85bce52f55@git.kernel.org \
    --to=josh@joshtriplett.org \
    --cc=hpa@linux.intel.com \
    --cc=hpa@zytor.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-tip-commits@vger.kernel.org \
    --cc=matt.fleming@intel.com \
    --cc=mingo@kernel.org \
    --cc=tglx@linutronix.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.