All of lore.kernel.org
 help / color / mirror / Atom feed
From: Johannes Weiner <hannes@saeurebad.de>
To: "Yinghai Lu" <yhlu.kernel@gmail.com>
Cc: "Andrew Morton" <akpm@linux-foundation.org>,
	"Ingo Molnar" <mingo@elte.hu>, "Andi Kleen" <ak@suse.de>,
	"Christoph Lameter" <clameter@sgi.com>,
	linux-kernel@vger.kernel.org,
	"Yasunori Goto" <y-goto@jp.fujitsu.com>,
	"KAMEZAWA Hiroyuki" <kamezawa.hiroyu@jp.fujitsu.com>
Subject: Re: [PATCH] mm: make reserve_bootmem can crossed the nodes
Date: Fri, 14 Mar 2008 01:13:30 +0100	[thread overview]
Message-ID: <87iqzq40yd.fsf@saeurebad.de> (raw)
In-Reply-To: <86802c440803131645q1eb31cb7jb0774d9cf67c767@mail.gmail.com> (Yinghai Lu's message of "Thu, 13 Mar 2008 16:45:42 -0700")

Hi,

"Yinghai Lu" <yhlu.kernel@gmail.com> writes:

> Index: linux-2.6/mm/bootmem.c
> ===================================================================
> --- linux-2.6.orig/mm/bootmem.c
> +++ linux-2.6/mm/bootmem.c
> @@ -111,44 +111,69 @@ static unsigned long __init init_bootmem
>   * might be used for boot-time allocations - or it might get added
>   * to the free page pool later on.
>   */
> -static int __init reserve_bootmem_core(bootmem_data_t *bdata,
> +static int __init can_reserve_bootmem_core(bootmem_data_t *bdata,
>  			unsigned long addr, unsigned long size, int flags)
>  {
>  	unsigned long sidx, eidx;
>  	unsigned long i;
> -	int ret;
> +
> +	BUG_ON(!size);
> +
> +	/* out of range, don't hold other */
> +	if (addr >= bdata->node_boot_start && addr < bdata->last_success)
> +		return 0;
>  
>  	/*
> -	 * round up, partially reserved pages are considered
> -	 * fully reserved.
> +	 * Round up to index to the range.
>  	 */
> +	if (addr > bdata->node_boot_start)
> +		sidx= PFN_DOWN(addr - bdata->node_boot_start);
> +	else
> +		sidx = 0;
> +
> +	eidx = PFN_UP(addr + size - bdata->node_boot_start);
> +	if (eidx > bdata->node_low_pfn - PFN_DOWN(bdata->node_boot_start))
> +		eidx = bdata->node_low_pfn - PFN_DOWN(bdata->node_boot_start);
> +
> +	for (i = sidx; i < eidx; i++)
> +		if (test_bit(i, bdata->node_bootmem_map)) {
> +			if (flags & BOOTMEM_EXCLUSIVE)
> +				return -EBUSY;
> +		}
> +
> +	return 0;
> +
> +}
> +static void __init reserve_bootmem_core(bootmem_data_t *bdata,
> +			unsigned long addr, unsigned long size, int flags)
> +{
> +	unsigned long sidx, eidx;
> +	unsigned long i;
> +
>  	BUG_ON(!size);
> -	BUG_ON(PFN_DOWN(addr) >= bdata->node_low_pfn);
> -	BUG_ON(PFN_UP(addr + size) > bdata->node_low_pfn);
> -	BUG_ON(addr < bdata->node_boot_start);
>  
> -	sidx = PFN_DOWN(addr - bdata->node_boot_start);
> +	/* out of range */
> +	if (addr >= bdata->node_boot_start && addr < bdata->last_success)
> +		return;
> +
> +	/*
> +	 * Round up to index to the range.
> +	 */
> +	if (addr > bdata->node_boot_start)
> +		sidx= PFN_DOWN(addr - bdata->node_boot_start);
> +	else
> +		sidx = 0;
> +
>  	eidx = PFN_UP(addr + size - bdata->node_boot_start);
> +	if (eidx > bdata->node_low_pfn - PFN_DOWN(bdata->node_boot_start))
> +		eidx = bdata->node_low_pfn - PFN_DOWN(bdata->node_boot_start);
>  
>  	for (i = sidx; i < eidx; i++)
>  		if (test_and_set_bit(i, bdata->node_bootmem_map)) {
>  #ifdef CONFIG_DEBUG_BOOTMEM
>  			printk("hm, page %08lx reserved twice.\n", i*PAGE_SIZE);
>  #endif
> -			if (flags & BOOTMEM_EXCLUSIVE) {
> -				ret = -EBUSY;
> -				goto err;
> -			}
>  		}
> -
> -	return 0;
> -
> -err:
> -	/* unreserve memory we accidentally reserved */
> -	for (i--; i >= sidx; i--)
> -		clear_bit(i, bdata->node_bootmem_map);
> -
> -	return ret;
>  }
>  
>  static void __init free_bootmem_core(bootmem_data_t *bdata, unsigned long addr,
> @@ -407,6 +432,11 @@ unsigned long __init init_bootmem_node(p
>  void __init reserve_bootmem_node(pg_data_t *pgdat, unsigned long physaddr,
>  				 unsigned long size, int flags)
>  {
> +	int ret;
> +
> +	ret = can_reserve_bootmem_core(pgdat->bdata, physaddr, size, flags);
> +	if (ret < 0)
> +		return;
>  	reserve_bootmem_core(pgdat->bdata, physaddr, size, flags);

I don't get it.  Sorry.  What is the purpose of
can_reserve_bootmem_core()?  It does exactly what reserve_bootmem_core
does besides actually setting the bits.  All the pre-checking you wanted
to have out of the way is repeated again in reserve_bootmem_core()
(well, almost all).

	Hannes

  reply	other threads:[~2008-03-14  0:16 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-03-13 23:45 [PATCH] mm: make reserve_bootmem can crossed the nodes Yinghai Lu
2008-03-14  0:13 ` Johannes Weiner [this message]
2008-03-14  1:04   ` Yinghai Lu
2008-03-14  2:50     ` Johannes Weiner
2008-03-14  3:09       ` Yinghai Lu
2008-03-14  1:34 ` KAMEZAWA Hiroyuki
2008-03-14  1:35   ` Yinghai Lu
2008-03-14  1:55     ` KAMEZAWA Hiroyuki
2008-03-14  2:00       ` Yinghai Lu
2008-03-14  2:36         ` KAMEZAWA Hiroyuki
2008-03-14  2:58           ` Johannes Weiner
2008-03-14  3:03             ` Yinghai Lu
2008-03-15  3:08               ` Johannes Weiner

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=87iqzq40yd.fsf@saeurebad.de \
    --to=hannes@saeurebad.de \
    --cc=ak@suse.de \
    --cc=akpm@linux-foundation.org \
    --cc=clameter@sgi.com \
    --cc=kamezawa.hiroyu@jp.fujitsu.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@elte.hu \
    --cc=y-goto@jp.fujitsu.com \
    --cc=yhlu.kernel@gmail.com \
    /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.