diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
commit | e5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch) | |
tree | d8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/cmd/cwfs/malloc.c |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/cwfs/malloc.c')
-rwxr-xr-x | sys/src/cmd/cwfs/malloc.c | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/sys/src/cmd/cwfs/malloc.c b/sys/src/cmd/cwfs/malloc.c new file mode 100755 index 000000000..b7014f770 --- /dev/null +++ b/sys/src/cmd/cwfs/malloc.c @@ -0,0 +1,130 @@ +#include "all.h" +#include "io.h" + +long niob; +long nhiob; +Hiob *hiob; + +/* + * Called to allocate permanent data structures + * Alignment is in number of bytes. It pertains both to the start and + * end of the allocated memory. + */ +void* +ialloc(ulong n, int align) +{ + void *p = mallocalign(n, align, 0, 0); + + if (p == nil) + panic("ialloc: out of memory"); + memset(p, 0, n); + return p; +} + +void +prbanks(void) +{ + Mbank *mbp; + + for(mbp = mconf.bank; mbp < &mconf.bank[mconf.nbank]; mbp++) + print("bank[%ld]: base 0x%8.8lux, limit 0x%8.8lux (%.0fMB)\n", + mbp - mconf.bank, mbp->base, mbp->limit, + (mbp->limit - mbp->base)/(double)MB); +} + +static void +cmd_memory(int, char *[]) +{ + prbanks(); +} + +enum { HWIDTH = 8 }; /* buffers per hash */ + +/* + * allocate rest of mem + * for io buffers. + */ +void +iobufinit(void) +{ + long m; + int i; + char *xiop; + Iobuf *p, *q; + Hiob *hp; + Mbank *mbp; + + wlock(&mainlock); /* init */ + wunlock(&mainlock); + + prbanks(); + m = 0; + for(mbp = mconf.bank; mbp < &mconf.bank[mconf.nbank]; mbp++) + m += mbp->limit - mbp->base; + + niob = m / (sizeof(Iobuf) + RBUFSIZE + sizeof(Hiob)/HWIDTH); + nhiob = niob / HWIDTH; + while(!prime(nhiob)) + nhiob++; + print("\t%ld buffers; %ld hashes\n", niob, nhiob); + hiob = ialloc(nhiob * sizeof(Hiob), 0); + hp = hiob; + for(i=0; i<nhiob; i++) { + lock(hp); + unlock(hp); + hp++; + } + p = ialloc(niob * sizeof(Iobuf), 0); + xiop = ialloc(niob * RBUFSIZE, 0); + hp = hiob; + for(i=0; i < niob; i++) { +// p->name = "buf"; + qlock(p); + qunlock(p); + if(hp == hiob) + hp = hiob + nhiob; + hp--; + q = hp->link; + if(q) { + p->fore = q; + p->back = q->back; + q->back = p; + p->back->fore = p; + } else { + hp->link = p; + p->fore = p; + p->back = p; + } + p->dev = devnone; + p->addr = -1; +// p->xiobuf = ialloc(RBUFSIZE, RBUFSIZE); + p->xiobuf = xiop; + p->iobuf = (char*)-1; + p++; + xiop += RBUFSIZE; + } + + /* + * Make sure that no more of bank[0] can be used. + */ + mconf.bank[0].base = mconf.bank[0].limit; + + i = 0; + for(mbp = mconf.bank; mbp < &mconf.bank[mconf.nbank]; mbp++) + i += mbp->limit - mbp->base; + print("\tmem left = %,d, out of %,ld\n", i, conf.mem); + /* paranoia: add this command as late as is easy */ + cmd_install("memory", "-- print ranges of memory banks", cmd_memory); +} + +void* +iobufmap(Iobuf *p) +{ + return p->iobuf = p->xiobuf; +} + +void +iobufunmap(Iobuf *p) +{ + p->iobuf = (char*)-1; +} |