On Tue, 31 Jan 2006 19:07:35 -0800 chandra seetharaman <[EMAIL PROTECTED]> wrote:
> I tried to use the controller but having some problems. > > - Created class a, > - set guarantee to 50(with parent having 100, i expected class a to get > 50% of memory in the system). > - moved my shell to class a. > - Issued a make in the kernel tree. > It consistently fails with > ----------- > make: getcwd: : Cannot allocate memory > Makefile:313: /scripts/Kbuild.include: No such file or directory > Makefile:532: /arch/i386/Makefile: No such file or directory > Can't open perl script "/scripts/setlocalversion": No such file or > directory > make: *** No rule to make target `/arch/i386/Makefile'. Stop. > ----------- > Note that the compilation succeeds if I move my shell to the default > class. I could reproduce this problem. Could you try the attached patch? > I got a oops too: I can't reproduce the oops so far. Does this oops also occur constantly?
Index: mm/mem_rc_pzone.c =================================================================== RCS file: /cvsroot/ckrm/memrc-pzone/mm/mem_rc_pzone.c,v retrieving revision 1.9 diff -u -p -r1.9 mem_rc_pzone.c --- mm/mem_rc_pzone.c 19 Jan 2006 05:40:13 -0000 1.9 +++ mm/mem_rc_pzone.c 3 Feb 2006 01:01:22 -0000 @@ -38,7 +38,7 @@ struct mem_rc { unsigned long guarantee; struct mem_rc_domain *rcd; struct zone **zones[MAX_NUMNODES]; - struct zonelist *zonelists[MAX_NUMNODES]; + struct zonelist *zonelists[MAX_NUMNODES][GFP_ZONETYPES]; }; @@ -109,7 +109,7 @@ static void *mem_rc_create(void *arg, st struct zone *parent, *z, *z_ref; pg_data_t *pgdat; int node, allocn; - int i, j; + int i, j, k; allocn = first_node(rcd->nodes); mr = kmalloc_node(sizeof(*mr), GFP_KERNEL, allocn); @@ -132,13 +132,16 @@ static void *mem_rc_create(void *arg, st memset(mr->zones[node], 0, sizeof(*mr->zones[node]) * MAX_NR_ZONES); - mr->zonelists[node] - = kmalloc_node(sizeof(*mr->zonelists[node]), - GFP_KERNEL, allocn); - if (!mr->zonelists[node]) - goto failed; + for (i = 0; i < GFP_ZONETYPES; i++) { + mr->zonelists[node][i] + = kmalloc_node(sizeof(*mr->zonelists[node]), + GFP_KERNEL, allocn); + if (!mr->zonelists[node][i]) + goto failed; - memset(mr->zonelists[node], 0, sizeof(*mr->zonelists[node])); + memset(mr->zonelists[node][i], 0, + sizeof(*mr->zonelists[node][i])); + } for (i = 0; i < MAX_NR_ZONES; i++) { parent = pgdat->node_zones + i; @@ -153,21 +156,22 @@ static void *mem_rc_create(void *arg, st } for_each_node_mask(node, rcd->nodes) { - /* NORMAL zones and DMA zones also in HIGHMEM zonelist. */ - zl_ref = NODE_DATA(node)->node_zonelists + __GFP_HIGHMEM; - zl = mr->zonelists[node]; - - for (j = i = 0; i < ARRAY_SIZE(zl_ref->zones); i++) { - z_ref = zl_ref->zones[i]; - if (!z_ref) - break; - - z = mr->zones[node][zone_idx(z_ref)]; - if (!z) - continue; - zl->zones[j++] = z; + for (i = 0; i < GFP_ZONETYPES; i++) { + zl_ref = NODE_DATA(node)->node_zonelists + i; + zl = mr->zonelists[node][i]; + + for (j = k = 0; k < ARRAY_SIZE(zl_ref->zones); k++) { + z_ref = zl_ref->zones[k]; + if (!z_ref) + break; + + z = mr->zones[node][zone_idx(z_ref)]; + if (!z) + continue; + zl->zones[j++] = z; + } + zl->zones[j] = NULL; } - zl->zones[j] = NULL; } up(&rcd->sem); @@ -175,8 +179,10 @@ static void *mem_rc_create(void *arg, st failed: for_each_node_mask(node, rcd->nodes) { - if (mr->zonelists[node]) - kfree(mr->zonelists[node]); + for (i = 0; i < GFP_ZONETYPES; i++) { + if (mr->zonelists[node][i]) + kfree(mr->zonelists[node][i]); + } if (!mr->zones[node]) continue; @@ -204,8 +210,10 @@ static void mem_rc_destroy(void *p) down(&rcd->sem); for (node = 0; node < MAX_NUMNODES; node++) { - if (mr->zonelists[node]) - kfree(mr->zonelists[node]); + for (i = 0; i < GFP_ZONETYPES; i++) { + if (mr->zonelists[node][i]) + kfree(mr->zonelists[node][i]); + } if (!mr->zones[node]) continue; @@ -341,14 +349,15 @@ EXPORT_SYMBOL(mem_rc_get); struct page *alloc_page_mem_rc(int nid, gfp_t gfpmask) { struct mem_rc *mr; + gfp_t zoneidx = gfpmask & GFP_ZONEMASK; mr = mem_rc_get(current); if (!mr) return __alloc_pages(gfpmask, 0, NODE_DATA(nid)->node_zonelists - + (gfpmask & GFP_ZONEMASK)); + + zoneidx); - return __alloc_pages(gfpmask, 0, mr->zonelists[nid]); + return __alloc_pages(gfpmask, 0, mr->zonelists[nid][zoneidx]); } EXPORT_SYMBOL(alloc_page_mem_rc); @@ -364,5 +373,5 @@ struct zonelist *mem_rc_get_zonelist(int if (!mr) return NULL; - return mr->zonelists[nd]; + return mr->zonelists[nd][gfpmask & GFP_ZONEMASK]; }