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>
next prev parent 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 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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox