git: 9front

Download patch

ref: be9cf8dc7901917dd8857a89c895424fad52c956
parent: 98b38a86e9d1102edf065cd7d4f8c58618675b39
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Fri May 2 20:51:45 EDT 2014

cwfs: fix 1GB memsize limitation

the malloc pool allocator is limited in its allocation
size. as almost all data structures in cwfs are never
freed, use brk() in ialloc() instead of mallocalign().
this means memory returned by ialloc() cannot be freed!

to make sure we do not call free by accident, remove
the #define malloc(n) ialloc(n, 0) macro and use ialloc()
directly as in the original code to show the intend
of permanent allocations.

--- a/sys/src/cmd/cwfs/all.h
+++ b/sys/src/cmd/cwfs/all.h
@@ -10,8 +10,6 @@
 #include "dat.h"
 #include "portfns.h"
 
-#define malloc(n)	ialloc(n, 0)
-
 #define	CHAT(cp) ((cons.flags&chatflag) || \
 			((cp) && (((Chan*)(cp))->flags&chatflag)))
 #define	QID9P1(a,b)	(Qid9p1){a,b}
--- a/sys/src/cmd/cwfs/chk.c
+++ b/sys/src/cmd/cwfs/chk.c
@@ -59,7 +59,6 @@
 chkalloc(ulong n)
 {
 	char *p = mallocz(n, 1);
-
 	if (p == nil)
 		panic("chkalloc: out of memory");
 	return p;
--- a/sys/src/cmd/cwfs/config.c
+++ b/sys/src/cmd/cwfs/config.c
@@ -175,7 +175,7 @@
 	Device *d, *t;
 	int m;
 
-	d = malloc(sizeof(Device));
+	d = ialloc(sizeof(Device), 0);
 	do {
 		t = config();
 		if(d->cat.first == 0)
@@ -233,8 +233,7 @@
 
 	if(f.error)
 		return devnone;
-	d = malloc(sizeof(Device));
-
+	d = ialloc(sizeof(Device), 0);
 	c = *f.charp++;
 	switch(c) {
 	default:
@@ -277,7 +276,7 @@
 		d->wren.ctrl = -1;
 		d->wren.targ = -1;
 		d->wren.lun = -1;
-		d->wren.file = malloc((e - s) + 1);
+		d->wren.file = ialloc((e - s) + 1, 0);
 		memmove(d->wren.file, s, e - s);
 		d->wren.file[e - s] = 0;
 		break;
@@ -336,7 +335,7 @@
 		d->type = Devcw;
 		d->cw.c = config();
 		d->cw.w = config();
-		d->cw.ro = malloc(sizeof(Device));
+		d->cw.ro = ialloc(sizeof(Device), 0);
 		d->cw.ro->type = Devro;
 		d->cw.ro->ro.parent = d;
 		f.lastcw = d;
--- a/sys/src/cmd/cwfs/cw.c
+++ b/sys/src/cmd/cwfs/cw.c
@@ -400,7 +400,7 @@
 		roflag = flag_install("ro", "-- ro reads and writes");
 		first = 1;
 	}
-	cw = malloc(sizeof(Cw));
+	cw = ialloc(sizeof(Cw), 0);
 	dev->private = cw;
 
 	cw->allflag = 0;
--- a/sys/src/cmd/cwfs/iobuf.c
+++ b/sys/src/cmd/cwfs/iobuf.c
@@ -1,7 +1,7 @@
 #include	"all.h"
 #include	"io.h"
 
-extern	long nhiob;
+extern	uint nhiob;
 extern	Hiob *hiob;
 
 Iobuf*
--- a/sys/src/cmd/cwfs/juke.c
+++ b/sys/src/cmd/cwfs/juke.c
@@ -1166,7 +1166,7 @@
 	 * allocate a juke structure
 	 * no locking problems.
 	 */
-	w = malloc(sizeof(Juke));
+	w = ialloc(sizeof(Juke), 0);
 	w->magic = Jukemagic;
 	w->isfixedsize = FIXEDSIZE;
 	w->link = jukelist;
--- a/sys/src/cmd/cwfs/main.c
+++ b/sys/src/cmd/cwfs/main.c
@@ -71,7 +71,7 @@
 				fields[0], mapfile);
 			continue;
 		}
-		map = malloc(sizeof *map);
+		map = ialloc(sizeof(Map), 0);
 		map->from = strdup(fields[0]);
 		map->to =   strdup(fields[1]);
 		map->fdev = iconfig(fields[0]);
@@ -323,15 +323,15 @@
 	netinit();
 	scsiinit();
 
-	files = malloc(conf.nfile * sizeof *files);
+	files = ialloc(conf.nfile * sizeof(*files), 0);
 	for(i=0; i < conf.nfile; i++) {
 		qlock(&files[i]);
 		qunlock(&files[i]);
 	}
 
-	wpaths = malloc(conf.nwpath * sizeof(*wpaths));
-	uid = malloc(conf.nuid * sizeof(*uid));
-	gidspace = malloc(conf.gidspace * sizeof(*gidspace));
+	wpaths = ialloc(conf.nwpath * sizeof(*wpaths), 0);
+	uid = ialloc(conf.nuid * sizeof(*uid), 0);
+	gidspace = ialloc(conf.gidspace * sizeof(*gidspace), 0);
 
 	iobufinit();
 
@@ -597,11 +597,12 @@
 inqsize(char *file)
 {
 	int nf;
-	char *ln, *end, *data = malloc(strlen(file) + 5 + 1);
+	char *ln, *end, *data;
 	char *fields[4];
 	Devsize rv = -1;
 	Biobuf *bp;
 
+	data = malloc(strlen(file) + 5 + 1);
 	strcpy(data, file);
 	end = strstr(data, "/data");
 	if (end == nil)
@@ -621,4 +622,3 @@
 	free(data);
 	return rv;
 }
-
--- a/sys/src/cmd/cwfs/malloc.c
+++ b/sys/src/cmd/cwfs/malloc.c
@@ -1,10 +1,12 @@
 #include "all.h"
 #include "io.h"
 
-static ulong
+#include <pool.h>
+
+static uvlong
 memsize(void)
 {
-	ulong pgsize, pgmax, userpgs, userused;
+	ulong pgsize, userpgs, userused;
 	char *s, *f[2];
 	int n, mpcnt;
 	Biobuf *bp;
@@ -37,17 +39,13 @@
 		if(mpcnt < 1)
 			mpcnt = 1;
 		userpgs = (userpgs*mpcnt)/100;
-		pgmax = (1024*1024*1024)/pgsize;	/* 1GB max */
-		if(userpgs > pgmax)
-			userpgs = pgmax;
-		return userpgs*pgsize;
+		return (uvlong)userpgs*pgsize;
 	}
 	return 16*MB;
 }
 
-
-long	niob;
-long	nhiob;
+uint	niob;
+uint	nhiob;
 Hiob	*hiob;
 
 /*
@@ -56,14 +54,26 @@
  * end of the allocated memory.
  */
 void*
-ialloc(ulong n, int align)
+ialloc(uintptr n, int align)
 {
-	void *p = mallocalign(n, align, 0, 0);
+	char *p;
+	int m;
 
-	if (p == nil)
+	if(align <= 0)
+		align = sizeof(uintptr);
+
+	mainmem->lock(mainmem);
+
+	p = sbrk(0);
+	if(m = n % align)
+		n += align - m;
+	if(m = (uintptr)p % align)
+		p += align - m;
+	if(brk(p+n) < 0)
 		panic("ialloc: out of memory");
-	setmalloctag(p, getcallerpc(&n));
-	memset(p, 0, n);
+
+	mainmem->unlock(mainmem);
+
 	return p;
 }
 
@@ -89,7 +99,7 @@
 	while(!prime(nhiob))
 		nhiob++;
 	if(chatty)
-		print("\t%ld buffers; %ld hashes\n", niob, nhiob);
+		print("\t%ud buffers; %ud hashes\n", niob, nhiob);
 	hiob = ialloc(nhiob * sizeof(Hiob), 0);
 	hp = hiob;
 	for(i=0; i<nhiob; i++) {
--- a/sys/src/cmd/cwfs/mworm.c
+++ b/sys/src/cmd/cwfs/mworm.c
@@ -14,7 +14,7 @@
 		d->cat.ndev++;
 	}
 
-	list = malloc(d->cat.ndev*sizeof(Device*));
+	list = ialloc(d->cat.ndev * sizeof(Device*), 0);
 	d->private = list;
 	for(x=d->cat.first; x; x=x->link) {
 		*list++ = x;
--- a/sys/src/cmd/cwfs/portfns.h
+++ b/sys/src/cmd/cwfs/portfns.h
@@ -95,7 +95,7 @@
 Off	getraddr(Device*);
 void	hexdump(void*, int);
 int	iaccess(File*, Dentry*, int);
-void*	ialloc(ulong, int);
+void*	ialloc(uintptr, int);
 Off	ibbpow(int);
 Off	ibbpowsum(int);
 Device*	iconfig(char *);
--- a/sys/src/cmd/cwfs/scsi.c
+++ b/sys/src/cmd/cwfs/scsi.c
@@ -46,8 +46,8 @@
 
 			tp->ctlrno = ctlrno;
 			tp->targetno = targetno;
-			tp->inquiry = malloc(Ninquiry);
-			tp->sense = malloc(Nsense);
+			tp->inquiry = ialloc(Ninquiry, 0);
+			tp->sense = ialloc(Nsense, 0);
 		}
 	}
 }
--- a/sys/src/cmd/cwfs/sub.c
+++ b/sys/src/cmd/cwfs/sub.c
@@ -38,7 +38,7 @@
 	Chan *cp, *icp;
 	int i;
 
-	p = malloc(count * (sizeof(Chan)+data));
+	p = ialloc(count * (sizeof(Chan)+data), 0);
 	icp = (Chan*)p;
 	for(i = 0; i < count; i++) {
 		cp = (Chan*)p;
@@ -761,17 +761,17 @@
 	msgalloc.lmsgbuf = 0;
 	msgalloc.smsgbuf = 0;
 	for(i=0; i<conf.nlgmsg; i++) {
-		mb = malloc(sizeof(Msgbuf));
+		mb = ialloc(sizeof(Msgbuf), 0);
 		mb->magic = Mbmagic;
-		mb->xdata = malloc(LARGEBUF+Slop);
+		mb->xdata = ialloc(LARGEBUF+Slop, 0);
 		mb->flags = LARGE;
 		mbfree(mb);
 		cons.nlarge++;
 	}
 	for(i=0; i<conf.nsmmsg; i++) {
-		mb = malloc(sizeof(Msgbuf));
+		mb = ialloc(sizeof(Msgbuf), 0);
 		mb->magic = Mbmagic;
-		mb->xdata = malloc(SMALLBUF+Slop);
+		mb->xdata = ialloc(SMALLBUF+Slop, 0);
 		mb->flags = 0;
 		mbfree(mb);
 		cons.nsmall++;
@@ -782,7 +782,7 @@
 	unlock(&rabuflock);
 	rabuffree = 0;
 	for(i=0; i<1000; i++) {
-		rb = malloc(sizeof(*rb));
+		rb = ialloc(sizeof(*rb), 0);
 		rb->link = rabuffree;
 		rabuffree = rb;
 	}
@@ -799,8 +799,8 @@
 			panic("msgbuf count");
 		mb = msgalloc.lmsgbuf;
 		if(mb == nil) {
-			mb = malloc(sizeof(Msgbuf));
-			mb->xdata = malloc(LARGEBUF+Slop);
+			mb = ialloc(sizeof(Msgbuf), 0);
+			mb->xdata = ialloc(LARGEBUF+Slop, 0);
 			cons.nlarge++;
 		} else
 			msgalloc.lmsgbuf = mb->next;
@@ -808,8 +808,8 @@
 	} else {
 		mb = msgalloc.smsgbuf;
 		if(mb == nil) {
-			mb = malloc(sizeof(Msgbuf));
-			mb->xdata = malloc(SMALLBUF+Slop);
+			mb = ialloc(sizeof(Msgbuf), 0);
+			mb->xdata = ialloc(SMALLBUF+Slop, 0);
 			cons.nsmall++;
 		} else
 			msgalloc.smsgbuf = mb->next;
@@ -958,7 +958,7 @@
 {
 	Queue *q;
 
-	q = malloc(sizeof(Queue) + (size-1)*sizeof(void*));
+	q = ialloc(sizeof(Queue) + (size-1)*sizeof(void*), 0);
 	q->size = size;
 	q->avail = size;
 	q->count = 0;
--- a/sys/src/cmd/cwfs/wren.c
+++ b/sys/src/cmd/cwfs/wren.c
@@ -39,7 +39,7 @@
 
 	if(d->private)
 		return;
-	d->private = dr = malloc(sizeof(Wren));
+	d->private = dr = ialloc(sizeof(Wren), 0);
 
 	if (d->wren.file)
 		d->wren.sddata = dataof(d->wren.file);
--