From: tip-bot for Matthew Garrett <mjg@redhat.com>
To: linux-tip-commits@vger.kernel.org
Cc: linux-kernel@vger.kernel.org, mjg@redhat.com, hpa@zytor.com,
mingo@redhat.com, tglx@linutronix.de, hpa@linux.intel.com
Subject: [tip:x86/efi] x86, efi: Merge contiguous memory regions of the same type and attribute
Date: Mon, 9 May 2011 23:17:15 GMT [thread overview]
Message-ID: <tip-202f9d0a41809e3424af5f61489b48b622824aed@git.kernel.org> (raw)
In-Reply-To: <1304623186-18261-3-git-send-email-mjg@redhat.com>
Commit-ID: 202f9d0a41809e3424af5f61489b48b622824aed
Gitweb: http://git.kernel.org/tip/202f9d0a41809e3424af5f61489b48b622824aed
Author: Matthew Garrett <mjg@redhat.com>
AuthorDate: Thu, 5 May 2011 15:19:44 -0400
Committer: H. Peter Anvin <hpa@linux.intel.com>
CommitDate: Mon, 9 May 2011 12:14:34 -0700
x86, efi: Merge contiguous memory regions of the same type and attribute
Some firmware implementations assume that physically contiguous regions
will be contiguous in virtual address space. This assumption is, obviously,
entirely unjustifiable. Said firmware implementations lack the good grace
to handle their failings in a measured and reasonable manner, instead
tending to shit all over address space and oopsing the kernel.
In an ideal universe these firmware implementations would simultaneously
catch fire and cease to be a problem, but since some of them are present
in attractively thin and shiny metal devices vanity wins out and some
poor developer spends an extended period of time surrounded by a
growing array of empty bottles until the underlying reason becomes
apparent. Said developer presents this patch, which simply merges
adjacent regions if they happen to be contiguous and have the same EFI
memory type and caching attributes.
Signed-off-by: Matthew Garrett <mjg@redhat.com>
Link: http://lkml.kernel.org/r/1304623186-18261-3-git-send-email-mjg@redhat.com
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
---
arch/x86/platform/efi/efi.c | 30 +++++++++++++++++++++++++++++-
1 files changed, 29 insertions(+), 1 deletions(-)
diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c
index 7daae27..a46a73e 100644
--- a/arch/x86/platform/efi/efi.c
+++ b/arch/x86/platform/efi/efi.c
@@ -498,13 +498,41 @@ static void __init runtime_code_page_mkexec(void)
*/
void __init efi_enter_virtual_mode(void)
{
- efi_memory_desc_t *md;
+ efi_memory_desc_t *md, *prev_md = NULL;
efi_status_t status;
unsigned long size;
u64 end, systab, addr, npages, end_pfn;
void *p, *va;
efi.systab = NULL;
+
+ /* Merge contiguous regions of the same type and attribute */
+ for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) {
+ u64 prev_size;
+ md = p;
+
+ if (!prev_md) {
+ prev_md = md;
+ continue;
+ }
+
+ if (prev_md->type != md->type ||
+ prev_md->attribute != md->attribute) {
+ prev_md = md;
+ continue;
+ }
+
+ prev_size = prev_md->num_pages << EFI_PAGE_SHIFT;
+
+ if (md->phys_addr == (prev_md->phys_addr + prev_size)) {
+ prev_md->num_pages += md->num_pages;
+ md->type = EFI_RESERVED_TYPE;
+ md->attribute = 0;
+ continue;
+ }
+ prev_md = md;
+ }
+
for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) {
md = p;
if (!(md->attribute & EFI_MEMORY_RUNTIME))
next prev parent reply other threads:[~2011-05-09 23:17 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-05-05 19:19 [PATCH 1/5] efi: Remove virtual-mode SetVirtualAddressMap call Matthew Garrett
2011-05-05 19:19 ` [PATCH 2/5] efi: Consolidate EFI nx control Matthew Garrett
2011-05-09 23:16 ` [tip:x86/efi] x86, " tip-bot for Matthew Garrett
2011-05-05 19:19 ` [PATCH 3/5] efi: Merge contiguous memory regions of the same type and attribute Matthew Garrett
2011-05-09 23:17 ` tip-bot for Matthew Garrett [this message]
2011-05-05 19:19 ` [PATCH 4/5] efi: Pass a minimal map to SetVirtualAddressMap() Matthew Garrett
2011-05-09 23:17 ` [tip:x86/efi] x86, " tip-bot for Matthew Garrett
2011-05-05 19:19 ` [PATCH 5/5] efi: Ensure that the entirity of a region is mapped Matthew Garrett
2011-05-09 23:18 ` [tip:x86/efi] x86, " tip-bot for Matthew Garrett
2011-05-09 23:16 ` [tip:x86/efi] x86, efi: Remove virtual-mode SetVirtualAddressMap call tip-bot for Matthew Garrett
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-202f9d0a41809e3424af5f61489b48b622824aed@git.kernel.org \
--to=mjg@redhat.com \
--cc=hpa@linux.intel.com \
--cc=hpa@zytor.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-tip-commits@vger.kernel.org \
--cc=mingo@redhat.com \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox