svn commit: r323393 - in head/sys: sys vm

Bruce Evans brde at optusnet.com.au
Mon Sep 11 10:24:06 UTC 2017


On Mon, 11 Sep 2017, Mateusz Guzik wrote:

> On Mon, Sep 11, 2017 at 10:24 AM, Ryan Libby <rlibby at freebsd.org> wrote:
>
>> On Mon, Sep 11, 2017 at 12:30 AM, Mateusz Guzik <mjguzik at gmail.com> wrote:
>> [...]
>>> That said, looking now at the struct I think its use should be retired
>>> from the kernel. It can remain in headers for userspace use.

More about this in another reply.

>>> First, there is a bunch of counter(9) fields. I don't know the original
>>> reasoning. I would expect these counters to be statically defined in a
>>> per-cpu struct.

Changing them to 64 bits was even larger ABI breakage (they could have been
replaced by padding so that they read as 0's but don't break all following
fields).

>> The actual counter(9) counters are per-CPU.  These are just offsets into
>> the PCPU area.  See r317061 / D10156 (recent work by glebius).
>
> I mean their ids are allocated on boot, even though these counters are
> always present and could be resolved at compilation time. So in order
> to update them you have to fetch the id, as opposed to having the code
> just do the right thing.
>
> I.e. for stuff which is always there we should just have well known offsets
> into per-cpu tables. But I'm not going to try to flame a patch in (or write
> one).

vmstat(1) has the necessary support to read the counters from dead kernels.

systat(1) is simpler because it doesn't support dead kernels.  It just
uses the horrible GETSYSCTL() macro/implementation.  vmstat uses the
horrible GET_VM_STATS() macro/implementation instead.  The horribleness
of these includes different bad error handling.  vmstat aborts if a sysctl
no longer exists or has changed it size.  This gives much the same breakage
as an ABI change.  systat only spams the window with an error message.  This
is relatively harmless.  Sometimes the error message even remains visible
so it explains why some fields are displayed as always 0.  The change of
the size for the counters was eventually fixed in both vmstat and systat
by changing the kernel to use the application's size in some cases.

I don't care about dead kernels.  Thus, moving the fields doesn't break
anything for me.  It "only" takes about 10000 instructions per field read
to handle the move automatically using sysctl().

Bruce


More information about the svn-src-all mailing list