Interrupt Descriptions

Bruce Evans brde at optusnet.com.au
Thu Oct 1 00:03:01 UTC 2009


On Wed, 30 Sep 2009, John Baldwin wrote:

> A few folks have asked recently for the ability to add descriptive strings to
> registered interrupt handlers.  This is especially true since the advent of
> MSI with multiple interrupts per device.  I hacked up a prototype today that

Interrupt names should be no longer than 4 (5 works sometimes) characters so
that they can be displayed by systat -v.

>...
>> vmstat -i
> interrupt                          total       rate
> irq1: atkbd0                           8          0

The 4-5 characters doesn't include "irqN".  (systat -v already does extra
work to avoid the bad naming scheme visible here.  It moves the "irqN" to
the end, and removes the ":", else truncating these names would give a
larger mess and there would only be space for 3-4 characters of the device
name after wasting 1 for the ":".)

"atkbd0" is already far too long, so systat -v would display "atkbd0 irq"
in the 10 columns available, except it omits "irq" in this case so
as to print the interrupt number, and actually displays "atkbd0 1".

> irq4: uart0                          751          5
> irq6: fdc0                             6          0
> irq14: ata0                           36          0
> irq20: uhci0                          20          0

These are short enough to be displayed by systat -v (after removal of the
":" in 2 cases and after removal of the ":" and the "irq" in 1 case).

> irq23: uhci3 ehci0                     2          0

systat -v has no chance of displaying multiple devices per interrupt.  I
think it finds no space to print even the irq number, and also loses
the ehci number after truncating at "uhci3 ehci".

> irq28: mpt0                         1661         11

Short enough.

> irq256: igb0:tx 0                    880          6

I think this gets truncated to "igb0:tx 0 ".  The device name doesn't
follows the rules for naming devices (should contain no whitespace), so
the final "0" looks like the interrupt number.

Interrupt numbers > 99 cause further problems for systat.  Now there
is only space for 3 characters in the device name ("xx0 irq256" takes
10 columns).

> irq257: igb0:rx 0                   1098          7
> irq258: igb0:link                      3          0
> irq259: igb1:tx 0                      1          0
> irq260: igb1:rx 0                    134          0
> irq261: igb1:link                      3          0

Similar messes.

systat has no support for varying the terminal width, and adding such
support would be difficult because the display is very complicated and
hard-coded, so the truncation occurs even if you have a wide terminal.
Adding support for the English parser needed to translate more cases would
be even more difficult.  The "irqN:" translation is MD (probably only
helps for amd64 and i386).

The above output shows related misformatting for vmstat.  Interrupt
name strings are supposed to be NUL-terminated and packed into a string
space, mainly to match the historical interface to vmstat, which was
designed mainly for space-efficiency.  I think they are still in a
string space, but at least on amd64 and i386 the implementation is
extremely space-inefficient, with many unused entries and every entry
padded with spaces to length MAXCOMLEN bytes (plus the NUL terminator).
MAXCOMLEN is 19, and most of the 19 are used for the verbose names in
the above.  Then vmstat leaves about 15 more spaces before the totals
column (it uses format "%-*s %20llu..."), giving the above ugly output.
The "*" in the format is supposed to be dynamic, but this is defeated
by the space-padding.  Leaving space for 20-digit numbers is bogus:
the 20 is a hard coding of the number of digits needed to display the
largest 64-bit long long, but long longs might be longer than that,
and the maximum is unreachable even with 64-bit long longs.

OTOH, MAXCOMLEN is a bit short for a description.

Bruce


More information about the freebsd-arch mailing list