summaryrefslogtreecommitdiffstats
path: root/sys/boot
diff options
context:
space:
mode:
authormsmith <msmith@FreeBSD.org>1998-11-02 23:50:59 +0000
committermsmith <msmith@FreeBSD.org>1998-11-02 23:50:59 +0000
commite79304233b8444f43db31f1414e3cd2a1ea95587 (patch)
treed5ff59e1ce5dca229a4dc71d9e2414be00eb3f40 /sys/boot
parent7ff854a690d0b1907eb91aa8563be0d65545984d (diff)
downloadFreeBSD-src-e79304233b8444f43db31f1414e3cd2a1ea95587.zip
FreeBSD-src-e79304233b8444f43db31f1414e3cd2a1ea95587.tar.gz
Ok, the entry aging algorithm sucked; 1s time resolution is not enough for
LRU. Use a 31-bit counter instead. If we decide to do heavy I/O through the bootloader this will have to be revisited.
Diffstat (limited to 'sys/boot')
-rw-r--r--sys/boot/common/bcache.c23
1 files changed, 16 insertions, 7 deletions
diff --git a/sys/boot/common/bcache.c b/sys/boot/common/bcache.c
index 93a117f..aa85d5c 100644
--- a/sys/boot/common/bcache.c
+++ b/sys/boot/common/bcache.c
@@ -27,6 +27,7 @@ struct bcachectl
{
daddr_t bc_blkno;
time_t bc_stamp;
+ int bc_count;
};
static struct bcachectl *bcache_ctl;
@@ -35,6 +36,7 @@ static bitstr_t *bcache_miss;
static int bcache_nblks;
static int bcache_blksize;
static int bcache_hits, bcache_misses, bcache_ops, bcache_bypasses;
+static int bcache_bcount;
static void bcache_insert(caddr_t buf, daddr_t blkno);
static int bcache_lookup(caddr_t buf, daddr_t blkno);
@@ -73,7 +75,7 @@ bcache_init(int nblks, size_t bsize)
/* Invalidate the cache */
for (i = 0; i < bcache_nblks; i++)
- bcache_ctl[i].bc_stamp = 0;
+ bcache_ctl[i].bc_count = -1;
return(0);
}
@@ -160,35 +162,42 @@ bcache_strategy(void *devdata, int rw, daddr_t blk, size_t size, void *buf, size
/*
* Insert a block into the cache. Retire the oldest block to do so, if required.
+ *
+ * XXX the LRU algorithm will fail after 2^31 blocks have been transferred.
*/
static void
bcache_insert(caddr_t buf, daddr_t blkno)
{
time_t now;
- int i, cand;
+ int i, cand, ocount;
time(&now);
+ cand = 0; /* assume the first block */
+ ocount = bcache_ctl[0].bc_count;
/* find the oldest block */
- for (cand = 0, i = 1; i < bcache_nblks; i++) {
+ for (i = 1; i < bcache_nblks; i++) {
if (bcache_ctl[i].bc_blkno == blkno) {
/* reuse old entry */
cand = i;
break;
}
- if (bcache_ctl[i].bc_stamp < now)
+ if (bcache_ctl[i].bc_count < ocount) {
+ ocount = bcache_ctl[i].bc_count;
cand = i;
+ }
}
- DEBUG("insert blk %d -> %d @ %d", blkno, cand, now);
+ DEBUG("insert blk %d -> %d @ %d # %d", blkno, cand, now, bcache_bcount);
bcopy(buf, bcache_data + (bcache_blksize * cand), bcache_blksize);
bcache_ctl[cand].bc_blkno = blkno;
bcache_ctl[cand].bc_stamp = now;
+ bcache_ctl[cand].bc_count = bcache_bcount++;
}
/*
* Look for a block in the cache. Blocks more than BCACHE_TIMEOUT seconds old
- * may be stale (removable media) and thus are discarded. Copy the block out
+ * may be stale (removable media) and thus are discarded. Copy the block out
* if successful and return zero, or return nonzero on failure.
*/
static int
@@ -217,7 +226,7 @@ command_bcache(int argc, char *argv[])
int i;
for (i = 0; i < bcache_nblks; i++) {
- printf(" %02x: %08x %04x", i, bcache_ctl[i].bc_blkno, bcache_ctl[i].bc_stamp & 0xffff);
+ printf("%08x %04x %04x|", bcache_ctl[i].bc_blkno, bcache_ctl[i].bc_stamp & 0xffff, bcache_ctl[i].bc_count & 0xffff);
if (((i + 1) % 4) == 0)
printf("\n");
}
OpenPOWER on IntegriCloud