xen/arm: Check for Static Heap feature when freeing resources

If the Xen heap is statically configured in Device Tree, its size is
definite, so only the defined memory shall be given to the boot
allocator. Have a check where init_domheap_pages() is called
which takes into account if static heap feature is used.

Extract static_heap flag from init data bootinfo, as it will be needed
after destroying the init data section, rename it to using_static_heap
and use it to tell whether the Xen static heap feature is enabled.

Signed-off-by: Penny Zheng <penny.zheng@arm.com>
Signed-off-by: Wei Chen <wei.chen@arm.com>
Signed-off-by: Luca Fancellu <luca.fancellu@arm.com>
Reviewed-by: Michal Orzel <michal.orzel@amd.com>
This commit is contained in:
Penny Zheng authored and Michal Orzel committed 2024-12-17 09:58:47 +01:00
1 parent df8a0eec1c
commit 4cde11cdae
9 files changed
+30 -7

No files matched your search

+2 -2
View File
@@ -199,7 +199,7 @@ void __init setup_mm(void)
total_pages = ram_size >> PAGE_SHIFT;
if ( bootinfo.static_heap )
if ( using_static_heap )
{
const struct membanks *reserved_mem = bootinfo_get_reserved_mem();
@@ -246,7 +246,7 @@ void __init setup_mm(void)
do
{
e = bootinfo.static_heap ?
e = using_static_heap ?
fit_xenheap_in_static_heap(pfn_to_paddr(xenheap_pages), MB(32)) :
consider_modules(ram_start, ram_end,
pfn_to_paddr(xenheap_pages),
+7
View File
@@ -235,6 +235,13 @@ static __init int kernel_decompress(struct bootmodule *mod, uint32_t offset)
for ( ; i < (1 << kernel_order_out); i++ )
free_domheap_page(pages + i);
/*
* When using static heap feature, don't give bootmodules memory back to
* the heap allocator
*/
if ( using_static_heap )
return 0;
/*
* When freeing the kernel, we need to pass the module start address and
* size as they were before taking an offset to gzip header into account,
+6 -2
View File
@@ -341,8 +341,12 @@ void free_init_memory(void)
if ( rc )
panic("Unable to remove the init section (rc = %d)\n", rc);
init_domheap_pages(pa, pa + len);
printk("Freed %ldkB init memory.\n", (long)(__init_end-__init_begin)>>10);
if ( !using_static_heap )
{
init_domheap_pages(pa, pa + len);
printk("Freed %ldkB init memory.\n",
(long)(__init_end-__init_begin) >> 10);
}
}
/**
+8
View File
@@ -206,6 +206,13 @@ void __init discard_initial_modules(void)
struct bootmodules *mi = &bootinfo.modules;
int i;
/*
* When using static heap feature, don't give bootmodules memory back to
* the heap allocator
*/
if ( using_static_heap )
goto out;
for ( i = 0; i < mi->nr_mods; i++ )
{
paddr_t s = mi->module[i].start;
@@ -223,6 +230,7 @@ void __init discard_initial_modules(void)
mi->nr_mods = 0;
out:
remove_early_mappings();
}
+1 -1
View File
@@ -410,7 +410,7 @@ static int __init process_chosen_node(const void *fdt, int node,
if ( rc )
return rc;
bootinfo.static_heap = true;
using_static_heap = true;
}
printk("Checking for initrd in /chosen\n");
+1 -1
View File
@@ -407,7 +407,7 @@ void __init populate_boot_allocator(void)
const struct membanks *reserved_mem = bootinfo_get_reserved_mem();
paddr_t s, e;
if ( bootinfo.static_heap )
if ( using_static_heap )
{
for ( i = 0 ; i < reserved_mem->nr_banks; i++ )
{
+3
View File
@@ -165,6 +165,9 @@
#define PGT_TYPE_INFO_INITIALIZER 0
#endif
/* Flag saved when Xen is using the static heap feature */
bool __ro_after_init using_static_heap;
unsigned long __read_mostly max_page;
unsigned long __read_mostly total_pages;
paddr_t __ro_after_init mem_hotplug;
-1
View File
@@ -139,7 +139,6 @@ struct bootinfo {
#ifdef CONFIG_STATIC_SHM
struct shared_meminfo shmem;
#endif
bool static_heap;
};
#ifdef CONFIG_ACPI
+2
View File
@@ -72,6 +72,8 @@
struct page_info;
extern bool using_static_heap;
void put_page(struct page_info *page);
bool __must_check get_page(struct page_info *page,
const struct domain *domain);
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.