Skip to content

Commit b9c242b

Browse files
Igor Druzhiningregkh
authored andcommitted
Revert "xen/balloon: Mark unallocated host memory as UNUSABLE"
[ Upstream commit 1236641 ] This reverts commit b3cf852. That commit unintentionally broke Xen balloon memory hotplug with "hotplug_unpopulated" set to 1. As long as "System RAM" resource got assigned under a new "Unusable memory" resource in IO/Mem tree any attempt to online this memory would fail due to general kernel restrictions on having "System RAM" resources as 1st level only. The original issue that commit has tried to workaround fa564ad ("x86/PCI: Enable a 64bit BAR on AMD Family 15h (Models 00-1f, 30-3f, 60-7f)") also got amended by the following 03a5517 ("x86/PCI: Move and shrink AMD 64-bit window to avoid conflict") which made the original fix to Xen ballooning unnecessary. Signed-off-by: Igor Druzhinin <[email protected]> Reviewed-by: Boris Ostrovsky <[email protected]> Signed-off-by: Juergen Gross <[email protected]> Signed-off-by: Sasha Levin <[email protected]>
1 parent f02e0d5 commit b9c242b

File tree

4 files changed

+13
-141
lines changed

4 files changed

+13
-141
lines changed

arch/x86/xen/enlighten.c

Lines changed: 0 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77

88
#include <xen/features.h>
99
#include <xen/page.h>
10-
#include <xen/interface/memory.h>
1110

1211
#include <asm/xen/hypercall.h>
1312
#include <asm/xen/hypervisor.h>
@@ -336,80 +335,3 @@ void xen_arch_unregister_cpu(int num)
336335
}
337336
EXPORT_SYMBOL(xen_arch_unregister_cpu);
338337
#endif
339-
340-
#ifdef CONFIG_XEN_BALLOON_MEMORY_HOTPLUG
341-
void __init arch_xen_balloon_init(struct resource *hostmem_resource)
342-
{
343-
struct xen_memory_map memmap;
344-
int rc;
345-
unsigned int i, last_guest_ram;
346-
phys_addr_t max_addr = PFN_PHYS(max_pfn);
347-
struct e820_table *xen_e820_table;
348-
const struct e820_entry *entry;
349-
struct resource *res;
350-
351-
if (!xen_initial_domain())
352-
return;
353-
354-
xen_e820_table = kmalloc(sizeof(*xen_e820_table), GFP_KERNEL);
355-
if (!xen_e820_table)
356-
return;
357-
358-
memmap.nr_entries = ARRAY_SIZE(xen_e820_table->entries);
359-
set_xen_guest_handle(memmap.buffer, xen_e820_table->entries);
360-
rc = HYPERVISOR_memory_op(XENMEM_machine_memory_map, &memmap);
361-
if (rc) {
362-
pr_warn("%s: Can't read host e820 (%d)\n", __func__, rc);
363-
goto out;
364-
}
365-
366-
last_guest_ram = 0;
367-
for (i = 0; i < memmap.nr_entries; i++) {
368-
if (xen_e820_table->entries[i].addr >= max_addr)
369-
break;
370-
if (xen_e820_table->entries[i].type == E820_TYPE_RAM)
371-
last_guest_ram = i;
372-
}
373-
374-
entry = &xen_e820_table->entries[last_guest_ram];
375-
if (max_addr >= entry->addr + entry->size)
376-
goto out; /* No unallocated host RAM. */
377-
378-
hostmem_resource->start = max_addr;
379-
hostmem_resource->end = entry->addr + entry->size;
380-
381-
/*
382-
* Mark non-RAM regions between the end of dom0 RAM and end of host RAM
383-
* as unavailable. The rest of that region can be used for hotplug-based
384-
* ballooning.
385-
*/
386-
for (; i < memmap.nr_entries; i++) {
387-
entry = &xen_e820_table->entries[i];
388-
389-
if (entry->type == E820_TYPE_RAM)
390-
continue;
391-
392-
if (entry->addr >= hostmem_resource->end)
393-
break;
394-
395-
res = kzalloc(sizeof(*res), GFP_KERNEL);
396-
if (!res)
397-
goto out;
398-
399-
res->name = "Unavailable host RAM";
400-
res->start = entry->addr;
401-
res->end = (entry->addr + entry->size < hostmem_resource->end) ?
402-
entry->addr + entry->size : hostmem_resource->end;
403-
rc = insert_resource(hostmem_resource, res);
404-
if (rc) {
405-
pr_warn("%s: Can't insert [%llx - %llx) (%d)\n",
406-
__func__, res->start, res->end, rc);
407-
kfree(res);
408-
goto out;
409-
}
410-
}
411-
412-
out:
413-
kfree(xen_e820_table);
414-
}
415-
#endif /* CONFIG_XEN_BALLOON_MEMORY_HOTPLUG */

arch/x86/xen/setup.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -808,6 +808,7 @@ char * __init xen_memory_setup(void)
808808
addr = xen_e820_table.entries[0].addr;
809809
size = xen_e820_table.entries[0].size;
810810
while (i < xen_e820_table.nr_entries) {
811+
bool discard = false;
811812

812813
chunk_size = size;
813814
type = xen_e820_table.entries[i].type;
@@ -823,10 +824,11 @@ char * __init xen_memory_setup(void)
823824
xen_add_extra_mem(pfn_s, n_pfns);
824825
xen_max_p2m_pfn = pfn_s + n_pfns;
825826
} else
826-
type = E820_TYPE_UNUSABLE;
827+
discard = true;
827828
}
828829

829-
xen_align_and_add_e820_region(addr, chunk_size, type);
830+
if (!discard)
831+
xen_align_and_add_e820_region(addr, chunk_size, type);
830832

831833
addr += chunk_size;
832834
size -= chunk_size;

drivers/xen/balloon.c

Lines changed: 9 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -257,25 +257,10 @@ static void release_memory_resource(struct resource *resource)
257257
kfree(resource);
258258
}
259259

260-
/*
261-
* Host memory not allocated to dom0. We can use this range for hotplug-based
262-
* ballooning.
263-
*
264-
* It's a type-less resource. Setting IORESOURCE_MEM will make resource
265-
* management algorithms (arch_remove_reservations()) look into guest e820,
266-
* which we don't want.
267-
*/
268-
static struct resource hostmem_resource = {
269-
.name = "Host RAM",
270-
};
271-
272-
void __attribute__((weak)) __init arch_xen_balloon_init(struct resource *res)
273-
{}
274-
275260
static struct resource *additional_memory_resource(phys_addr_t size)
276261
{
277-
struct resource *res, *res_hostmem;
278-
int ret = -ENOMEM;
262+
struct resource *res;
263+
int ret;
279264

280265
res = kzalloc(sizeof(*res), GFP_KERNEL);
281266
if (!res)
@@ -284,42 +269,13 @@ static struct resource *additional_memory_resource(phys_addr_t size)
284269
res->name = "System RAM";
285270
res->flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY;
286271

287-
res_hostmem = kzalloc(sizeof(*res), GFP_KERNEL);
288-
if (res_hostmem) {
289-
/* Try to grab a range from hostmem */
290-
res_hostmem->name = "Host memory";
291-
ret = allocate_resource(&hostmem_resource, res_hostmem,
292-
size, 0, -1,
293-
PAGES_PER_SECTION * PAGE_SIZE, NULL, NULL);
294-
}
295-
296-
if (!ret) {
297-
/*
298-
* Insert this resource into iomem. Because hostmem_resource
299-
* tracks portion of guest e820 marked as UNUSABLE noone else
300-
* should try to use it.
301-
*/
302-
res->start = res_hostmem->start;
303-
res->end = res_hostmem->end;
304-
ret = insert_resource(&iomem_resource, res);
305-
if (ret < 0) {
306-
pr_err("Can't insert iomem_resource [%llx - %llx]\n",
307-
res->start, res->end);
308-
release_memory_resource(res_hostmem);
309-
res_hostmem = NULL;
310-
res->start = res->end = 0;
311-
}
312-
}
313-
314-
if (ret) {
315-
ret = allocate_resource(&iomem_resource, res,
316-
size, 0, -1,
317-
PAGES_PER_SECTION * PAGE_SIZE, NULL, NULL);
318-
if (ret < 0) {
319-
pr_err("Cannot allocate new System RAM resource\n");
320-
kfree(res);
321-
return NULL;
322-
}
272+
ret = allocate_resource(&iomem_resource, res,
273+
size, 0, -1,
274+
PAGES_PER_SECTION * PAGE_SIZE, NULL, NULL);
275+
if (ret < 0) {
276+
pr_err("Cannot allocate new System RAM resource\n");
277+
kfree(res);
278+
return NULL;
323279
}
324280

325281
#ifdef CONFIG_SPARSEMEM
@@ -331,7 +287,6 @@ static struct resource *additional_memory_resource(phys_addr_t size)
331287
pr_err("New System RAM resource outside addressable RAM (%lu > %lu)\n",
332288
pfn, limit);
333289
release_memory_resource(res);
334-
release_memory_resource(res_hostmem);
335290
return NULL;
336291
}
337292
}
@@ -810,8 +765,6 @@ static int __init balloon_init(void)
810765
set_online_page_callback(&xen_online_page);
811766
register_memory_notifier(&xen_memory_nb);
812767
register_sysctl_table(xen_root);
813-
814-
arch_xen_balloon_init(&hostmem_resource);
815768
#endif
816769

817770
#ifdef CONFIG_XEN_PV

include/xen/balloon.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,3 @@ static inline void xen_balloon_init(void)
4444
{
4545
}
4646
#endif
47-
48-
#ifdef CONFIG_XEN_BALLOON_MEMORY_HOTPLUG
49-
struct resource;
50-
void arch_xen_balloon_init(struct resource *hostmem_resource);
51-
#endif

0 commit comments

Comments
 (0)