Commit 2f6726e5 authored by Christoph Lameter's avatar Christoph Lameter Committed by Linus Torvalds

[PATCH] Apply type enum zone_type

After we have done this we can now do some typing cleanup.

The memory policy layer keeps a policy_zone that specifies
the zone that gets memory policies applied. This variable
can now be of type enum zone_type.

The check_highest_zone function and the build_zonelists funnctionm must
then also take a enum zone_type parameter.

Plus there are a number of loops over zones that also should use
zone_type.

We run into some troubles at some points with functions that need a
zone_type variable to become -1. Fix that up.

[pj@sgi.com: fix set_mempolicy() crash]
Signed-off-by: default avatarChristoph Lameter <clameter@sgi.com>
Signed-off-by: default avatarPaul Jackson <pj@sgi.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 4e4785bc
...@@ -162,9 +162,9 @@ extern struct zonelist *huge_zonelist(struct vm_area_struct *vma, ...@@ -162,9 +162,9 @@ extern struct zonelist *huge_zonelist(struct vm_area_struct *vma,
unsigned long addr); unsigned long addr);
extern unsigned slab_node(struct mempolicy *policy); extern unsigned slab_node(struct mempolicy *policy);
extern int policy_zone; extern enum zone_type policy_zone;
static inline void check_highest_zone(int k) static inline void check_highest_zone(enum zone_type k)
{ {
if (k > policy_zone) if (k > policy_zone)
policy_zone = k; policy_zone = k;
......
...@@ -105,7 +105,7 @@ static struct kmem_cache *sn_cache; ...@@ -105,7 +105,7 @@ static struct kmem_cache *sn_cache;
/* Highest zone. An specific allocation for a zone below that is not /* Highest zone. An specific allocation for a zone below that is not
policied. */ policied. */
int policy_zone = ZONE_DMA; enum zone_type policy_zone = ZONE_DMA;
struct mempolicy default_policy = { struct mempolicy default_policy = {
.refcnt = ATOMIC_INIT(1), /* never free it */ .refcnt = ATOMIC_INIT(1), /* never free it */
...@@ -137,7 +137,8 @@ static int mpol_check_policy(int mode, nodemask_t *nodes) ...@@ -137,7 +137,8 @@ static int mpol_check_policy(int mode, nodemask_t *nodes)
static struct zonelist *bind_zonelist(nodemask_t *nodes) static struct zonelist *bind_zonelist(nodemask_t *nodes)
{ {
struct zonelist *zl; struct zonelist *zl;
int num, max, nd, k; int num, max, nd;
enum zone_type k;
max = 1 + MAX_NR_ZONES * nodes_weight(*nodes); max = 1 + MAX_NR_ZONES * nodes_weight(*nodes);
zl = kmalloc(sizeof(struct zone *) * max, GFP_KERNEL); zl = kmalloc(sizeof(struct zone *) * max, GFP_KERNEL);
...@@ -148,12 +149,16 @@ static struct zonelist *bind_zonelist(nodemask_t *nodes) ...@@ -148,12 +149,16 @@ static struct zonelist *bind_zonelist(nodemask_t *nodes)
lower zones etc. Avoid empty zones because the memory allocator lower zones etc. Avoid empty zones because the memory allocator
doesn't like them. If you implement node hot removal you doesn't like them. If you implement node hot removal you
have to fix that. */ have to fix that. */
for (k = policy_zone; k >= 0; k--) { k = policy_zone;
while (1) {
for_each_node_mask(nd, *nodes) { for_each_node_mask(nd, *nodes) {
struct zone *z = &NODE_DATA(nd)->node_zones[k]; struct zone *z = &NODE_DATA(nd)->node_zones[k];
if (z->present_pages > 0) if (z->present_pages > 0)
zl->zones[num++] = z; zl->zones[num++] = z;
} }
if (k == 0)
break;
k--;
} }
zl->zones[num] = NULL; zl->zones[num] = NULL;
return zl; return zl;
......
...@@ -637,7 +637,8 @@ static int rmqueue_bulk(struct zone *zone, unsigned int order, ...@@ -637,7 +637,8 @@ static int rmqueue_bulk(struct zone *zone, unsigned int order,
*/ */
void drain_node_pages(int nodeid) void drain_node_pages(int nodeid)
{ {
int i, z; int i;
enum zone_type z;
unsigned long flags; unsigned long flags;
for (z = 0; z < MAX_NR_ZONES; z++) { for (z = 0; z < MAX_NR_ZONES; z++) {
...@@ -1158,7 +1159,8 @@ EXPORT_SYMBOL(nr_free_pages); ...@@ -1158,7 +1159,8 @@ EXPORT_SYMBOL(nr_free_pages);
#ifdef CONFIG_NUMA #ifdef CONFIG_NUMA
unsigned int nr_free_pages_pgdat(pg_data_t *pgdat) unsigned int nr_free_pages_pgdat(pg_data_t *pgdat)
{ {
unsigned int i, sum = 0; unsigned int sum = 0;
enum zone_type i;
for (i = 0; i < MAX_NR_ZONES; i++) for (i = 0; i < MAX_NR_ZONES; i++)
sum += pgdat->node_zones[i].free_pages; sum += pgdat->node_zones[i].free_pages;
...@@ -1358,21 +1360,22 @@ void show_free_areas(void) ...@@ -1358,21 +1360,22 @@ void show_free_areas(void)
* Add all populated zones of a node to the zonelist. * Add all populated zones of a node to the zonelist.
*/ */
static int __meminit build_zonelists_node(pg_data_t *pgdat, static int __meminit build_zonelists_node(pg_data_t *pgdat,
struct zonelist *zonelist, int nr_zones, int zone_type) struct zonelist *zonelist, int nr_zones, enum zone_type zone_type)
{ {
struct zone *zone; struct zone *zone;
BUG_ON(zone_type >= MAX_NR_ZONES); BUG_ON(zone_type >= MAX_NR_ZONES);
zone_type++;
do { do {
zone_type--;
zone = pgdat->node_zones + zone_type; zone = pgdat->node_zones + zone_type;
if (populated_zone(zone)) { if (populated_zone(zone)) {
zonelist->zones[nr_zones++] = zone; zonelist->zones[nr_zones++] = zone;
check_highest_zone(zone_type); check_highest_zone(zone_type);
} }
zone_type--;
} while (zone_type >= 0); } while (zone_type);
return nr_zones; return nr_zones;
} }
...@@ -1441,10 +1444,11 @@ static int __meminit find_next_best_node(int node, nodemask_t *used_node_mask) ...@@ -1441,10 +1444,11 @@ static int __meminit find_next_best_node(int node, nodemask_t *used_node_mask)
static void __meminit build_zonelists(pg_data_t *pgdat) static void __meminit build_zonelists(pg_data_t *pgdat)
{ {
int i, j, k, node, local_node; int i, j, node, local_node;
int prev_node, load; int prev_node, load;
struct zonelist *zonelist; struct zonelist *zonelist;
nodemask_t used_mask; nodemask_t used_mask;
enum zone_type k;
/* initialize zonelists */ /* initialize zonelists */
for (i = 0; i < GFP_ZONETYPES; i++) { for (i = 0; i < GFP_ZONETYPES; i++) {
...@@ -1628,7 +1632,7 @@ static void __init calculate_zone_totalpages(struct pglist_data *pgdat, ...@@ -1628,7 +1632,7 @@ static void __init calculate_zone_totalpages(struct pglist_data *pgdat,
unsigned long *zones_size, unsigned long *zholes_size) unsigned long *zones_size, unsigned long *zholes_size)
{ {
unsigned long realtotalpages, totalpages = 0; unsigned long realtotalpages, totalpages = 0;
int i; enum zone_type i;
for (i = 0; i < MAX_NR_ZONES; i++) for (i = 0; i < MAX_NR_ZONES; i++)
totalpages += zones_size[i]; totalpages += zones_size[i];
...@@ -2116,7 +2120,7 @@ static void calculate_totalreserve_pages(void) ...@@ -2116,7 +2120,7 @@ static void calculate_totalreserve_pages(void)
{ {
struct pglist_data *pgdat; struct pglist_data *pgdat;
unsigned long reserve_pages = 0; unsigned long reserve_pages = 0;
int i, j; enum zone_type i, j;
for_each_online_pgdat(pgdat) { for_each_online_pgdat(pgdat) {
for (i = 0; i < MAX_NR_ZONES; i++) { for (i = 0; i < MAX_NR_ZONES; i++) {
...@@ -2149,7 +2153,7 @@ static void calculate_totalreserve_pages(void) ...@@ -2149,7 +2153,7 @@ static void calculate_totalreserve_pages(void)
static void setup_per_zone_lowmem_reserve(void) static void setup_per_zone_lowmem_reserve(void)
{ {
struct pglist_data *pgdat; struct pglist_data *pgdat;
int j, idx; enum zone_type j, idx;
for_each_online_pgdat(pgdat) { for_each_online_pgdat(pgdat) {
for (j = 0; j < MAX_NR_ZONES; j++) { for (j = 0; j < MAX_NR_ZONES; j++) {
...@@ -2158,9 +2162,12 @@ static void setup_per_zone_lowmem_reserve(void) ...@@ -2158,9 +2162,12 @@ static void setup_per_zone_lowmem_reserve(void)
zone->lowmem_reserve[j] = 0; zone->lowmem_reserve[j] = 0;
for (idx = j-1; idx >= 0; idx--) { idx = j;
while (idx) {
struct zone *lower_zone; struct zone *lower_zone;
idx--;
if (sysctl_lowmem_reserve_ratio[idx] < 1) if (sysctl_lowmem_reserve_ratio[idx] < 1)
sysctl_lowmem_reserve_ratio[idx] = 1; sysctl_lowmem_reserve_ratio[idx] = 1;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment