devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Rob Herring <robh@kernel.org>
To: Oreoluwa Babatunde <quic_obabatun@quicinc.com>
Cc: catalin.marinas@arm.com, will@kernel.org, frowand.list@gmail.com,
	vgupta@kernel.org, arnd@arndb.de, olof@lixom.net, soc@kernel.org,
	guoren@kernel.org, monstr@monstr.eu, palmer@dabbelt.com,
	aou@eecs.berkeley.edu, dinguyen@kernel.org,
	chenhuacai@kernel.org, tsbogend@alpha.franken.de,
	jonas@southpole.se, stefan.kristiansson@saunalahti.fi,
	shorne@gmail.com, mpe@ellerman.id.au, ysato@users.sourceforge.jp,
	dalias@libc.org, glaubitz@physik.fu-berlin.de, richard@nod.at,
	anton.ivanov@cambridgegreys.com, johannes@sipsolutions.net,
	chris@zankel.net, jcmvbkbc@gmail.com,
	linux-arm-kernel@lists.infradead.org,
	linux-kernel@vger.kernel.org, devicetree@vger.kernel.org,
	linux-arm-msm@vger.kernel.org, kernel@quicinc.com
Subject: Re: [PATCH 00/46] Dynamic allocation of reserved_mem array.
Date: Tue, 30 Jan 2024 18:07:10 -0600	[thread overview]
Message-ID: <20240131000710.GA2581425-robh@kernel.org> (raw)
In-Reply-To: <20240126235425.12233-1-quic_obabatun@quicinc.com>

On Fri, Jan 26, 2024 at 03:53:39PM -0800, Oreoluwa Babatunde wrote:
> The reserved_mem array is used to store data for the different
> reserved memory regions defined in the DT of a device.  The array
> stores information such as region name, node, start-address, and size
> of the reserved memory regions.
> 
> 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 extends the use of the static array for
> reserved_mem, and introduces a dynamically allocated array using
> memblock_alloc() based on the number of reserved memory regions
> specified in the DT.
> 
> Some architectures such as arm64 require the page tables to be setup
> before memblock allocated memory is writable.  Therefore, the dynamic
> allocation of the reserved_mem array will need to be done after the
> page tables have been setup on these architectures. In most cases that
> will be after paging_init().
> 
> Reserved memory regions can be divided into 2 groups.
> i) Statically-placed reserved memory regions
> i.e. regions defined in the DT using the @reg property.
> ii) Dynamically-placed reserved memory regions.
> i.e. regions specified in the DT using the @alloc_ranges
>     and @size properties.
> 
> It is possible to call memblock_reserve() and memblock_mark_nomap() on
> the statically-placed reserved memory regions and not need to save them
> to the reserved_mem array until memory is allocated for it using
> memblock, which will be after the page tables have been setup.
> For the dynamically-placed reserved memory regions, it is not possible
> to wait to store its information because the starting address is
> allocated only at run time, and hence they need to be stored somewhere
> after they are allocated.
> Waiting until after the page tables have been setup to allocate memory
> for the dynamically-placed regions is also not an option because the
> allocations will come from memory that have already been added to the
> page tables, which is not good for memory that is supposed to be
> reserved and/or marked as nomap.
> 
> Therefore, this series splits up the processing of the reserved memory
> regions into two stages, of which the first stage is carried out by
> early_init_fdt_scan_reserved_mem() and the second is carried out by
> fdt_init_reserved_mem().
> 
> The early_init_fdt_scan_reserved_mem(), which is called before the page
> tables are setup is used to:
> 1. Call memblock_reserve() and memblock_mark_nomap() on all the
>    statically-placed reserved memory regions as needed.
> 2. Allocate memory from memblock for the dynamically-placed reserved
>    memory regions and store them in the static array for reserved_mem.
>    memblock_reserve() and memblock_mark_nomap() are also called as
>    needed on all the memory allocated for the dynamically-placed
>    regions.
> 3. Count the total number of reserved memory regions found in the DT.
> 
> fdt_init_reserved_mem(), which should be called after the page tables
> have been setup, is used to carry out the following:
> 1. Allocate memory for the reserved_mem array based on the number of
>    reserved memory regions counted as mentioned above.
> 2. Copy all the information for the dynamically-placed reserved memory
>    regions from the static array into the new allocated memory for the
>    reserved_mem array.
> 3. Add the information for the statically-placed reserved memory into
>    reserved_mem array.
> 4. Run the region specific init functions for each of the reserve memory
>    regions saved in the reserved_mem array.

I don't see the need for fdt_init_reserved_mem() to be explicitly called 
by arch code. I said this already, but that can be done at the same time 
as unflattening the DT. The same conditions are needed for both: we need 
to be able to allocate memory from memblock.

To put it another way, if fdt_init_reserved_mem() can be called "early", 
then unflattening could be moved earlier as well. Though I don't think 
we should optimize that. I'd rather see all arches call the DT functions 
at the same stages.

> Once the above steps have been completed and the init process is done
> running, the original statically allocated reserved_mem array of size
> MAX_RESERVED_REGIONS(64) will be automatically freed back to buddy
> because it is no longer needed. This is done by marking the array as an
> "__initdata" object in Patch 0018.
> 
> Note:
> 
> - Per Architecture, this series is effectively only 10 patches. The
>   code for each architecture is split up into separate patches to
>   allow each architecture to be tested independently of changes from
>   other architectures. Should this series be accepted, this should
>   allow for each arcitecture change to be picked up independently as
>   well.

Only if patches 1 and 2 are accepted in one cycle and the arch ones in 
the next cycle. No need for that though, I can take the whole thing 
(when it's ready).


> 
>   Patch 0001: Splits up the processing of the reserved memory regions
>   between early_init_fdt_scan_reserved_mem and fdt_init_reserved_mem.
> 
>   Patch 0002: Introduces a copy of early_init_fdt_scan_reserved_mem()
>   which is used to separate it from fdt_init_reserved_mem() so that the
>   two functions can be called independently of each other.
> 
>   Patch 0003 - Patch 0016: Duplicated change for each architecture to
>   call early_init_fdt_scan_reserved_mem() and fdt_init_reserved_mem()
>   at their appropriate locations. Here fdt_init_reserved_mem() is called
>   either before of after the page tables have been setup depending on
>   the architecture requirements.
> 
>   Patch 0017: Deletes the early_init_fdt_scan_reserved_mem() function
>   since all architectures are now using the copy introduced in
>   Patch 0002.
> 
>   Patch 0018: Dynamically allocate memory for the reserved_mem array
>   based on the total number of reserved memory regions specified in the
>   DT.
> 
>   Patch 0019 - Patch 0029: Duplicated change for each architecture to
>   move the fdt_init_reserved_mem() function call to below the
>   unflatten_devicetree() function call. This is so that the unflatten
>   devicetree APIs can be used to process the reserved memory regions.
> 
>   Patch 0030: Make code changes to start using the unflatten devicetree
>   APIs to access the reserved memory regions defined in the DT.
> 
>   Patch 0031: Rename fdt_* functions as dt_* to refelct that the
>   flattened devicetree (fdt) APIs have been replaced with the unflatten
>   devicetree APIs.
> 
>   Patch 0032 - Patch 0045: Duplicated change for each architecture to
>   switch from the use of fdt_init_reserved_mem() to
>   dt_init_reserved_mem(), which is the same function but the later uses
>   the unflatten devicetree APIs.
> 
>   Patch 0046: Delete the fdt_init_reserved_mem() function as all
>   architectures have switched to using dt_init_reserved_mem() which was
>   introduced in Patch 0031.
> 
> - The limitation to this approach is that there is still a limit of
>   64 for dynamically-placed reserved memory regions. But from my current
>   analysis, these types of reserved memory regions are generally less
>   in number when compared to the statically-placed reserved memory
>   regions.
> 
> - I have looked through all architectures and placed the call to
>   memblock_alloc() for the reserved_mem array at points where I
>   believe memblock allocated memory are available to be written to.
>   I currently only have access to an arm64 device and this is where I am
>   testing the functionality of this series. Hence, I will need help from
>   architecture maintainers to test this series on other architectures to
>   ensure that the code is functioning properly on there.
> 
> Previous patch revisions:
> 1. [RFC V1 Patchset]:
> https://lore.kernel.org/all/20231019184825.9712-1-quic_obabatun@quicinc.com/
> 
> 2. [RFC V2 Patchset]:
> https://lore.kernel.org/all/20231204041339.9902-1-quic_obabatun@quicinc.com/
> - Extend changes to all other relevant architectures.
> - Add code to use unflatten devicetree APIs to process the reserved
>   memory regions.

Dropping RFC does not make this v1. RFC is a state of the patches not a 
version.

Rob

  parent reply	other threads:[~2024-01-31  0:07 UTC|newest]

Thread overview: 63+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-01-26 23:53 [PATCH 00/46] Dynamic allocation of reserved_mem array Oreoluwa Babatunde
2024-01-26 23:53 ` [PATCH 01/46] of: reserved_mem: Change the order that reserved_mem regions are stored Oreoluwa Babatunde
2024-01-26 23:53 ` [PATCH 02/46] of: reserved_mem: Introduce new early reserved memory scan function Oreoluwa Babatunde
2024-01-26 23:53 ` [PATCH 03/46] ARC: reserved_mem: Implement the new processing order for reserved memory Oreoluwa Babatunde
2024-01-26 23:53 ` [PATCH 04/46] ARM: " Oreoluwa Babatunde
2024-01-26 23:53 ` [PATCH 05/46] arm64: " Oreoluwa Babatunde
2024-01-26 23:53 ` [PATCH 06/46] csky: " Oreoluwa Babatunde
2024-01-26 23:53 ` [PATCH 07/46] Loongarch: " Oreoluwa Babatunde
2024-01-31 15:27   ` Rob Herring
2024-02-01 17:17     ` Oreoluwa Babatunde
2024-01-26 23:53 ` [PATCH 08/46] microblaze: " Oreoluwa Babatunde
2024-01-26 23:53 ` [PATCH 09/46] mips: " Oreoluwa Babatunde
2024-01-26 23:53 ` [PATCH 10/46] nios2: " Oreoluwa Babatunde
2024-01-26 23:53 ` [PATCH 11/46] openrisc: " Oreoluwa Babatunde
2024-01-26 23:53 ` [PATCH 12/46] powerpc: " Oreoluwa Babatunde
2024-01-26 23:53 ` [PATCH 13/46] riscv: " Oreoluwa Babatunde
2024-01-26 23:53 ` [PATCH 14/46] sh: " Oreoluwa Babatunde
2024-01-31 15:41   ` Rob Herring
2024-02-01 17:15     ` Oreoluwa Babatunde
2024-01-26 23:53 ` [PATCH 15/46] um: " Oreoluwa Babatunde
2024-01-26 23:53 ` [PATCH 16/46] xtensa: " Oreoluwa Babatunde
2024-01-26 23:53 ` [PATCH 17/46] of: reserved_mem: Delete the early_init_fdt_scan_reserved_mem() function Oreoluwa Babatunde
2024-01-26 23:53 ` [PATCH 18/46] of: reserved_mem: Add code to dynamically allocate reserved_mem array Oreoluwa Babatunde
2024-01-29  3:39   ` kernel test robot
2024-01-29 13:57   ` kernel test robot
2024-01-26 23:53 ` [PATCH 19/46] ARC: resrved_mem: Move fdt_init_reserved_mem() below unflatten_device_tree() Oreoluwa Babatunde
2024-01-26 23:53 ` [PATCH 20/46] ARM: " Oreoluwa Babatunde
2024-01-26 23:54 ` [PATCH 21/46] arm64: " Oreoluwa Babatunde
2024-01-26 23:54 ` [PATCH 22/46] csky: " Oreoluwa Babatunde
2024-01-26 23:54 ` [PATCH 23/46] microblaze: " Oreoluwa Babatunde
2024-01-26 23:54 ` [PATCH 24/46] mips: " Oreoluwa Babatunde
2024-01-26 23:54 ` [PATCH 25/46] nios2: " Oreoluwa Babatunde
2024-01-26 23:54 ` [PATCH 26/46] powerpc: " Oreoluwa Babatunde
2024-01-26 23:54 ` [PATCH 27/46] riscv: " Oreoluwa Babatunde
2024-01-26 23:54 ` [PATCH 28/46] um: " Oreoluwa Babatunde
2024-01-26 23:54 ` [PATCH 29/46] xtensa: " Oreoluwa Babatunde
2024-01-26 23:54 ` [PATCH 30/46] of: reserved_mem: Add code to use unflattened DT for reserved_mem nodes Oreoluwa Babatunde
2024-01-28  4:29   ` kernel test robot
2024-01-28  6:06   ` kernel test robot
2024-01-29 18:58   ` kernel test robot
2024-01-31 17:53   ` kernel test robot
2024-01-26 23:54 ` [PATCH 31/46] of: reserved_mem: Rename fdt_* functions to refelct use of unflattened devicetree APIs Oreoluwa Babatunde
2024-01-26 23:54 ` [PATCH 32/46] ARC: reserved_mem: Switch fdt_init_reserved_mem() to dt_init_reserved_mem() Oreoluwa Babatunde
2024-01-26 23:54 ` [PATCH 33/46] ARM: " Oreoluwa Babatunde
2024-01-26 23:54 ` [PATCH 34/46] arm64: " Oreoluwa Babatunde
2024-01-26 23:54 ` [PATCH 35/46] csky: " Oreoluwa Babatunde
2024-01-26 23:54 ` [PATCH 36/46] loongarch: reserved_mem: Switch fdt_init_reserved_mem to dt_init_reserved_mem Oreoluwa Babatunde
2024-01-26 23:54 ` [PATCH 37/46] microblaze: " Oreoluwa Babatunde
2024-01-26 23:54 ` [PATCH 38/46] mips: reserved_mem: Switch fdt_init_reserved_mem() to dt_init_reserved_mem() Oreoluwa Babatunde
2024-01-26 23:54 ` [PATCH 39/46] nios2: " Oreoluwa Babatunde
2024-01-26 23:54 ` [PATCH 40/46] openrisc: reserved_mem: Switch fdt_init_reserved_mem to dt_init_reserved_mem Oreoluwa Babatunde
2024-01-26 23:54 ` [PATCH 41/46] powerpc: reserved_mem: Switch fdt_init_reserved_mem() to dt_init_reserved_mem() Oreoluwa Babatunde
2024-01-26 23:54 ` [PATCH 42/46] riscv: " Oreoluwa Babatunde
2024-01-26 23:54 ` [PATCH 43/46] sh: " Oreoluwa Babatunde
2024-01-26 23:54 ` [PATCH 44/46] um: " Oreoluwa Babatunde
2024-01-26 23:54 ` [PATCH 45/46] xtensa: " Oreoluwa Babatunde
2024-01-26 23:54 ` [PATCH 46/46] of: reserved_mem: Delete the fdt_init_reserved_mem() function Oreoluwa Babatunde
2024-01-31  0:07 ` Rob Herring [this message]
2024-02-01 17:08   ` [PATCH 00/46] Dynamic allocation of reserved_mem array Oreoluwa Babatunde
2024-02-01 19:46     ` Rob Herring
2024-02-01 21:10       ` Oreoluwa Babatunde
2024-02-02 15:29         ` Rob Herring
2024-02-07 21:13           ` 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=20240131000710.GA2581425-robh@kernel.org \
    --to=robh@kernel.org \
    --cc=anton.ivanov@cambridgegreys.com \
    --cc=aou@eecs.berkeley.edu \
    --cc=arnd@arndb.de \
    --cc=catalin.marinas@arm.com \
    --cc=chenhuacai@kernel.org \
    --cc=chris@zankel.net \
    --cc=dalias@libc.org \
    --cc=devicetree@vger.kernel.org \
    --cc=dinguyen@kernel.org \
    --cc=frowand.list@gmail.com \
    --cc=glaubitz@physik.fu-berlin.de \
    --cc=guoren@kernel.org \
    --cc=jcmvbkbc@gmail.com \
    --cc=johannes@sipsolutions.net \
    --cc=jonas@southpole.se \
    --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=monstr@monstr.eu \
    --cc=mpe@ellerman.id.au \
    --cc=olof@lixom.net \
    --cc=palmer@dabbelt.com \
    --cc=quic_obabatun@quicinc.com \
    --cc=richard@nod.at \
    --cc=shorne@gmail.com \
    --cc=soc@kernel.org \
    --cc=stefan.kristiansson@saunalahti.fi \
    --cc=tsbogend@alpha.franken.de \
    --cc=vgupta@kernel.org \
    --cc=will@kernel.org \
    --cc=ysato@users.sourceforge.jp \
    /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).