linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
From: Andrew Morton <akpm@linux-foundation.org>
To: Santosh Shilimkar <santosh.shilimkar@ti.com>
Cc: linux-kernel@vger.kernel.org, linux-mm@kvack.org,
	linux-arm-kernel@lists.infradead.org,
	Yinghai Lu <yinghai@kernel.org>, Tejun Heo <tj@kernel.org>,
	Grygorii Strashko <grygorii.strashko@ti.com>
Subject: Re: [PATCH v3 08/23] mm/memblock: Add memblock memory allocation apis
Date: Mon, 9 Dec 2013 16:25:17 -0800	[thread overview]
Message-ID: <20131209162517.b259540cdd23bfacadc9d171@linux-foundation.org> (raw)
In-Reply-To: <1386625856-12942-9-git-send-email-santosh.shilimkar@ti.com>

On Mon, 9 Dec 2013 16:50:41 -0500 Santosh Shilimkar <santosh.shilimkar@ti.com> 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 memblock interfaces. The architectures
> which are still not converted to NO_BOOTMEM continue to function
> as is because we still maintain the fal lback option of bootmem
> back-end supporting these new interfaces. So no functional change
> as such.
> 
> In long run, once all the architectures 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 inline void * __init memblock_virt_alloc(
> +					phys_addr_t size,  phys_addr_t align)
> +{
> +	return memblock_virt_alloc_try_nid(size, align, BOOTMEM_LOW_LIMIT,
> +					    BOOTMEM_ALLOC_ACCESSIBLE,
> +					    NUMA_NO_NODE);
> +}

erk.  I prefer

static inline void * __init
memblock_virt_alloc(phys_addr_t size,  phys_addr_t align);

to this.  But not enough to bother changing it ;)

> +/**
> + * memblock_virt_alloc_internal - allocate boot memory block
> + * @size: size of memory block to be allocated in bytes
> + * @align: alignment of the region and block's size
> + * @min_addr: the lower bound of the memory region to allocate (phys address)
> + * @max_addr: the upper bound of the memory region to allocate (phys address)
> + * @nid: nid of the free area to find, %NUMA_NO_NODE for any node
> + *
> + * The @min_addr limit is dropped if it can not be satisfied and the allocation
> + * will fall back to memory below @min_addr. Also, allocation may fall back
> + * to any node in the system if the specified node can not
> + * hold the requested memory.
> + *
> + * The allocation is performed from memory region limited by
> + * memblock.current_limit if @max_addr == %BOOTMEM_ALLOC_ACCESSIBLE.
> + *
> + * The memory block is aligned on SMP_CACHE_BYTES if @align == 0.
> + *
> + * The phys address of allocated boot memory block is converted to virtual and
> + * allocated memory is reset to 0.
> + *
> + * In addition, function sets the min_count to 0 using kmemleak_alloc for
> + * allocated boot memory block, so that it is never reported as leaks.
> + *
> + * RETURNS:
> + * Virtual address of allocated memory block on success, NULL on failure.
> + */
> +static void * __init memblock_virt_alloc_internal(
> +				phys_addr_t size, phys_addr_t align,
> +				phys_addr_t min_addr, phys_addr_t max_addr,
> +				int nid)
> +{
> +	phys_addr_t alloc;
> +	void *ptr;
> +
> +	if (nid == MAX_NUMNODES)
> +		pr_warn("%s: usage of MAX_NUMNODES is depricated. Use NUMA_NO_NODE\n",
> +			__func__);

"deprecated".  I'll fix this (three places).

> +	if (WARN_ON_ONCE(slab_is_available()))
> +		return kzalloc_node(size, GFP_NOWAIT, nid);

I don't know why this generates a warning.  And I bet that if it
generates a warning for some other developer, they won't know either. 
Please send a patch to add a suitable code comment here.

> +
> +	/*
> +	 * The min_count is set to 0 so that bootmem allocated blocks
> +	 * are never reported as leaks.
> +	 */
> +	kmemleak_alloc(ptr, size, 0, 0);

This is not a good comment - it explains "what" (which is fairly
obvious) but it doesn't explain "why".  Unfreed bootmem can surely be
considered a leak in some situations so perhaps some people will want
them reported as such.  Please send a patch which updates this comment,
fully explaining the reasoning behind this decision.

> +	return ptr;
> +
> +error:
> +	return NULL;
> +}
> +
> +/**
> + * memblock_virt_alloc_try_nid_nopanic - allocate boot memory block
> + * @size: size of memory block to be allocated in bytes
> + * @align: alignment of the region and block's size
> + * @min_addr: the lower bound of the memory region from where the allocation
> + *	  is preferred (phys address)
> + * @max_addr: the upper bound of the memory region from where the allocation
> + *	      is preferred (phys address), or %BOOTMEM_ALLOC_ACCESSIBLE to
> + *	      allocate only from memory limited by memblock.current_limit value
> + * @nid: nid of the free area to find, %NUMA_NO_NODE for any node
> + *
> + * Public version of _memblock_virt_alloc_try_nid_nopanic() which provides
> + * additional debug information (including caller info), if enabled.
> + *
> + * RETURNS:
> + * Virtual address of allocated memory block on success, NULL on failure.
> + */
> +void * __init memblock_virt_alloc_try_nid_nopanic(
> +				phys_addr_t size, phys_addr_t align,
> +				phys_addr_t min_addr, phys_addr_t max_addr,
> +				int nid)
> +{
> +	memblock_dbg("%s: %llu bytes align=0x%llx nid=%d from=0x%llx max_addr=0x%llx %pF\n",
> +		     __func__, (u64)size, (u64)align, nid, (u64)min_addr,
> +		     (u64)max_addr, (void *)_RET_IP_);

Maybe we should teach vsprintf() how to print phys_addr_t's.  Similar
to
http://ozlabs.org/~akpm/mmots/broken-out/vsprintf-add-%25pad-extension-for-dma_addr_t-use.patch

Printing a single level of the call stack is often pretty useless. 
Have you been using memblock_dbg() and have you found this _RET_IP_
information to be sufficient?


> +	return memblock_virt_alloc_internal(size, align, min_addr,
> +					     max_addr, nid);
> +}

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

  reply	other threads:[~2013-12-10  0:25 UTC|newest]

Thread overview: 41+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-12-09 21:50 [PATCH v3 00/23] mm: Use memblock interface instead of bootmem Santosh Shilimkar
2013-12-09 21:50 ` [PATCH v3 01/23] mm/memblock: debug: correct displaying of upper memory boundary Santosh Shilimkar
2013-12-09 21:56   ` Felipe Balbi
2013-12-09 22:39     ` Santosh Shilimkar
2013-12-09 21:50 ` [PATCH v3 02/23] mm/memblock: debug: don't free reserved array if !ARCH_DISCARD_MEMBLOCK Santosh Shilimkar
2013-12-10  0:11   ` Andrew Morton
2013-12-10 16:44     ` Grygorii Strashko
2013-12-09 21:50 ` [PATCH v3 03/23] mm/bootmem: remove duplicated declaration of __free_pages_bootmem() Santosh Shilimkar
2013-12-09 21:50 ` [PATCH v3 04/23] mm/memblock: remove unnecessary inclusions of bootmem.h Santosh Shilimkar
2013-12-09 21:50 ` [PATCH v3 05/23] mm/memblock: drop WARN and use SMP_CACHE_BYTES as a default alignment Santosh Shilimkar
2013-12-13 21:21   ` Tejun Heo
2013-12-09 21:50 ` [PATCH v3 06/23] mm/memblock: reorder parameters of memblock_find_in_range_node Santosh Shilimkar
2013-12-13 21:22   ` Tejun Heo
2013-12-09 21:50 ` [PATCH v3 07/23] mm/memblock: switch to use NUMA_NO_NODE instead of MAX_NUMNODES Santosh Shilimkar
2013-12-13 21:29   ` Tejun Heo
2013-12-14  0:44     ` Santosh Shilimkar
2013-12-09 21:50 ` [PATCH v3 08/23] mm/memblock: Add memblock memory allocation apis Santosh Shilimkar
2013-12-10  0:25   ` Andrew Morton [this message]
2013-12-10 16:04     ` Santosh Shilimkar
2013-12-13 21:37   ` Tejun Heo
2013-12-14  0:52     ` Santosh Shilimkar
2013-12-14 11:08       ` Tejun Heo
2013-12-14 19:48         ` Santosh Shilimkar
2013-12-20 22:30           ` Santosh Shilimkar
2013-12-09 21:50 ` [PATCH v3 09/23] mm/init: Use memblock apis for early memory allocations Santosh Shilimkar
2013-12-09 21:50 ` [PATCH v3 10/23] mm/printk: " Santosh Shilimkar
2013-12-09 21:50 ` [PATCH v3 11/23] mm/page_alloc: " Santosh Shilimkar
2013-12-09 21:50 ` [PATCH v3 12/23] mm/power: " Santosh Shilimkar
2013-12-09 21:50 ` [PATCH v3 13/23] mm/lib/swiotlb: " Santosh Shilimkar
2013-12-13  1:08   ` Andrew Morton
2013-12-13  1:24     ` Santosh Shilimkar
2013-12-09 21:50 ` [PATCH v3 14/23] mm/lib/cpumask: " Santosh Shilimkar
2013-12-09 21:50 ` [PATCH v3 15/23] mm/sparse: " Santosh Shilimkar
2013-12-09 21:50 ` [PATCH v3 16/23] mm/hugetlb: " Santosh Shilimkar
2013-12-09 21:50 ` [PATCH v3 17/23] mm/page_cgroup: " Santosh Shilimkar
2013-12-09 21:50 ` [PATCH v3 18/23] mm/percpu: " Santosh Shilimkar
2013-12-09 21:50 ` [PATCH v3 19/23] mm/memory_hotplug: " Santosh Shilimkar
2013-12-09 21:50 ` [PATCH v3 20/23] mm/firmware: " Santosh Shilimkar
2013-12-09 21:50 ` [PATCH v3 21/23] mm/ARM: kernel: " Santosh Shilimkar
2013-12-09 21:50 ` [PATCH v3 22/23] mm/ARM: mm: " Santosh Shilimkar
2013-12-09 21:50 ` [PATCH v3 23/23] mm/ARM: OMAP: " Santosh Shilimkar

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=20131209162517.b259540cdd23bfacadc9d171@linux-foundation.org \
    --to=akpm@linux-foundation.org \
    --cc=grygorii.strashko@ti.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=santosh.shilimkar@ti.com \
    --cc=tj@kernel.org \
    --cc=yinghai@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