[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] x86/xen: Fix a potential problem in xen_e820_resolve_conflicts()



When fixing a conflict in xen_e820_resolve_conflicts(), the loop over
the E820 map entries needs to be restarted, as the E820 map will have
been modified by the fix. Otherwise entries might be skipped by
accident.

Fixes: be35d91c8880 ("xen: tolerate ACPI NVS memory overlapping with Xen 
allocated memory")
Signed-off-by: Juergen Gross <jgross@xxxxxxxx>
---
 arch/x86/xen/setup.c | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/arch/x86/xen/setup.c b/arch/x86/xen/setup.c
index ac8021c3a997..bb95a05259b8 100644
--- a/arch/x86/xen/setup.c
+++ b/arch/x86/xen/setup.c
@@ -695,17 +695,22 @@ static void __init xen_e820_resolve_conflicts(phys_addr_t 
start,
                return;
 
        end = start + size;
-       entry = xen_e820_table.entries;
+       mapcnt = 0;
 
-       for (mapcnt = 0; mapcnt < xen_e820_table.nr_entries; mapcnt++) {
+       while (mapcnt < xen_e820_table.nr_entries) {
+               entry = xen_e820_table.entries + mapcnt;
                if (entry->addr >= end)
                        return;
 
                if (entry->addr + entry->size > start &&
-                   entry->type == E820_TYPE_NVS)
+                   entry->type == E820_TYPE_NVS) {
                        xen_e820_swap_entry_with_ram(entry);
+                       /* E820 map has been changed, restart loop! */
+                       mapcnt = 0;
+                       continue;
+               }
 
-               entry++;
+               mapcnt++;
        }
 }
 
-- 
2.54.0




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.