aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorColin Percival <cperciva@FreeBSD.org>2021-10-03 19:10:36 +0000
committerColin Percival <cperciva@FreeBSD.org>2021-10-03 19:10:36 +0000
commitb841148bbbdc967c871e8742a6f0b7b17b2d1d91 (patch)
tree9893c2594af6fd3a0b5010063051436fd6b560ce
parent31776afdc79d5fb1ea211cc2a69c17c62b3dc8ff (diff)
downloadsrc-b841148bbbdc967c871e8742a6f0b7b17b2d1d91.tar.gz
src-b841148bbbdc967c871e8742a6f0b7b17b2d1d91.zip
loader: Refactor readahead adjustment in bcache
While I'm here, add an explanatory comment. No functional change intended. Reviewed by: imp, tsoome (previous version) MFC after: 1 week Sponsored by: https://patreon.com/cperciva Differential Revision: https://reviews.freebsd.org/D32249
-rw-r--r--stand/common/bcache.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/stand/common/bcache.c b/stand/common/bcache.c
index 0eeb7e74ee96..b3b8b22c7d21 100644
--- a/stand/common/bcache.c
+++ b/stand/common/bcache.c
@@ -238,17 +238,27 @@ read_strategy(void *devdata, int rw, daddr_t blk, size_t size,
if (BCACHE_LOOKUP(bc, (daddr_t)(blk + i))) {
bcache_misses += (nblk - i);
complete = 0;
- if (nblk - i > BCACHE_MINREADAHEAD && bc->ra > BCACHE_MINREADAHEAD)
- bc->ra >>= 1; /* reduce read ahead */
break;
} else {
bcache_hits++;
}
}
- if (complete) { /* whole set was in cache, return it */
+ /*
+ * Adjust read-ahead size if appropriate. Subject to the requirement
+ * that bc->ra must stay in between MINREADAHEAD and READAHEAD, we
+ * increase it when we notice that readahead was useful and decrease
+ * it when we notice that readahead was not useful.
+ */
+ if (complete) {
if (bc->ra < BCACHE_READAHEAD)
- bc->ra <<= 1; /* increase read ahead */
+ bc->ra <<= 1; /* increase read ahead */
+ } else {
+ if (nblk - i > BCACHE_MINREADAHEAD && bc->ra > BCACHE_MINREADAHEAD)
+ bc->ra >>= 1; /* reduce read ahead */
+ }
+
+ if (complete) { /* whole set was in cache, return it */
bcopy(bc->bcache_data + (bcache_blksize * BHASH(bc, blk)), buf, size);
goto done;
}