From: Michal Orzel <michal.orzel@amd.com>
To: Luca Fancellu <luca.fancellu@arm.com>, <xen-devel@lists.xenproject.org>
Cc: "Penny Zheng" <Penny.Zheng@arm.com>,
"Stefano Stabellini" <sstabellini@kernel.org>,
"Julien Grall" <julien@xen.org>,
"Bertrand Marquis" <bertrand.marquis@arm.com>,
"Volodymyr Babchuk" <Volodymyr_Babchuk@epam.com>,
"Andrew Cooper" <andrew.cooper3@citrix.com>,
"Anthony PERARD" <anthony.perard@vates.tech>,
"Jan Beulich" <jbeulich@suse.com>,
"Roger Pau Monné" <roger.pau@citrix.com>,
"Wei Chen" <wei.chen@arm.com>
Subject: Re: [PATCH v6] xen/arm: Check for Static Heap feature when freeing resources
Date: Thu, 12 Dec 2024 11:58:19 +0100 [thread overview]
Message-ID: <f2ed8708-b9e7-4d4c-93bd-451a500d6943@amd.com> (raw)
In-Reply-To: <20241212093037.2916713-1-luca.fancellu@arm.com>
On 12/12/2024 10:30, Luca Fancellu wrote:
>
>
> From: Penny Zheng <Penny.Zheng@arm.com>
>
> 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>
> ---
> Changes from v5:
> - Drop Jan R-by due to the code changes
> - Static heap is not dependent on static memory, so delete #ifdefs
> for CONFIG_STATIC_MEMORY
> Changes from v4:
> - Add R-by Jan
> - Changed code to reduce nesting in discard_initial_modules (Julien)
> Changes from v3:
> - Removed helper using_static_heap(), renamed static_heap variable
> to using_static_heap and simplified #ifdef-ary (Jan suggestion)
> Changes from v2:
> - Change xen_is_using_staticheap() to using_static_heap()
> - Move declaration of static_heap to xen/mm.h and import that in
> bootfdt.h
> - Reprased first part of the commit message
> Changes from v1:
> - moved static_heap to common/page_alloc.c
> - protect static_heap access with CONFIG_STATIC_MEMORY
> - update comment in arm/kernel.c kernel_decompress()
> ---
> ---
> xen/arch/arm/arm32/mmu/mm.c | 4 ++--
> xen/arch/arm/kernel.c | 7 ++++---
> xen/arch/arm/mmu/setup.c | 8 ++++++--
> xen/arch/arm/setup.c | 3 +++
> xen/common/device-tree/bootfdt.c | 2 +-
> xen/common/device-tree/bootinfo.c | 2 +-
> xen/common/page_alloc.c | 3 +++
> xen/include/xen/bootfdt.h | 1 -
> xen/include/xen/mm.h | 2 ++
> 9 files changed, 22 insertions(+), 10 deletions(-)
>
> diff --git a/xen/arch/arm/arm32/mmu/mm.c b/xen/arch/arm/arm32/mmu/mm.c
> index 063611412be0..0824d61323b5 100644
> --- a/xen/arch/arm/arm32/mmu/mm.c
> +++ b/xen/arch/arm/arm32/mmu/mm.c
> @@ -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),
> diff --git a/xen/arch/arm/kernel.c b/xen/arch/arm/kernel.c
> index 293d7efaed9c..8270684246ea 100644
> --- a/xen/arch/arm/kernel.c
> +++ b/xen/arch/arm/kernel.c
> @@ -244,10 +244,11 @@ static __init int kernel_decompress(struct bootmodule *mod, uint32_t offset)
> size += offset;
>
> /*
> - * Free the original kernel, update the pointers to the
> - * decompressed kernel
> + * In case Xen is not using the static heap feature, free the original
> + * kernel, update the pointers to the decompressed kernel
> */
> - fw_unreserved_regions(addr, addr + size, init_domheap_pages, 0);
> + if ( !using_static_heap )
You should get out of this function even earlier, before calculating addr and size that are only
used in fw_unreserved_regions.
> + fw_unreserved_regions(addr, addr + size, init_domheap_pages, 0);
>
> return 0;
> }
> diff --git a/xen/arch/arm/mmu/setup.c b/xen/arch/arm/mmu/setup.c
> index 9664e85ee6c0..8c87649bc88e 100644
> --- a/xen/arch/arm/mmu/setup.c
> +++ b/xen/arch/arm/mmu/setup.c
> @@ -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 )
So here, you allow the init region mappings to be destroyed (above), yet ...
> + {
> + init_domheap_pages(pa, pa + len);
> + printk("Freed %ldkB init memory.\n",
> + (long)(__init_end-__init_begin) >> 10);
> + }
> }
>
> /**
> diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c
> index 2e27af4560a5..85f743a2c6ad 100644
> --- a/xen/arch/arm/setup.c
> +++ b/xen/arch/arm/setup.c
> @@ -206,6 +206,9 @@ void __init discard_initial_modules(void)
> struct bootmodules *mi = &bootinfo.modules;
> int i;
>
> + if ( using_static_heap )
> + return;
... here you would get out without calling remove_early_mappings() that today destroys early FDT
mappings. IMO you should allow to call remove_early_mappings().
With the remarks addressed:
Reviewed-by: Michal Orzel <michal.orzel@amd.com>
~Michal
prev parent reply other threads:[~2024-12-12 10:58 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-12-12 9:30 [PATCH v6] xen/arm: Check for Static Heap feature when freeing resources Luca Fancellu
2024-12-12 10:58 ` Michal Orzel [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=f2ed8708-b9e7-4d4c-93bd-451a500d6943@amd.com \
--to=michal.orzel@amd.com \
--cc=Penny.Zheng@arm.com \
--cc=Volodymyr_Babchuk@epam.com \
--cc=andrew.cooper3@citrix.com \
--cc=anthony.perard@vates.tech \
--cc=bertrand.marquis@arm.com \
--cc=jbeulich@suse.com \
--cc=julien@xen.org \
--cc=luca.fancellu@arm.com \
--cc=roger.pau@citrix.com \
--cc=sstabellini@kernel.org \
--cc=wei.chen@arm.com \
--cc=xen-devel@lists.xenproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.