All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andy Whitcroft <apw@shadowen.org>
To: Mel Gorman <mel@skynet.ie>
Cc: Nick Piggin <nickpiggin@yahoo.com.au>,
	Linux Memory Management <linux-mm@kvack.org>,
	Andrew Morton <akpm@linux-foundation.org>,
	kamezawa.hiroyu@jp.fujitsu.com
Subject: Re: zone movable patches comments
Date: Thu, 12 Jul 2007 13:11:47 +0100	[thread overview]
Message-ID: <46961A83.7050800@shadowen.org> (raw)
In-Reply-To: <20070710132154.GA9426@skynet.ie>

Mel Gorman wrote:
> On (10/07/07 20:18), Nick Piggin didst pronounce:
>> Nick Piggin wrote:
>>
>>> I'm not completely against kernelcore=, no. However I do think that
>>> should be a general parameter that exists for the core kernel. I guess it
>>> would override any other reservations and things, and it would specify the
>>> absolute minimum kernelcore.
>>>
>>> Then if you add a movable_mem= (or something -- I don't know what the
>>> exact name should be), then that would also specify the minimum movable
>>> memory, although at a lower priority to kernelcore= (and you could have
>>> the appropriate warnings and such if they cannot be satisfied).
>> Ah yes, I now read Andy's mail and this is what he is suggesting, so
>> yes it seems like a good idea I think.
>>
> 
> *beats keyboard with stick* 
> 
> Does something like the following cover it? Tested on a standalone x86
> and it seemed to behave as expected.
> 
> =====
> 
> This patch adds a new parameter for sizing ZONE_MOVABLE called
> movablecore=. kernelcore is used to specify the minimum amount of memory that
> must be available for all allocation types. movablecore= is used to specify
> the minimum amount of memory that is used for migratable allocations. The
> amount of memory used for migratable allocations determines how large the
> huge page pool could be dynamically resized to at runtime for example.
> 
> Signed-off-by: Mel Gorman <mel@csn.ul.ie>
> ---
>  Documentation/kernel-parameters.txt |   10 +++++
>  mm/page_alloc.c                     |   61 +++++++++++++++++++++++++++++++-----
>  2 files changed, 64 insertions(+), 7 deletions(-)
> 
> diff -rup -X /usr/src/patchset-0.6/bin//dontdiff linux-2.6.22-zonemovable/Documentation/kernel-parameters.txt linux-2.6.22-movablecore/Documentation/kernel-parameters.txt
> --- linux-2.6.22-zonemovable/Documentation/kernel-parameters.txt	2007-07-09 11:50:18.000000000 +0100
> +++ linux-2.6.22-movablecore/Documentation/kernel-parameters.txt	2007-07-10 11:38:04.000000000 +0100
> @@ -850,6 +850,16 @@ and is between 256 and 4096 characters. 
>  			use the HighMem zone if it exists, and the Normal
>  			zone if it does not.
>  
> +	movablecore=nn[KMG]	[KNL,IA-32,IA-64,PPC,X86-64] This parameter
> +			is similar to kernelcore except it specifies the
> +			amount of memory used for migratable allocations.
> +			If both kernelcore and movablecore is specified,
> +			then kernelcore will be at *least* the specified
> +			value but may be more. If movablecore on its own
> +			is specified, the administrator must be careful
> +			that the amount of memory usable for all allocations
> +			is not too small.
> +
>  	keepinitrd	[HW,ARM]
>  
>  	kstack=N	[IA-32,X86-64] Print N words from the kernel stack
> diff -rup -X /usr/src/patchset-0.6/bin//dontdiff linux-2.6.22-zonemovable/mm/page_alloc.c linux-2.6.22-movablecore/mm/page_alloc.c
> --- linux-2.6.22-zonemovable/mm/page_alloc.c	2007-07-09 11:50:18.000000000 +0100
> +++ linux-2.6.22-movablecore/mm/page_alloc.c	2007-07-10 12:31:39.000000000 +0100
> @@ -137,6 +137,7 @@ static unsigned long __meminitdata dma_r
>    unsigned long __initdata node_boundary_end_pfn[MAX_NUMNODES];
>  #endif /* CONFIG_MEMORY_HOTPLUG_RESERVE */
>    unsigned long __initdata required_kernelcore;
> +  unsigned long __initdata required_movablecore;
>    unsigned long __initdata zone_movable_pfn[MAX_NUMNODES];
>  
>    /* movable_zone is the "real" zone pages in ZONE_MOVABLE are taken from */
> @@ -2980,6 +2981,18 @@ unsigned long __init find_max_pfn_with_a
>  	return max_pfn;
>  }
>  
> +unsigned long __init early_calculate_totalpages(void)
> +{
> +	int i;
> +	unsigned long totalpages = 0;
> +
> +	for (i = 0; i < nr_nodemap_entries; i++)
> +		totalpages += early_node_map[i].end_pfn -
> +						early_node_map[i].start_pfn;
> +
> +	return totalpages;
> +}
> +
>  /*
>   * Find the PFN the Movable zone begins in each node. Kernel memory
>   * is spread evenly between nodes as long as the nodes have enough
> @@ -2993,6 +3006,25 @@ void __init find_zone_movable_pfns_for_n
>  	unsigned long kernelcore_node, kernelcore_remaining;
>  	int usable_nodes = num_online_nodes();
>  
> +	/*
> +	 * If movablecore was specified, calculate what size of
> +	 * kernelcore that corresponds so that memory usable for
> +	 * any allocation type is evenly spread. If both kernelcore
> +	 * and movablecore are specified, then the value of kernelcore
> +	 * will be used for required_kernelcore if it's greater than
> +	 * what movablecore would have allowed.
> +	 */
> +	if (required_movablecore) {
> +		unsigned long totalpages = early_calculate_totalpages();
> +		unsigned long corepages;
> +		
> +		required_movablecore =
> +			roundup(required_movablecore, MAX_ORDER_NR_PAGES);

This roundup is subtle.  This ensures that we get at least as much
MOVABLE as we requested, which is correct, but perhaps it should be
mentioned in the commentary.

> +		corepages = totalpages - required_movablecore;
> +
> +		required_kernelcore = max(required_kernelcore, corepages);
> +	}
> +		
>  	/* If kernelcore was not specified, there is no ZONE_MOVABLE */
>  	if (!required_kernelcore)
>  		return;
> @@ -3173,26 +3205,41 @@ void __init free_area_init_nodes(unsigne
>  	}
>  }
>  
> -/*
> - * kernelcore=size sets the amount of memory for use for allocations that
> - * cannot be reclaimed or migrated.
> - */
> -static int __init cmdline_parse_kernelcore(char *p)
> +static int __init cmdline_parse_core(char *p, unsigned long *core)
>  {
>  	unsigned long long coremem;
>  	if (!p)
>  		return -EINVAL;
>  
>  	coremem = memparse(p, &p);
> -	required_kernelcore = coremem >> PAGE_SHIFT;
> +	*core = coremem >> PAGE_SHIFT;
>  
> -	/* Paranoid check that UL is enough for required_kernelcore */
> +	/* Paranoid check that UL is enough for the coremem value */
>  	WARN_ON((coremem >> PAGE_SHIFT) > ULONG_MAX);
>  
>  	return 0;
>  }
>  
> +/*
> + * kernelcore=size sets the amount of memory for use for allocations that
> + * cannot be reclaimed or migrated.
> + */
> +static int __init cmdline_parse_kernelcore(char *p)
> +{
> +	return cmdline_parse_core(p, &required_kernelcore);
> +}
> +
> +/*
> + * movablecore=size sets the amount of memory for use for allocations that
> + * can be reclaimed or migrated.
> + */
> +static int __init cmdline_parse_movablecore(char *p)
> +{
> +	return cmdline_parse_core(p, &required_movablecore);
> +}
> +
>  early_param("kernelcore", cmdline_parse_kernelcore);
> +early_param("movablecore", cmdline_parse_movablecore);
>  
>  #endif /* CONFIG_ARCH_POPULATES_NODE_MAP */
>  

Looks like a sane extension to this configurable to me.

Acked-by: Andy Whitcroft <apw@shadowen.org>

-apw

--
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:[~2007-07-12 12:11 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-07-09  7:50 zone movable patches comments Nick Piggin
2007-07-09 10:30 ` KAMEZAWA Hiroyuki
2007-07-09 11:04 ` Mel Gorman
2007-07-09 11:44   ` KAMEZAWA Hiroyuki
2007-07-09 12:15   ` Nick Piggin
2007-07-09 13:21     ` Mel Gorman
2007-07-10  7:57       ` Nick Piggin
2007-07-10  9:21         ` Andy Whitcroft
2007-07-10  9:54           ` Yasunori Goto
2007-07-10 10:12             ` Andy Whitcroft
2007-07-10  9:51         ` Mel Gorman
2007-07-10 10:16           ` Nick Piggin
2007-07-10 10:18             ` Nick Piggin
2007-07-10 13:21               ` Mel Gorman
2007-07-12 12:11                 ` Andy Whitcroft [this message]
2007-07-10  9:08       ` KAMEZAWA Hiroyuki
2007-07-10  9:48         ` Andy Whitcroft
2007-07-10 11:03           ` KAMEZAWA Hiroyuki
2007-07-09 17:39   ` Christoph Lameter

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=46961A83.7050800@shadowen.org \
    --to=apw@shadowen.org \
    --cc=akpm@linux-foundation.org \
    --cc=kamezawa.hiroyu@jp.fujitsu.com \
    --cc=linux-mm@kvack.org \
    --cc=mel@skynet.ie \
    --cc=nickpiggin@yahoo.com.au \
    /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.