VAX750 interrupt metering bug fix
utzoo!decvax!harpo!floyd!cmcl2!lanl-a!unm-ivax!nmtvax!mike
utzoo!decvax!harpo!floyd!cmcl2!lanl-a!unm-ivax!nmtvax!mike
Fri Mar 11 10:39:26 AEST 1983
Due to a great deal of interest in this fix, here it is.
Mike Hibler
ucbvax!unmvax!nmtvax!mike
mike.nmt at rand-relay
------------------------------------------------------------------------
DESCRIPTION:
This is not really a bug in 'config', but the fix goes here.
The problem is that UNIBUS device interrupt "metering"
(counting the # of interrupts for 'vmstat') is not done on
VAX750s and VAX730s (VAXZZs). On 780s, the UBA interrupts
instead of the individual devices. Because of this, the
interrupts are counted in the common UBA interrupt handling
routine (in 'locore.s'). This code is not even defined on
non-780s and, as a result, the only interrupts which are
counted are: the clock, the console, and Massbus devices.
TO REPRODUCE:
Run 'vmstat 5' on a 750 system with no Massbus devices and
the console idle. Notice that the "in" field (device interrupts
per second) is -1. This is because we are only getting the
59 clock interrupts per second (we are in the 60th when the
data are averaged) and nothing else. 'vmstat' subtracts off
the clock interrupts, and hence, we are left with -1.
FIX:
In all the interrupt "preambles" (assembler interrupt handlers)
defined in 'ubglue.s' we must include an increment of the
proper field of the "metering" structure 'cnt'. The fix is
to add:
#if defined(VAX750) || defined(VAXZZ)
incl _cnt+V_INTR
#endif
just before the 'rei' instruction in each routine. Since this
file is generated by 'config', the proper place to fix the
problem is there, and not in 'ubglue.s'.
The file we change is 'mkubglue.c'. In diff format the changes
look like:
77c77,85
< fprintf(fp, "\tcalls\t$1,_%s\n\tpopr\t$0x3f\n\trei\n\n", vector);
---
> fprintf(fp, "\tcalls\t$1,_%s\n\tpopr\t$0x3f\n", vector);
> /*
> * Make sure we put out code to properly handle metering of
> * UNIBUS device interrupts on VAX 730s and 750s.
> */
> fprintf(fp, "#if defined(VAX750) || defined(VAXZZ)\n");
> fprintf(fp, "\tincl\t_cnt+V_INTR\n");
> fprintf(fp, "#endif\n");
> fprintf(fp, "\trei\n\n");
------------------------------------------------------------------------
More information about the Comp.bugs.4bsd.ucb-fixes
mailing list