disc cache readahead count not being incremented
Steven M. Schultz
sms at wlv.imsd.contel.com
Mon Jul 1 02:47:56 AEST 1991
Subject: disc cache readahead count not being incremented
Index: sys/ufs_bio.c 2.11BSD
Description:
If the readahead block is currently in the buffer cache then
the statistic 'BHITRA' is not incremented.
Repeat-By:
Install and run the 'trace' program included below. Observe that
the 'bhitra' count remains 0 even though the readahead logic
is operating correctly.
Fix:
Apply the patch to ufs_bio.c and remake the kernel. The 'trace'
program must be setgid to kmem (the patch to /usr/src/local/Makefile
will take care of this if a "make install" is done.
#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create:
# /tmp/c
# /usr/src/local/trace.c
# This archive created: Sun Jun 30 12:37:45 1991
export PATH; PATH=/bin:/usr/bin:$PATH
if test -f '/tmp/c'
then
echo shar: "will not over-write existing file '/tmp/c'"
else
sed 's/^X//' << \SHAR_EOF > '/tmp/c'
X*** /sys/sys/ufs_bio.c.old Mon May 27 02:31:28 1991
X--- /sys/sys/ufs_bio.c Sat Jun 29 17:04:36 1991
X***************
X*** 81,100 ****
X * If there's a read-ahead block, start i/o
X * on it also (as above).
X */
X! if (rablkno && !incore(dev, rablkno)) {
X! rabp = getblk(dev, rablkno);
X! if (rabp->b_flags & (B_DONE|B_DELWRI)) {
X! brelse(rabp);
X! trace(TR_BREADHITRA);
X! } else {
X! rabp->b_flags |= B_READ|B_ASYNC;
X! rabp->b_bcount = DEV_BSIZE; /* XXX? KB */
X! (*bdevsw[major(dev)].d_strategy)(rabp);
X! trace(TR_BREADMISSRA);
X #ifdef UCB_RUSAGE
X! u.u_ru.ru_inblock++; /* pay in advance */
X #endif
X! }
X }
X
X /*
X--- 81,103 ----
X * If there's a read-ahead block, start i/o
X * on it also (as above).
X */
X! if (rablkno) {
X! if (!incore(dev, rablkno)) {
X! rabp = getblk(dev, rablkno);
X! if (rabp->b_flags & (B_DONE|B_DELWRI)) {
X! brelse(rabp);
X! trace(TR_BREADHITRA);
X! } else {
X! rabp->b_flags |= B_READ|B_ASYNC;
X! rabp->b_bcount = DEV_BSIZE; /* XXX? KB */
X! (*bdevsw[major(dev)].d_strategy)(rabp);
X! trace(TR_BREADMISSRA);
X #ifdef UCB_RUSAGE
X! u.u_ru.ru_inblock++; /* pay in advance */
X #endif
X! }
X! } else
X! trace(TR_BREADHITRA);
X }
X
X /*
X*** /usr/src/local/Makefile.old Mon Jul 2 15:18:52 1990
X--- /usr/src/local/Makefile Sun Jun 30 12:09:42 1991
X***************
X*** 10,16 ****
X # C programs that live in the current directory and do not need
X # explicit make lines.
X #
X! STD= none
X
X # C programs that live in the current directory and need explicit make lines.
X #
X--- 10,16 ----
X # C programs that live in the current directory and do not need
X # explicit make lines.
X #
X! STD= trace
X
X # C programs that live in the current directory and need explicit make lines.
X #
X***************
X*** 32,42 ****
X
X # Files listed in ${NSTD} have explicit make lines given below.
X
X! install:
X -for i in ${SUBDIR}; do \
X (cd $$i; make ${MFLAGS} DESTDIR=${DESTDIR} install); done
X -for i in ${STD} ${NSTD}; do \
X (install $$i ${DESTDIR}/usr/local/$$i); done
X -for i in ${SHELL}; do \
X (install -c -m 755 $$i.sh ${DESTDIR}/usr/local/$$i); done
X
X--- 32,44 ----
X
X # Files listed in ${NSTD} have explicit make lines given below.
X
X! install: ${SUBDIR} ${STD} ${NSTD}
X -for i in ${SUBDIR}; do \
X (cd $$i; make ${MFLAGS} DESTDIR=${DESTDIR} install); done
X -for i in ${STD} ${NSTD}; do \
X (install $$i ${DESTDIR}/usr/local/$$i); done
X+ -chmod 2755 ${DESTDIR}/usr/local/trace
X+ -chgrp kmem ${DESTDIR}/usr/local/trace
X -for i in ${SHELL}; do \
X (install -c -m 755 $$i.sh ${DESTDIR}/usr/local/$$i); done
X
SHAR_EOF
fi
if test -f '/usr/src/local/trace.c'
then
echo shar: "will not over-write existing file '/usr/src/local/trace.c'"
else
sed 's/^X//' << \SHAR_EOF > '/usr/src/local/trace.c'
X#include <stdio.h>
X#include <nlist.h>
X#include <signal.h>
X#include <sys/trace.h>
X
Xstruct nlist nl[] =
X {
X { "_tracebuf" },
X { "" },
X };
X
X int mf, hdr(), lines = 1;
X
Xmain(argc, argv)
X int argc;
X char **argv;
X {
X register i;
X int iter;
X
X nlist("/vmunix", nl);
X if (nl[0].n_type == 0)
X {
X fprintf(stderr, "no /vmunix namelist\n");
X exit(1);
X }
X mf = open("/dev/kmem", 0);
X if (mf < 0)
X {
X fprintf(stderr, "cannot open /dev/kmem\n");
X exit(1);
X }
X iter = 0;
X argc--, argv++;
X if (argc > 1)
X iter = atoi(argv[1]);
X signal(SIGCONT, hdr);
Xloop:
X if (--lines == 0)
X hdr();
X nmstats();
X fflush(stdout);
X if (--iter &&argc > 0)
X {
X sleep(atoi(argv[0]));
X goto loop;
X }
X }
X
Xhdr()
X {
X
X puts("bhit bmiss bwrite bhitra bmissra brelse %bhit");
X lines = 19;
X }
X
Xnmstats()
X {
X float pct;
X long tracebuf[TR_NUM_210];
X
X lseek(mf, (long)nl[0].n_value, 0);
X read(mf, tracebuf, sizeof tracebuf);
X pct = tracebuf[TR_BREADHIT];
X pct /= (tracebuf[TR_BREADHIT] + tracebuf[TR_BREADMISS]);
X pct *= 100.0;
X printf("%-9D %-9D %-9D %-9D %-9D %-9D %.2f\n",
X tracebuf[TR_BREADHIT],
X tracebuf[TR_BREADMISS],
X tracebuf[TR_BWRITE],
X tracebuf[TR_BREADHITRA],
X tracebuf[TR_BREADMISSRA],
X tracebuf[TR_BRELSE],
X pct);
X }
SHAR_EOF
fi
exit 0
# End of shell archive
More information about the Comp.bugs.2bsd
mailing list