Lines Matching refs:dcache

67 static DCache	dcache;  variable
91 dcache.full.l = &dcache.lock; in initdcache()
92 dcache.nblocks = nblocks; in initdcache()
93 dcache.maxdirty = (nblocks * 2) / 3; in initdcache()
95 nblocks, blocksize, dcache.maxdirty); in initdcache()
96 dcache.size = blocksize; in initdcache()
97 dcache.heads = MKNZ(DBlock*, HashSize); in initdcache()
98 dcache.heap = MKNZ(DBlock*, nblocks); in initdcache()
99 dcache.blocks = MKNZ(DBlock, nblocks); in initdcache()
100 dcache.write = MKNZ(DBlock*, nblocks); in initdcache()
101 dcache.mem = MKNZ(u8int, (nblocks+1+128) * blocksize); in initdcache()
104 p = (u8int*)(((uintptr)dcache.mem+blocksize-1)&~(uintptr)(blocksize-1)); in initdcache()
106 b = &dcache.blocks[i]; in initdcache()
114 dcache.free = last; in initdcache()
115 dcache.nheap = 0; in initdcache()
117 initround(&dcache.round, "dcache", 120*1000); in initdcache()
120 vtproc(delaykickroundproc, &dcache.round); in initdcache()
155 if(size > dcache.size){ in _getdblock()
156 seterr(EAdmin, "block size %d too big for cache with size %d", size, dcache.size); in _getdblock()
166 qlock(&dcache.lock); in _getdblock()
168 for(b = dcache.heads[h]; b != nil; b = b->next){ in _getdblock()
181 qunlock(&dcache.lock); in _getdblock()
196 rsleep(&dcache.full); in _getdblock()
207 b->used = (b->used2 + dcache.now) / 2; in _getdblock()
212 b->next = dcache.heads[h]; in _getdblock()
213 dcache.heads[h] = b; in _getdblock()
225 b->used = dcache.now++; in _getdblock()
231 part->writechan = chancreate(sizeof(DBlock*), dcache.nblocks); in _getdblock()
234 qunlock(&dcache.lock); in _getdblock()
297 qlock(&dcache.lock); in putdblock()
300 upheap(dcache.nheap++, b); in putdblock()
301 rwakeupall(&dcache.full); in putdblock()
303 qunlock(&dcache.lock); in putdblock()
322 qlock(&dcache.lock); in dirtydblock()
324 dcache.ndirty++; in dirtydblock()
325 setstat(StatDcacheDirty, dcache.ndirty); in dirtydblock()
326 if(dcache.ndirty >= dcache.maxdirty) in dirtydblock()
327 kickround(&dcache.round, 0); in dirtydblock()
329 delaykickround(&dcache.round); in dirtydblock()
331 qunlock(&dcache.lock); in dirtydblock()
344 if(dcache.heads[h] != b) in unchain()
346 dcache.heads[h] = b->next; in unchain()
362 b = dcache.free; in bumpdblock()
364 dcache.free = b->next; in bumpdblock()
368 if(dcache.ndirty >= dcache.maxdirty) in bumpdblock()
377 if(dcache.nheap == 0){ in bumpdblock()
382 b = dcache.heap[0]; in bumpdblock()
399 qlock(&dcache.lock); in emptydcache()
400 while(dcache.nheap > 0){ in emptydcache()
401 b = dcache.heap[0]; in emptydcache()
405 b->next = dcache.free; in emptydcache()
406 dcache.free = b; in emptydcache()
409 qunlock(&dcache.lock); in emptydcache()
420 fixheap(db->heap, dcache.heap[--dcache.nheap]); in delheap()
441 now = dcache.now; in upheap()
444 bb = dcache.heap[p]; in upheap()
447 dcache.heap[i] = bb; in upheap()
451 dcache.heap[i] = b; in upheap()
463 now = dcache.now; in downheap()
466 if(k >= dcache.nheap) in downheap()
468 if(k + 1 < dcache.nheap && dcache.heap[k]->used2 - now > dcache.heap[k + 1]->used2 - now) in downheap()
470 bb = dcache.heap[k]; in downheap()
473 dcache.heap[i] = bb; in downheap()
477 dcache.heap[i] = b; in downheap()
490 for(b = dcache.heads[h]; b != nil; b = b->next){ in findblock()
507 qlock(&dcache.lock); in checkdcache()
508 size = dcache.size; in checkdcache()
509 now = dcache.now; in checkdcache()
510 for(i = 0; i < dcache.nheap; i++){ in checkdcache()
511 if(dcache.heap[i]->heap != i) in checkdcache()
512 sysfatal("dc: mis-heaped at %d: %d", i, dcache.heap[i]->heap); in checkdcache()
513 if(i > 0 && dcache.heap[(i - 1) >> 1]->used2 - now > dcache.heap[i]->used2 - now) in checkdcache()
516 if(k < dcache.nheap && dcache.heap[i]->used2 - now > dcache.heap[k]->used2 - now) in checkdcache()
519 if(k < dcache.nheap && dcache.heap[i]->used2 - now > dcache.heap[k]->used2 - now) in checkdcache()
524 for(i = 0; i < dcache.nblocks; i++){ in checkdcache()
525 b = &dcache.blocks[i]; in checkdcache()
526 if(b->data != &dcache.mem[i * size]) in checkdcache()
533 && dcache.heap[b->heap] != b) in checkdcache()
538 for(b = dcache.free; b != nil; b = b->next){ in checkdcache()
544 if(dcache.nheap + nfree + refed != dcache.nblocks) in checkdcache()
545 sysfatal("dc: missing blocks: %d %d %d", dcache.nheap, refed, dcache.nblocks); in checkdcache()
546 qunlock(&dcache.lock); in checkdcache()
553 kickround(&dcache.round, 1); in flushdcache()
560 kickround(&dcache.round, 0); in kickdcache()
627 waitforkick(&dcache.round); in flushproc()
633 write = dcache.write; in flushproc()
635 for(i=0; i<dcache.nblocks; i++){ in flushproc()
636 b = &dcache.blocks[i]; in flushproc()
668 qlock(&dcache.lock); in flushproc()
671 --dcache.ndirty; in flushproc()
673 upheap(dcache.nheap++, b); in flushproc()
674 rwakeupall(&dcache.full); in flushproc()
677 setstat(StatDcacheDirty, dcache.ndirty); in flushproc()
678 qunlock(&dcache.lock); in flushproc()