linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
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>

  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