[PATCH 09/24] mm/memblock: Add memblock memory allocation apis
From: akpm@linux-foundation.org (Andrew Morton)
Date: 2013-12-03 00:31:40
Also in:
linux-mm, lkml
On Fri, 8 Nov 2013 18:41:45 -0500 Santosh Shilimkar [off-list ref] wrote:
Introduce memblock memory allocation APIs which allow to support
PAE or LPAE extension on 32 bits archs where the physical memory start
address can be beyond 4GB. In such cases, existing bootmem APIs which
operate on 32 bit addresses won't work and needs memblock layer which
operates on 64 bit addresses.
So we add equivalent APIs so that we can replace usage of bootmem
with memblock interfaces. Architectures already converted to NO_BOOTMEM
use these new interfaces and other which still uses bootmem, these new
APIs just fallback to exiting bootmem APIs. So no functional change as
such.
In long run, once all the achitectures moves to NO_BOOTMEM, we can get rid of
bootmem layer completely. This is one step to remove the core code dependency
with bootmem and also gives path for architectures to move away from bootmem.
The proposed interface will became active if both CONFIG_HAVE_MEMBLOCK
and CONFIG_NO_BOOTMEM are specified by arch. In case !CONFIG_NO_BOOTMEM,
the memblock() wrappers will fallback to the existing bootmem apis so
that arch's not converted to NO_BOOTMEM continue to work as is.
The meaning of MEMBLOCK_ALLOC_ACCESSIBLE and MEMBLOCK_ALLOC_ANYWHERE is
kept same.
...
+static void * __init _memblock_virt_alloc_try_nid_nopanic(
+ phys_addr_t size, phys_addr_t align,
+ phys_addr_t from, phys_addr_t max_addr,
+ int nid)
+{
+ phys_addr_t alloc;
+ void *ptr;
+
+ if (WARN_ON_ONCE(slab_is_available())) {
+ if (nid == MAX_NUMNODES)
+ return kzalloc(size, GFP_NOWAIT);
+ else
+ return kzalloc_node(size, GFP_NOWAIT, nid);
+ }The use of MAX_NUMNODES is a bit unconventional here. I *think* we generally use NUMA_NO_NODE to indicate "don't care". I Also *think* that if this code did s/MAX_NUMNODES/NUMA_NO_NODE/g then the above simply becomes return kzalloc_node(size, GFP_NOWAIT, nid); and kzalloc_node() handles NUMA_NO_NODE appropriately. I *think* ;) Please check all this.