Skip to content

Commit

Permalink
[PATCH] mm: move determination of policy_zone into page allocator
Browse files Browse the repository at this point in the history
Currently the function to build a zonelist for a BIND policy has the side
effect to set the policy_zone.  This seems to be a bit strange.  policy
zone seems to not be initialized elsewhere and therefore 0.  Do we police
ZONE_DMA if no bind policy has been used yet?

This patch moves the determination of the zone to apply policies to into
the page allocator.  We determine the zone while building the zonelist for
nodes.

Signed-off-by: Christoph Lameter <clameter@sgi.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
  • Loading branch information
Christoph Lameter authored and Linus Torvalds committed Jan 6, 2006
1 parent 1a93205 commit 4be38e3
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 12 deletions.
11 changes: 11 additions & 0 deletions include/linux/mempolicy.h
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,14 @@ extern struct mempolicy default_policy;
extern struct zonelist *huge_zonelist(struct vm_area_struct *vma,
unsigned long addr);

extern int policy_zone;

static inline void check_highest_zone(int k)
{
if (k > policy_zone)
policy_zone = k;
}

#else

struct mempolicy {};
Expand Down Expand Up @@ -221,6 +229,9 @@ static inline struct zonelist *huge_zonelist(struct vm_area_struct *vma,
return NODE_DATA(0)->node_zonelists + gfp_zone(GFP_HIGHUSER);
}

static inline void check_highest_zone(int k)
{
}
#endif /* CONFIG_NUMA */
#endif /* __KERNEL__ */

Expand Down
15 changes: 3 additions & 12 deletions mm/mempolicy.c
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ static kmem_cache_t *sn_cache;

/* Highest zone. An specific allocation for a zone below that is not
policied. */
static int policy_zone;
int policy_zone = ZONE_DMA;

struct mempolicy default_policy = {
.refcnt = ATOMIC_INIT(1), /* never free it */
Expand Down Expand Up @@ -131,17 +131,8 @@ static struct zonelist *bind_zonelist(nodemask_t *nodes)
if (!zl)
return NULL;
num = 0;
for_each_node_mask(nd, *nodes) {
int k;
for (k = MAX_NR_ZONES-1; k >= 0; k--) {
struct zone *z = &NODE_DATA(nd)->node_zones[k];
if (!z->present_pages)
continue;
zl->zones[num++] = z;
if (k > policy_zone)
policy_zone = k;
}
}
for_each_node_mask(nd, *nodes)
zl->zones[num++] = &NODE_DATA(nd)->node_zones[policy_zone];
zl->zones[num] = NULL;
return zl;
}
Expand Down
2 changes: 2 additions & 0 deletions mm/page_alloc.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
#include <linux/memory_hotplug.h>
#include <linux/nodemask.h>
#include <linux/vmalloc.h>
#include <linux/mempolicy.h>

#include <asm/tlbflush.h>
#include "internal.h"
Expand Down Expand Up @@ -1470,6 +1471,7 @@ static int __init build_zonelists_node(pg_data_t *pgdat,
BUG_ON(zone - pgdat->node_zones > ZONE_NORMAL);
#endif
zonelist->zones[j++] = zone;
check_highest_zone(k);
}
}
return j;
Expand Down

0 comments on commit 4be38e3

Please sign in to comment.