]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
x86/xen: Fix a potential problem in xen_e820_resolve_conflicts()
authorJuergen Gross <jgross@suse.com>
Tue, 5 May 2026 08:06:53 +0000 (10:06 +0200)
committerIngo Molnar <mingo@kernel.org>
Tue, 5 May 2026 08:17:00 +0000 (10:17 +0200)
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@suse.com>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Cc: xen-devel@lists.xenproject.org
Link: https://patch.msgid.link/20260505080653.197775-1-jgross@suse.com
arch/x86/xen/setup.c

index ac8021c3a997e0bdbe686362b7052230eae791bc..bb95a05259b895d719322612db296019316c01e6 100644 (file)
@@ -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++;
        }
 }