On Fri, 3 Feb 2006 10:33:58 +0900
KUROSAWA Takahiro <[EMAIL PROTECTED]> wrote:
> 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'm sorry, the patch attached to my previous mail has a severe bug.
Could you try this patch instead?
Also, the code still doesn't work if you enable preemption because of
a locking problem so far...
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 08:30:15 -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][i]),
+ 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[z_ref->zone_pgdat->node_id][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];
}