diff options
author | KarimAllah Ahmed <karahmed@amazon.de> | 2019-01-31 15:24:44 -0500 |
---|---|---|
committer | Paolo Bonzini <pbonzini@redhat.com> | 2019-04-30 15:49:46 -0400 |
commit | 0c55671f84fffe591e8435c93a8c83286fd6b8eb (patch) | |
tree | 19ffa33fdc2f35cadd344f601b60810b3758fcd1 /arch/x86/kernel/e820.c | |
parent | e0bf2665ca26c1f6d6909de29bd382e7a5ee41e7 (diff) |
kvm, x86: Properly check whether a pfn is an MMIO or not
pfn_valid check is not sufficient because it only checks if a page has a struct
page or not, if "mem=" was passed to the kernel some valid pages won't have a
struct page. This means that if guests were assigned valid memory that lies
after the mem= boundary it will be passed uncached to the guest no matter what
the guest caching attributes are for this memory.
Introduce a new function e820__mapped_raw_any which is equivalent to
e820__mapped_any but uses the original e820 unmodified and use it to
identify real *RAM*.
Signed-off-by: KarimAllah Ahmed <karahmed@amazon.de>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'arch/x86/kernel/e820.c')
-rw-r--r-- | arch/x86/kernel/e820.c | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/arch/x86/kernel/e820.c b/arch/x86/kernel/e820.c index 2879e234e193..76dd605ee2a3 100644 --- a/arch/x86/kernel/e820.c +++ b/arch/x86/kernel/e820.c | |||
@@ -73,12 +73,13 @@ EXPORT_SYMBOL(pci_mem_start); | |||
73 | * This function checks if any part of the range <start,end> is mapped | 73 | * This function checks if any part of the range <start,end> is mapped |
74 | * with type. | 74 | * with type. |
75 | */ | 75 | */ |
76 | bool e820__mapped_any(u64 start, u64 end, enum e820_type type) | 76 | static bool _e820__mapped_any(struct e820_table *table, |
77 | u64 start, u64 end, enum e820_type type) | ||
77 | { | 78 | { |
78 | int i; | 79 | int i; |
79 | 80 | ||
80 | for (i = 0; i < e820_table->nr_entries; i++) { | 81 | for (i = 0; i < table->nr_entries; i++) { |
81 | struct e820_entry *entry = &e820_table->entries[i]; | 82 | struct e820_entry *entry = &table->entries[i]; |
82 | 83 | ||
83 | if (type && entry->type != type) | 84 | if (type && entry->type != type) |
84 | continue; | 85 | continue; |
@@ -88,6 +89,17 @@ bool e820__mapped_any(u64 start, u64 end, enum e820_type type) | |||
88 | } | 89 | } |
89 | return 0; | 90 | return 0; |
90 | } | 91 | } |
92 | |||
93 | bool e820__mapped_raw_any(u64 start, u64 end, enum e820_type type) | ||
94 | { | ||
95 | return _e820__mapped_any(e820_table_firmware, start, end, type); | ||
96 | } | ||
97 | EXPORT_SYMBOL_GPL(e820__mapped_raw_any); | ||
98 | |||
99 | bool e820__mapped_any(u64 start, u64 end, enum e820_type type) | ||
100 | { | ||
101 | return _e820__mapped_any(e820_table, start, end, type); | ||
102 | } | ||
91 | EXPORT_SYMBOL_GPL(e820__mapped_any); | 103 | EXPORT_SYMBOL_GPL(e820__mapped_any); |
92 | 104 | ||
93 | /* | 105 | /* |