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 } 131