From: Nick Piggin <nickpiggin@yahoo.com.au>
To: Christoph Lameter <clameter@sgi.com>
Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>,
akpm@osdl.org, linux-mm@kvack.org
Subject: Re: Page allocator: Single Zone optimizations
Date: Wed, 18 Oct 2006 21:15:35 +1000 [thread overview]
Message-ID: <45360CD7.6060202@yahoo.com.au> (raw)
In-Reply-To: <Pine.LNX.4.64.0610171053090.13792@schroedinger.engr.sgi.com>
Christoph Lameter wrote:
> On Tue, 17 Oct 2006, Nick Piggin wrote:
>
>
>>I would give an ack to Kame's approach for lowmem_reserve ;)
>
>
> @@ -922,8 +924,7 @@ int zone_watermark_ok(struct zone *z, in
> min -= min / 2;
> if (alloc_flags & ALLOC_HARDER)
> min -= min / 4;
> -
> - if (free_pages <= min + z->lowmem_reserve[classzone_idx])
> + if (free_pages <= min + MULTI_ZONE * z->lowmem_reserve[classzone_idx])
I think I still prefer having this in a header. It is the normal way of doing it.
> return 0;
> for (o = 0; o < order; o++) {
> /* At the next order, this order's pages become unavailable */
> @@ -1429,8 +1430,6 @@ void show_free_areas(void)
> global_page_state(NR_PAGETABLE));
>
> for_each_zone(zone) {
> - int i;
> -
> if (!populated_zone(zone))
> continue;
>
> @@ -1457,10 +1456,14 @@ void show_free_areas(void)
> zone->pages_scanned,
> (zone->all_unreclaimable ? "yes" : "no")
> );
> - printk("lowmem_reserve[]:");
> - for (i = 0; i < MAX_NR_ZONES; i++)
> - printk(" %lu", zone->lowmem_reserve[i]);
> - printk("\n");
> + if (MULTI_ZONE) {
> + int i;
> +
> + printk("lowmem_reserve[]:");
> + for (i = 0; i < MAX_NR_ZONES; i++)
> + printk(" %lu", zone->lowmem_reserve[i]);
> + printk("\n");
> + }
> }
>
> for_each_zone(zone) {
> @@ -2829,25 +2832,36 @@ void __init page_alloc_init(void)
> * calculate_totalreserve_pages - called when sysctl_lower_zone_reserve_ratio
> * or min_free_kbytes changes.
> */
> +static unsigned long calculate_max_lowmem_reserve(struct zone *zone,
> + enum zone_type start)
> +{
> + unsigned long max;
> + enum zone_type i;
> +
> + if (SINGLE_ZONE)
> + return 0;
> + /* Find valid and maximum lowmem_reserve in the zone */
> + for (i = start; i < MAX_NR_ZONES; i++) {
> + if (zone->lowmem_reserve[i] > max)
> + max = zone->lowmem_reserve[i];
> + }
> + return max;
> +}
> +
> static void calculate_totalreserve_pages(void)
> {
> struct pglist_data *pgdat;
> unsigned long reserve_pages = 0;
> - enum zone_type i, j;
> + enum zone_type i;
>
> for_each_online_pgdat(pgdat) {
> for (i = 0; i < MAX_NR_ZONES; i++) {
> struct zone *zone = pgdat->node_zones + i;
> - unsigned long max = 0;
> -
> - /* Find valid and maximum lowmem_reserve in the zone */
> - for (j = i; j < MAX_NR_ZONES; j++) {
> - if (zone->lowmem_reserve[j] > max)
> - max = zone->lowmem_reserve[j];
> - }
> + unsigned long max;
>
> /* we treat pages_high as reserved pages. */
> - max += zone->pages_high;
> + max = calculate_max_lowmem_reserve(zone, i) + \
> + zone->pages_high;
>
> if (max > zone->present_pages)
> max = zone->present_pages;
> @@ -2868,6 +2882,9 @@ static void setup_per_zone_lowmem_reserv
> struct pglist_data *pgdat;
> enum zone_type j, idx;
>
> + if (SINGLE_ZONE)
> + return 0;
> +
> for_each_online_pgdat(pgdat) {
> for (j = 0; j < MAX_NR_ZONES; j++) {
> struct zone *zone = pgdat->node_zones + j;
> @@ -3044,6 +3061,7 @@ int sysctl_min_slab_ratio_sysctl_handler
> }
> #endif
>
> +#if MULTI_ZONE
> /*
> * lowmem_reserve_ratio_sysctl_handler - just a wrapper around
> * proc_dointvec() so that we can call setup_per_zone_lowmem_reserve()
> @@ -3060,6 +3078,7 @@ int lowmem_reserve_ratio_sysctl_handler(
> setup_per_zone_lowmem_reserve();
> return 0;
> }
> +#endif
>
> /*
> * percpu_pagelist_fraction - changes the pcp->high for each zone on each
> Index: linux-2.6.19-rc1-mm1/kernel/sysctl.c
> ===================================================================
> --- linux-2.6.19-rc1-mm1.orig/kernel/sysctl.c 2006-10-17 07:27:44.692269445 -0500
> +++ linux-2.6.19-rc1-mm1/kernel/sysctl.c 2006-10-17 07:38:47.977425889 -0500
> @@ -900,6 +900,7 @@ static ctl_table vm_table[] = {
> .proc_handler = &proc_dointvec,
> },
> #endif
> +#if MULTI_ZONE
> {
> .ctl_name = VM_LOWMEM_RESERVE_RATIO,
> .procname = "lowmem_reserve_ratio",
> @@ -909,6 +910,7 @@ static ctl_table vm_table[] = {
> .proc_handler = &lowmem_reserve_ratio_sysctl_handler,
> .strategy = &sysctl_intvec,
> },
> +#endif
> {
> .ctl_name = VM_DROP_PAGECACHE,
> .procname = "drop_caches",
> Index: linux-2.6.19-rc1-mm1/include/linux/mmzone.h
> ===================================================================
> --- linux-2.6.19-rc1-mm1.orig/include/linux/mmzone.h 2006-10-17 07:27:42.478206116 -0500
> +++ linux-2.6.19-rc1-mm1/include/linux/mmzone.h 2006-10-17 07:34:40.134279959 -0500
> @@ -171,6 +171,9 @@ enum zone_type {
> #endif
> #undef __ZONE_COUNT
>
> +#define MULTI_ZONE (ZONES_SHIFT > 0)
> +#define SINGLE_ZONE (ZONES_SHIFT == 0)
> +
> struct zone {
> /* Fields commonly accessed by the page allocator */
> unsigned long free_pages;
> @@ -183,7 +186,7 @@ struct zone {
> * on the higher zones). This array is recalculated at runtime if the
> * sysctl_lowmem_reserve_ratio sysctl changes.
> */
> - unsigned long lowmem_reserve[MAX_NR_ZONES];
> + unsigned long lowmem_reserve[MAX_NR_ZONES - SINGLE_ZONE];
IMO ifdef is much better here. It is more readable and gives better
typechecking. I think ifdef in structures is not much of a problem.
>
> #ifdef CONFIG_NUMA
> int node;
> @@ -420,11 +423,11 @@ unsigned long __init node_memmap_size_by
> /*
> * zone_idx() returns 0 for the ZONE_DMA zone, 1 for the ZONE_NORMAL zone, etc.
> */
> -#define zone_idx(zone) ((zone) - (zone)->zone_pgdat->node_zones)
> +#define zone_idx(zone) (MULTI_ZONE * ((zone) - (zone)->zone_pgdat->node_zones))
>
> static inline int populated_zone(struct zone *zone)
> {
> - return (!!zone->present_pages);
> + return SINGLE_ZONE || (!!zone->present_pages);
> }
>
> static inline int is_highmem_idx(enum zone_type idx)
> @@ -438,7 +441,7 @@ static inline int is_highmem_idx(enum zo
>
> static inline int is_normal_idx(enum zone_type idx)
> {
> - return (idx == ZONE_NORMAL);
> + return SINGLE_ZONE || (idx == ZONE_NORMAL);
> }
>
> /**
> @@ -458,7 +461,8 @@ static inline int is_highmem(struct zone
>
> static inline int is_normal(struct zone *zone)
> {
> - return zone == zone->zone_pgdat->node_zones + ZONE_NORMAL;
> + return SINGLE_ZONE ||
> + zone == zone->zone_pgdat->node_zones + ZONE_NORMAL;
> }
I don't know if these are any better than ifdef elseif endif. I think
the goal is not ifdef removal at any cost, but avoiding ifdefs in
complex functions and within control flow because it makes the code
less readable.
--
SUSE Labs, Novell Inc.
Send instant messages to your online friends http://au.messenger.yahoo.com
--
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:[~2006-10-18 11:15 UTC|newest]
Thread overview: 83+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-10-17 0:50 Christoph Lameter
2006-10-17 1:10 ` Andrew Morton
2006-10-17 1:13 ` Christoph Lameter
2006-10-17 1:27 ` KAMEZAWA Hiroyuki
2006-10-17 1:25 ` Christoph Lameter
2006-10-17 6:04 ` Nick Piggin
2006-10-17 17:54 ` Christoph Lameter
2006-10-18 11:15 ` Nick Piggin [this message]
2006-10-18 19:38 ` Andrew Morton
2006-10-23 23:08 ` Christoph Lameter
2006-10-24 1:07 ` Christoph Lameter
2006-10-26 22:09 ` Andrew Morton
2006-10-26 22:28 ` Christoph Lameter
2006-10-28 1:00 ` Christoph Lameter
2006-10-28 2:04 ` Andrew Morton
2006-10-28 2:12 ` Christoph Lameter
2006-10-28 2:24 ` Andrew Morton
2006-10-28 2:31 ` Christoph Lameter
2006-10-28 4:43 ` Andrew Morton
2006-10-28 7:47 ` KAMEZAWA Hiroyuki
2006-10-28 16:12 ` Andi Kleen
2006-10-29 0:48 ` Christoph Lameter
2006-10-29 1:04 ` Andrew Morton
2006-10-29 1:29 ` Christoph Lameter
2006-10-29 11:32 ` Nick Piggin
2006-10-30 16:41 ` Christoph Lameter
2006-11-01 18:26 ` Mel Gorman
2006-11-01 20:34 ` Andrew Morton
2006-11-01 21:00 ` Christoph Lameter
2006-11-01 21:46 ` Andrew Morton
2006-11-01 21:50 ` Christoph Lameter
2006-11-01 22:13 ` Mel Gorman
2006-11-01 23:29 ` Christoph Lameter
2006-11-02 0:22 ` Andrew Morton
2006-11-02 0:27 ` Christoph Lameter
2006-11-02 12:45 ` Mel Gorman
2006-11-01 22:10 ` Mel Gorman
2006-11-02 17:37 ` Andy Whitcroft
2006-11-02 18:08 ` Christoph Lameter
2006-11-02 20:58 ` Mel Gorman
2006-11-02 21:04 ` Christoph Lameter
2006-11-02 21:16 ` Mel Gorman
2006-11-02 21:52 ` Christoph Lameter
2006-11-02 22:37 ` Mel Gorman
2006-11-02 22:50 ` Christoph Lameter
2006-11-03 9:14 ` Mel Gorman
2006-11-03 13:17 ` Andy Whitcroft
2006-11-03 18:11 ` Christoph Lameter
2006-11-03 19:06 ` Mel Gorman
2006-11-03 19:44 ` Christoph Lameter
2006-11-03 21:11 ` Mel Gorman
2006-11-03 21:42 ` Christoph Lameter
2006-11-03 21:50 ` Andrew Morton
2006-11-03 21:53 ` Christoph Lameter
2006-11-03 22:12 ` Andrew Morton
2006-11-03 22:15 ` Christoph Lameter
2006-11-03 22:19 ` Andi Kleen
2006-11-04 0:37 ` Christoph Lameter
2006-11-04 1:32 ` Andi Kleen
2006-11-06 16:40 ` Christoph Lameter
2006-11-06 16:56 ` Andi Kleen
2006-11-06 17:00 ` Christoph Lameter
2006-11-06 17:07 ` Andi Kleen
2006-11-06 17:12 ` Hugh Dickins
2006-11-06 17:15 ` Christoph Lameter
2006-11-06 17:20 ` Andi Kleen
2006-11-06 17:26 ` Christoph Lameter
2006-11-07 16:30 ` Mel Gorman
2006-11-07 17:54 ` Christoph Lameter
2006-11-07 18:14 ` Mel Gorman
2006-11-08 0:29 ` KAMEZAWA Hiroyuki
2006-11-08 2:08 ` Christoph Lameter
2006-11-13 21:08 ` Mel Gorman
2006-11-03 12:48 ` Peter Zijlstra
2006-11-03 18:15 ` Christoph Lameter
2006-11-03 18:53 ` Peter Zijlstra
2006-11-03 19:23 ` Christoph Lameter
2006-11-02 18:52 ` Andrew Morton
2006-11-02 21:51 ` Mel Gorman
2006-11-02 22:03 ` Andy Whitcroft
2006-11-02 22:11 ` Andrew Morton
2006-11-01 18:13 ` Mel Gorman
2006-11-01 17:39 ` Mel Gorman
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=45360CD7.6060202@yahoo.com.au \
--to=nickpiggin@yahoo.com.au \
--cc=akpm@osdl.org \
--cc=clameter@sgi.com \
--cc=kamezawa.hiroyu@jp.fujitsu.com \
--cc=linux-mm@kvack.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