Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 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*
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
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
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
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*
121
iobufmap(Iobuf *p)
122
{
123
	return p->iobuf = p->xiobuf;
124
}
125
 
126
void
127
iobufunmap(Iobuf *p)
128
{
129
	p->iobuf = (char*)-1;
130
}