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];
}