Skip to content

Commit

Permalink
xen/balloon: don't use PV mode extra memory for zone device allocations
Browse files Browse the repository at this point in the history
When running as a Xen PV guest use the extra memory (memory which isn't
allocated for the guest at boot time) only for ballooning purposes and
not for zone device allocations. This will remove some code without any
lack of functionality.

While at it move some code to get rid of another #ifdef.

Remove a comment which is stale since some time now.

Signed-off-by: Juergen Gross <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Reviewed-by: Boris Ostrovsky <[email protected]>
Signed-off-by: Boris Ostrovsky <[email protected]>
  • Loading branch information
jgross1 authored and Boris Ostrovsky committed Apr 7, 2022
1 parent de2ae40 commit 262fc47
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 64 deletions.
54 changes: 23 additions & 31 deletions drivers/xen/balloon.c
Original file line number Diff line number Diff line change
Expand Up @@ -689,29 +689,34 @@ void xen_free_ballooned_pages(unsigned int nr_pages, struct page **pages)
}
EXPORT_SYMBOL(xen_free_ballooned_pages);

#if defined(CONFIG_XEN_PV) && !defined(CONFIG_XEN_UNPOPULATED_ALLOC)
static void __init balloon_add_region(unsigned long start_pfn,
unsigned long pages)
static void __init balloon_add_regions(void)
{
#if defined(CONFIG_XEN_PV)
unsigned long start_pfn, pages;
unsigned long pfn, extra_pfn_end;
unsigned int i;

/*
* If the amount of usable memory has been limited (e.g., with
* the 'mem' command line parameter), don't add pages beyond
* this limit.
*/
extra_pfn_end = min(max_pfn, start_pfn + pages);
for (i = 0; i < XEN_EXTRA_MEM_MAX_REGIONS; i++) {
pages = xen_extra_mem[i].n_pfns;
if (!pages)
continue;

for (pfn = start_pfn; pfn < extra_pfn_end; pfn++) {
/* totalram_pages and totalhigh_pages do not
include the boot-time balloon extension, so
don't subtract from it. */
balloon_append(pfn_to_page(pfn));
}
start_pfn = xen_extra_mem[i].start_pfn;

balloon_stats.total_pages += extra_pfn_end - start_pfn;
}
/*
* If the amount of usable memory has been limited (e.g., with
* the 'mem' command line parameter), don't add pages beyond
* this limit.
*/
extra_pfn_end = min(max_pfn, start_pfn + pages);

for (pfn = start_pfn; pfn < extra_pfn_end; pfn++)
balloon_append(pfn_to_page(pfn));

balloon_stats.total_pages += extra_pfn_end - start_pfn;
}
#endif
}

static int __init balloon_init(void)
{
Expand Down Expand Up @@ -745,20 +750,7 @@ static int __init balloon_init(void)
register_sysctl_table(xen_root);
#endif

#if defined(CONFIG_XEN_PV) && !defined(CONFIG_XEN_UNPOPULATED_ALLOC)
{
int i;

/*
* Initialize the balloon with pages from the extra memory
* regions (see arch/x86/xen/setup.c).
*/
for (i = 0; i < XEN_EXTRA_MEM_MAX_REGIONS; i++)
if (xen_extra_mem[i].n_pfns)
balloon_add_region(xen_extra_mem[i].start_pfn,
xen_extra_mem[i].n_pfns);
}
#endif
balloon_add_regions();

task = kthread_run(balloon_thread, NULL, "xen-balloon");
if (IS_ERR(task)) {
Expand Down
33 changes: 0 additions & 33 deletions drivers/xen/unpopulated-alloc.c
Original file line number Diff line number Diff line change
Expand Up @@ -230,39 +230,6 @@ void xen_free_unpopulated_pages(unsigned int nr_pages, struct page **pages)
}
EXPORT_SYMBOL(xen_free_unpopulated_pages);

#ifdef CONFIG_XEN_PV
static int __init init(void)
{
unsigned int i;

if (!xen_domain())
return -ENODEV;

if (!xen_pv_domain())
return 0;

/*
* Initialize with pages from the extra memory regions (see
* arch/x86/xen/setup.c).
*/
for (i = 0; i < XEN_EXTRA_MEM_MAX_REGIONS; i++) {
unsigned int j;

for (j = 0; j < xen_extra_mem[i].n_pfns; j++) {
struct page *pg =
pfn_to_page(xen_extra_mem[i].start_pfn + j);

pg->zone_device_data = page_list;
page_list = pg;
list_count++;
}
}

return 0;
}
subsys_initcall(init);
#endif

static int __init unpopulated_init(void)
{
int ret;
Expand Down

0 comments on commit 262fc47

Please sign in to comment.