xref: /plan9/sys/src/cmd/cwfs/malloc.c (revision 01a344a29f2ff35133953eaef092a50fc8c3163b)
1 #include "all.h"
2 #include "io.h"
3 
4 long	niob;
5 long	nhiob;
6 Hiob	*hiob;
7 
8 /*
9  * Called to allocate permanent data structures
10  * Alignment is in number of bytes. It pertains both to the start and
11  * end of the allocated memory.
12  */
13 void*
ialloc(ulong n,int align)14 ialloc(ulong n, int align)
15 {
16 	void *p = mallocalign(n, align, 0, 0);
17 
18 	if (p == nil)
19 		panic("ialloc: out of memory");
20 	memset(p, 0, n);
21 	return p;
22 }
23 
24 void
prbanks(void)25 prbanks(void)
26 {
27 	Mbank *mbp;
28 
29 	for(mbp = mconf.bank; mbp < &mconf.bank[mconf.nbank]; mbp++)
30 		print("bank[%ld]: base 0x%8.8lux, limit 0x%8.8lux (%.0fMB)\n",
31 			mbp - mconf.bank, mbp->base, mbp->limit,
32 			(mbp->limit - mbp->base)/(double)MB);
33 }
34 
35 static void
cmd_memory(int,char * [])36 cmd_memory(int, char *[])
37 {
38 	prbanks();
39 }
40 
41 enum { HWIDTH = 8 };		/* buffers per hash */
42 
43 /*
44  * allocate rest of mem
45  * for io buffers.
46  */
47 void
iobufinit(void)48 iobufinit(void)
49 {
50 	long m;
51 	int i;
52 	char *xiop;
53 	Iobuf *p, *q;
54 	Hiob *hp;
55 	Mbank *mbp;
56 
57 	wlock(&mainlock);	/* init */
58 	wunlock(&mainlock);
59 
60 	prbanks();
61 	m = 0;
62 	for(mbp = mconf.bank; mbp < &mconf.bank[mconf.nbank]; mbp++)
63 		m += mbp->limit - mbp->base;
64 
65 	niob = m / (sizeof(Iobuf) + RBUFSIZE + sizeof(Hiob)/HWIDTH);
66 	nhiob = niob / HWIDTH;
67 	while(!prime(nhiob))
68 		nhiob++;
69 	print("\t%ld buffers; %ld hashes\n", niob, nhiob);
70 	hiob = ialloc(nhiob * sizeof(Hiob), 0);
71 	hp = hiob;
72 	for(i=0; i<nhiob; i++) {
73 		lock(hp);
74 		unlock(hp);
75 		hp++;
76 	}
77 	p = ialloc(niob * sizeof(Iobuf), 0);
78 	xiop = ialloc(niob * RBUFSIZE, 0);
79 	hp = hiob;
80 	for(i=0; i < niob; i++) {
81 //		p->name = "buf";
82 		qlock(p);
83 		qunlock(p);
84 		if(hp == hiob)
85 			hp = hiob + nhiob;
86 		hp--;
87 		q = hp->link;
88 		if(q) {
89 			p->fore = q;
90 			p->back = q->back;
91 			q->back = p;
92 			p->back->fore = p;
93 		} else {
94 			hp->link = p;
95 			p->fore = p;
96 			p->back = p;
97 		}
98 		p->dev = devnone;
99 		p->addr = -1;
100 //		p->xiobuf = ialloc(RBUFSIZE, RBUFSIZE);
101 		p->xiobuf = xiop;
102 		p->iobuf = (char*)-1;
103 		p++;
104 		xiop += RBUFSIZE;
105 	}
106 
107 	/*
108 	 * Make sure that no more of bank[0] can be used.
109 	 */
110 	mconf.bank[0].base = mconf.bank[0].limit;
111 
112 	i = 0;
113 	for(mbp = mconf.bank; mbp < &mconf.bank[mconf.nbank]; mbp++)
114 		i += mbp->limit - mbp->base;
115 	print("\tmem left = %,d, out of %,ld\n", i, conf.mem);
116 	/* paranoia: add this command as late as is easy */
117 	cmd_install("memory", "-- print ranges of memory banks", cmd_memory);
118 }
119 
120 void*
iobufmap(Iobuf * p)121 iobufmap(Iobuf *p)
122 {
123 	return p->iobuf = p->xiobuf;
124 }
125 
126 void
iobufunmap(Iobuf * p)127 iobufunmap(Iobuf *p)
128 {
129 	p->iobuf = (char*)-1;
130 }
131