mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 10:11:27 +01:00
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:
1 parent
df8a0eec1c
commit
4cde11cdae
9 files changed
+30
-7
No files matched your search
@@ -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),
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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++ )
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -139,7 +139,6 @@ struct bootinfo {
|
||||
#ifdef CONFIG_STATIC_SHM
|
||||
struct shared_meminfo shmem;
|
||||
#endif
|
||||
bool static_heap;
|
||||
};
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
|
||||
@@ -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);
|
||||
|
||||