diff options
| author | Steven Whitehouse <swhiteho@redhat.com> | 2006-09-28 08:29:59 -0400 |
|---|---|---|
| committer | Steven Whitehouse <swhiteho@redhat.com> | 2006-09-28 08:29:59 -0400 |
| commit | 185a257f2f73bcd89050ad02da5bedbc28fc43fa (patch) | |
| tree | 5e32586114534ed3f2165614cba3d578f5d87307 /mm/mempolicy.c | |
| parent | 3f1a9aaeffd8d1cbc5ab9776c45cbd66af1c9699 (diff) | |
| parent | a77c64c1a641950626181b4857abb701d8f38ccc (diff) | |
Merge branch 'master' into gfs2
Diffstat (limited to 'mm/mempolicy.c')
| -rw-r--r-- | mm/mempolicy.c | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/mm/mempolicy.c b/mm/mempolicy.c index a9963ceddd65..cf18f0942553 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c | |||
| @@ -105,7 +105,7 @@ static struct kmem_cache *sn_cache; | |||
| 105 | 105 | ||
| 106 | /* Highest zone. An specific allocation for a zone below that is not | 106 | /* Highest zone. An specific allocation for a zone below that is not |
| 107 | policied. */ | 107 | policied. */ |
| 108 | int policy_zone = ZONE_DMA; | 108 | enum zone_type policy_zone = ZONE_DMA; |
| 109 | 109 | ||
| 110 | struct mempolicy default_policy = { | 110 | struct mempolicy default_policy = { |
| 111 | .refcnt = ATOMIC_INIT(1), /* never free it */ | 111 | .refcnt = ATOMIC_INIT(1), /* never free it */ |
| @@ -137,7 +137,8 @@ static int mpol_check_policy(int mode, nodemask_t *nodes) | |||
| 137 | static struct zonelist *bind_zonelist(nodemask_t *nodes) | 137 | static struct zonelist *bind_zonelist(nodemask_t *nodes) |
| 138 | { | 138 | { |
| 139 | struct zonelist *zl; | 139 | struct zonelist *zl; |
| 140 | int num, max, nd, k; | 140 | int num, max, nd; |
| 141 | enum zone_type k; | ||
| 141 | 142 | ||
| 142 | max = 1 + MAX_NR_ZONES * nodes_weight(*nodes); | 143 | max = 1 + MAX_NR_ZONES * nodes_weight(*nodes); |
| 143 | zl = kmalloc(sizeof(struct zone *) * max, GFP_KERNEL); | 144 | zl = kmalloc(sizeof(struct zone *) * max, GFP_KERNEL); |
| @@ -148,12 +149,16 @@ static struct zonelist *bind_zonelist(nodemask_t *nodes) | |||
| 148 | lower zones etc. Avoid empty zones because the memory allocator | 149 | lower zones etc. Avoid empty zones because the memory allocator |
| 149 | doesn't like them. If you implement node hot removal you | 150 | doesn't like them. If you implement node hot removal you |
| 150 | have to fix that. */ | 151 | have to fix that. */ |
| 151 | for (k = policy_zone; k >= 0; k--) { | 152 | k = policy_zone; |
| 153 | while (1) { | ||
| 152 | for_each_node_mask(nd, *nodes) { | 154 | for_each_node_mask(nd, *nodes) { |
| 153 | struct zone *z = &NODE_DATA(nd)->node_zones[k]; | 155 | struct zone *z = &NODE_DATA(nd)->node_zones[k]; |
| 154 | if (z->present_pages > 0) | 156 | if (z->present_pages > 0) |
| 155 | zl->zones[num++] = z; | 157 | zl->zones[num++] = z; |
| 156 | } | 158 | } |
| 159 | if (k == 0) | ||
| 160 | break; | ||
| 161 | k--; | ||
| 157 | } | 162 | } |
| 158 | zl->zones[num] = NULL; | 163 | zl->zones[num] = NULL; |
| 159 | return zl; | 164 | return zl; |
| @@ -482,7 +487,7 @@ static void get_zonemask(struct mempolicy *p, nodemask_t *nodes) | |||
| 482 | switch (p->policy) { | 487 | switch (p->policy) { |
| 483 | case MPOL_BIND: | 488 | case MPOL_BIND: |
| 484 | for (i = 0; p->v.zonelist->zones[i]; i++) | 489 | for (i = 0; p->v.zonelist->zones[i]; i++) |
| 485 | node_set(p->v.zonelist->zones[i]->zone_pgdat->node_id, | 490 | node_set(zone_to_nid(p->v.zonelist->zones[i]), |
| 486 | *nodes); | 491 | *nodes); |
| 487 | break; | 492 | break; |
| 488 | case MPOL_DEFAULT: | 493 | case MPOL_DEFAULT: |
| @@ -1131,7 +1136,9 @@ static unsigned interleave_nodes(struct mempolicy *policy) | |||
| 1131 | */ | 1136 | */ |
| 1132 | unsigned slab_node(struct mempolicy *policy) | 1137 | unsigned slab_node(struct mempolicy *policy) |
| 1133 | { | 1138 | { |
| 1134 | switch (policy->policy) { | 1139 | int pol = policy ? policy->policy : MPOL_DEFAULT; |
| 1140 | |||
| 1141 | switch (pol) { | ||
| 1135 | case MPOL_INTERLEAVE: | 1142 | case MPOL_INTERLEAVE: |
| 1136 | return interleave_nodes(policy); | 1143 | return interleave_nodes(policy); |
| 1137 | 1144 | ||
| @@ -1140,7 +1147,7 @@ unsigned slab_node(struct mempolicy *policy) | |||
| 1140 | * Follow bind policy behavior and start allocation at the | 1147 | * Follow bind policy behavior and start allocation at the |
| 1141 | * first node. | 1148 | * first node. |
| 1142 | */ | 1149 | */ |
| 1143 | return policy->v.zonelist->zones[0]->zone_pgdat->node_id; | 1150 | return zone_to_nid(policy->v.zonelist->zones[0]); |
| 1144 | 1151 | ||
| 1145 | case MPOL_PREFERRED: | 1152 | case MPOL_PREFERRED: |
| 1146 | if (policy->v.preferred_node >= 0) | 1153 | if (policy->v.preferred_node >= 0) |
| @@ -1285,7 +1292,7 @@ struct page *alloc_pages_current(gfp_t gfp, unsigned order) | |||
| 1285 | 1292 | ||
| 1286 | if ((gfp & __GFP_WAIT) && !in_interrupt()) | 1293 | if ((gfp & __GFP_WAIT) && !in_interrupt()) |
| 1287 | cpuset_update_task_memory_state(); | 1294 | cpuset_update_task_memory_state(); |
| 1288 | if (!pol || in_interrupt()) | 1295 | if (!pol || in_interrupt() || (gfp & __GFP_THISNODE)) |
| 1289 | pol = &default_policy; | 1296 | pol = &default_policy; |
| 1290 | if (pol->policy == MPOL_INTERLEAVE) | 1297 | if (pol->policy == MPOL_INTERLEAVE) |
| 1291 | return alloc_page_interleave(gfp, order, interleave_nodes(pol)); | 1298 | return alloc_page_interleave(gfp, order, interleave_nodes(pol)); |
| @@ -1644,7 +1651,7 @@ void mpol_rebind_policy(struct mempolicy *pol, const nodemask_t *newmask) | |||
| 1644 | 1651 | ||
| 1645 | nodes_clear(nodes); | 1652 | nodes_clear(nodes); |
| 1646 | for (z = pol->v.zonelist->zones; *z; z++) | 1653 | for (z = pol->v.zonelist->zones; *z; z++) |
| 1647 | node_set((*z)->zone_pgdat->node_id, nodes); | 1654 | node_set(zone_to_nid(*z), nodes); |
| 1648 | nodes_remap(tmp, nodes, *mpolmask, *newmask); | 1655 | nodes_remap(tmp, nodes, *mpolmask, *newmask); |
| 1649 | nodes = tmp; | 1656 | nodes = tmp; |
| 1650 | 1657 | ||
