ref: 4c639475ce8cf0aec59632b6f7537169f1537f13
parent: 72e4d850a4c2b334b3442dd39aa973650e5d5ba4
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);
--
⑨