[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: Christoph Lameter <clameter@sgi.com>
Signed-off-by: Paul Jackson <pj@sgi.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
Christoph Lameter 2006-09-25 23:31:18 -07:00 committed by Linus Torvalds
parent 4e4785bcf0
commit 2f6726e54a
3 changed files with 27 additions and 15 deletions

View file

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

View file

@ -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)
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)
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;

View file

@ -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);
#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)
* 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)
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,
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)
{ {
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)
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)
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;