All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andy Whitcroft <apw@shadowen.org>
To: Christoph Lameter <clameter@SGI.com>
Cc: akpm@osdl.org, linux-mm@kvack.org, pj@SGI.com, jes@SGI.com
Subject: Re: [1/3] Add __GFP_THISNODE to avoid fallback to other nodes and ignore cpuset/memory policy restrictions.
Date: Tue, 08 Aug 2006 17:56:47 +0100	[thread overview]
Message-ID: <44D8C24F.8010808@shadowen.org> (raw)
In-Reply-To: <Pine.LNX.4.64.0608080930380.27620@schroedinger.engr.sgi.com>

Christoph Lameter wrote:
> Add a new gfp flag __GFP_THISNODE to avoid fallback to other nodes. This flag
> is essential if a kernel component requires memory to be located on a
> certain node. It will be needed for alloc_pages_node() to force allocation
> on the indicated node and for alloc_pages() to force allocation on the
> current node.
> 
> Signed-off-by: Christoph Lameter <clameter@sgi.com>
> 
> Index: linux-2.6.18-rc3-mm2/mm/page_alloc.c
> ===================================================================
> --- linux-2.6.18-rc3-mm2.orig/mm/page_alloc.c	2006-08-07 20:21:28.431331931 -0700
> +++ linux-2.6.18-rc3-mm2/mm/page_alloc.c	2006-08-08 09:23:23.323396326 -0700
> @@ -916,6 +916,9 @@ get_page_from_freelist(gfp_t gfp_mask, u
>  	 * See also cpuset_zone_allowed() comment in kernel/cpuset.c.
>  	 */
>  	do {
> +		if (unlikely((gfp_mask & __GFP_THISNODE) &&
> +			(*z)->zone_pgdat != zonelist->zones[0]->zone_pgdat))
> +				break;
>  		if ((alloc_flags & ALLOC_CPUSET) &&
>  				!cpuset_zone_allowed(*z, gfp_mask))
>  			continue;

Would this not be a very good example of an overlapping GFP_foo bits?. 
If this bit were just passed through with the GFP_DMA etc then we could 
build lists per-node which only include the node, then put those in the 
zonelist[GFP_THISNODE|GFP_DMA] etc?

-apw

> Index: linux-2.6.18-rc3-mm2/include/linux/gfp.h
> ===================================================================
> --- linux-2.6.18-rc3-mm2.orig/include/linux/gfp.h	2006-08-07 20:21:01.808957041 -0700
> +++ linux-2.6.18-rc3-mm2/include/linux/gfp.h	2006-08-08 09:20:41.727897528 -0700
> @@ -45,6 +45,7 @@ struct vm_area_struct;
>  #define __GFP_ZERO	((__force gfp_t)0x8000u)/* Return zeroed page on success */
>  #define __GFP_NOMEMALLOC ((__force gfp_t)0x10000u) /* Don't use emergency reserves */
>  #define __GFP_HARDWALL   ((__force gfp_t)0x20000u) /* Enforce hardwall cpuset memory allocs */
> +#define __GFP_THISNODE	((__force gfp_t)0x40000u)/* No fallback, no policies */
>  
>  #define __GFP_BITS_SHIFT 20	/* Room for 20 __GFP_FOO bits */
>  #define __GFP_BITS_MASK ((__force gfp_t)((1 << __GFP_BITS_SHIFT) - 1))
> Index: linux-2.6.18-rc3-mm2/mm/mempolicy.c
> ===================================================================
> --- linux-2.6.18-rc3-mm2.orig/mm/mempolicy.c	2006-08-07 20:21:01.810910045 -0700
> +++ linux-2.6.18-rc3-mm2/mm/mempolicy.c	2006-08-08 09:20:41.729850533 -0700
> @@ -1278,7 +1278,7 @@ struct page *alloc_pages_current(gfp_t g
>  
>  	if ((gfp & __GFP_WAIT) && !in_interrupt())
>  		cpuset_update_task_memory_state();
> -	if (!pol || in_interrupt())
> +	if (!pol || in_interrupt() || (gfp & __GFP_THISNODE))
>  		pol = &default_policy;
>  	if (pol->policy == MPOL_INTERLEAVE)
>  		return alloc_page_interleave(gfp, order, interleave_nodes(pol));
> Index: linux-2.6.18-rc3-mm2/kernel/cpuset.c
> ===================================================================
> --- linux-2.6.18-rc3-mm2.orig/kernel/cpuset.c	2006-08-07 20:21:07.429702734 -0700
> +++ linux-2.6.18-rc3-mm2/kernel/cpuset.c	2006-08-08 09:20:41.730827035 -0700
> @@ -2282,7 +2282,7 @@ int __cpuset_zone_allowed(struct zone *z
>  	const struct cpuset *cs;	/* current cpuset ancestors */
>  	int allowed;			/* is allocation in zone z allowed? */
>  
> -	if (in_interrupt())
> +	if (in_interrupt() || (gfp_mask & __GFP_THISNODE))
>  		return 1;
>  	node = z->zone_pgdat->node_id;
>  	might_sleep_if(!(gfp_mask & __GFP_HARDWALL));

--
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>

  parent reply	other threads:[~2006-08-08 16:56 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-08-08 16:33 [1/3] Add __GFP_THISNODE to avoid fallback to other nodes and ignore cpuset/memory policy restrictions Christoph Lameter
2006-08-08 16:34 ` [2/3] sys_move_pages: Do not fall back to other nodes Christoph Lameter
2006-08-08 16:37   ` [3/3] Guarantee that the uncached allocator gets pages on the correct node Christoph Lameter
2006-08-08 16:56 ` Andy Whitcroft [this message]
2006-08-08 17:01   ` [1/3] Add __GFP_THISNODE to avoid fallback to other nodes and ignore cpuset/memory policy restrictions Christoph Lameter
2006-08-08 16:59 ` Mel Gorman
2006-08-08 17:03   ` Christoph Lameter
2006-08-08 17:16     ` Mel Gorman
2006-08-08 17:51       ` Christoph Lameter
2006-08-08 17:47     ` Paul Jackson
2006-08-08 17:59       ` Christoph Lameter
2006-08-08 18:18         ` Paul Jackson
2006-08-08 18:49           ` Christoph Lameter
2006-08-08 20:35             ` Paul Jackson
2006-08-09  9:33               ` Mel Gorman
2006-08-09  1:34 ` KAMEZAWA Hiroyuki
2006-08-09  2:00   ` Christoph Lameter
2006-08-10 19:41 ` Andrew Morton
2006-08-11  3:16   ` Christoph Lameter
2006-08-11 18:08     ` Andrew Morton
2006-08-11 18:15       ` Christoph Lameter
2006-08-11 18:42         ` Andrew Morton
2006-08-11 18:51           ` Christoph Lameter
2006-08-11 19:15             ` Andrew Morton
2006-08-11 19:16               ` Christoph Lameter
2006-08-11 19:41           ` Dave McCracken

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=44D8C24F.8010808@shadowen.org \
    --to=apw@shadowen.org \
    --cc=akpm@osdl.org \
    --cc=clameter@SGI.com \
    --cc=jes@SGI.com \
    --cc=linux-mm@kvack.org \
    --cc=pj@SGI.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.