From: Oreoluwa Babatunde <quic_obabatun@quicinc.com>
To: <catalin.marinas@arm.com>, <will@kernel.org>,
<robh+dt@kernel.org>, <frowand.list@gmail.com>
Cc: <linux-arm-kernel@lists.infradead.org>,
<linux-kernel@vger.kernel.org>, <devicetree@vger.kernel.org>,
<linux-arm-msm@vger.kernel.org>, <kernel@quicinc.com>,
Oreoluwa Babatunde <quic_obabatun@quicinc.com>
Subject: [RFC PATCH 0/3] Dynamic allocation of reserved_mem array.
Date: Thu, 19 Oct 2023 11:48:22 -0700 [thread overview]
Message-ID: <20231019184825.9712-1-quic_obabatun@quicinc.com> (raw)
The reserved_mem array is used to store the data of the different
reserved memory regions specified in the DT of a device.
The array stores information such as the name, node, starting address,
and size of a reserved memory region.
The array is currently statically allocated with a size of
MAX_RESERVED_REGIONS(64). This means that any system that specifies a
number of reserved memory regions greater than MAX_RESERVED_REGIONS(64)
will not have enough space to store the information for all the regions.
Therefore, this series changes the reserved_mem array from a static
array with a fixed size of MAX_RESERVED_REGIONS(64), to a dynamically
allocated array, using memblock_alloc(), based on the number of reserved
memory regions specified in the DT.
Memory gotten from memblock_alloc() is only writable after paging_init()
is called, but the reserved memory regions need to be reserved before
then so that the system does not create page table mappings for them.
It is possible to call memblock_resverve() and memblock_mark_nomap() on
the reserved memory regions and not need to save them to the array until
we dynamically allocate the array after paging_init(), but this becomes
an issue with reserved memory regions that do not have their starting
address specified in the DT.
i.e. regions specified with the "alloc_ranges" and "size" properties.
Therefore, this series achieves the allocation and population of the
reserved_mem array in two steps:
1. Before paging_init()
Before paging_init() is called, iterate through the reserved_mem
nodes in the DT and do the following:
- Allocate memory for dynamically placed reserved memory regions and
store their starting address in the static allocated reserved_mem
array.
- Call memblock_reserve() and memblock_mark_nomap() on all the
reserved memory regions.
- Count the total number of reserved_mem nodes in the DT.
2. After paging_init()
After paging_init() is called:
- Allocate new memory for the reserved_mem array based on the number
of reserved memory nodes in the DT.
- Transfer all the information that was stored in the static array
into the new array.
- Store the rest of the reserved_mem regions in the new array.
i.e. reserved memory nodes specified with the "reg" property.
The static array is no longer needed after this point, but there is
currently no obvious way to free the memory. Therefore, the size of the
initial static array is now defined using a config option.
Since its size would vary depending on the user, scaling it can help get
some memory savings.
Oreoluwa Babatunde (3):
of: reserved_mem: Change the order that reserved_mem regions are
stored
of: reserved_mem: Add code to dynamically allocate reserved_mem array
of: reserved_mem: Make MAX_RESERVED_REGIONS a config option
arch/arm64/kernel/setup.c | 4 ++
drivers/of/Kconfig | 13 ++++
drivers/of/fdt.c | 63 +++++++++++++++----
drivers/of/of_private.h | 3 +-
drivers/of/of_reserved_mem.c | 108 ++++++++++++++++++++++----------
include/linux/of_fdt.h | 1 +
include/linux/of_reserved_mem.h | 9 +++
7 files changed, 154 insertions(+), 47 deletions(-)
--
2.17.1
next reply other threads:[~2023-10-19 18:49 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-10-19 18:48 Oreoluwa Babatunde [this message]
2023-10-19 18:48 ` [RFC PATCH 1/3] of: reserved_mem: Change the order that reserved_mem regions are stored Oreoluwa Babatunde
2023-10-19 19:46 ` Rob Herring
2023-10-19 22:45 ` Oreoluwa Babatunde
2023-10-24 19:15 ` Rob Herring
2023-10-24 19:32 ` Rob Herring
2023-12-04 4:18 ` Oreoluwa Babatunde
2023-10-19 18:48 ` [RFC PATCH 2/3] of: reserved_mem: Add code to dynamically allocate reserved_mem array Oreoluwa Babatunde
2023-10-19 18:48 ` [RFC PATCH 3/3] of: reserved_mem: Make MAX_RESERVED_REGIONS a config option Oreoluwa Babatunde
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=20231019184825.9712-1-quic_obabatun@quicinc.com \
--to=quic_obabatun@quicinc.com \
--cc=catalin.marinas@arm.com \
--cc=devicetree@vger.kernel.org \
--cc=frowand.list@gmail.com \
--cc=kernel@quicinc.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=robh+dt@kernel.org \
--cc=will@kernel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).