Subject: RFC: /kern/summary
To: None <tech-kern@netbsd.org>
From: Brian C. Grayson <bgrayson@orac.ece.utexas.edu>
List: tech-kern
Date: 03/09/1999 14:18:21
  I got no negative responses to my query regarding /kern files,
so I plan on adding a new file to /kern.  I've got some ideas,
but before I do too much work, I'd appreciate any helpful
opinions or suggestions.  I'm new to kernel stuff, so if I've
said something blatantly wrong here, please let me know.
Here's what I've thought up so far:

  /kern/summary (any better name ideas?)

  Purpose:  Provide numerous system statistics in a single file,
    allowing programs like top, systat, and xosview to grab an
    atomic snapshot of the state.  Hopefully, this will help
    reduce the number of recompiles of these programs when struct
    proc changes slightly.

  Format:  ASCII, and human-parseable without a man page.  In
    particular, each line will contain a single string like:

    MemTotalBytes=67108864
    MemFreeBytes=1048576

    with no whitespace around the '='.  This will allow one to
    write sh scripts like:

    source /kern/summary
    printf "%.2f%% of memory is free\n" \
      `echo $MemFreeBytes / $MemTotalBytes \* 100 | bc -l`

    C programs (top, systat, xosview) will need to parse these
    ``assignments.''  A function similar to a hashed getenv() may be
    provided to abstract this functionality away.  If desired, a
    raw version of this file could also be provided, with the
    possible lack of backwards compatibility whenever the format
    changes.

  Goals:
    1.  The file should be meaningful without requiring a man
      page or other reference.  As an example of what I _don't_
      want to create, cat /proc/1/status, and tell me how many CPU
      seconds init has accumulated -- without peaking at the man
      page for mount_procfs and without using your finger to
      locate the nth number on the line.  :)

    2.  When possible, the kernel will provide values in bytes
      (unlike swapctl or vmmeter, which do blocks or pages, which
      then requires gunk to portably figure out the block->byte
      translation).

    3.  The first five lines of this and any similarly-designed
      file will always provide the following variables (better
      variable name suggestions will be gladly accepted!):

      InfoMaxBytes:  an upper limit on the number of bytes
	contained in this file (valid until a new kernel is
	recompiled, that is, this will be conservative, and not
	just a strlen of the _current_ file contents).  This
	allows one to do a read() of this amount, and hopefully
	grab an atomic snapshot in a single syscall, rather
	than reading the first 1024 bytes of the file, then
	later reading the second 1024 bytes, leading to bogus
	values at the buffer boundary due to the change in stats
	between the two calls.
      MajorVersionNumber:  this format version number will only
	be changed when a variable is deleted from the file, or the
	interface changes in a substantial way.
      MinorVersionNumber:  whenever a new variable is added
	(preferrably to the end of the file, but not guaranteed),
	the minor version is bumped.  This allows a high degree
	of backward compatibility, and early detection in the
	case that things aren't going to work (i.e. newer program
	requires a variable that an older kernel doesn't export).
      SnapTimeSecs and SnapTimeNanoSecs:  the time at which the
	kernel started to compile this information.

  My immediate goal is to get an experimental version of this
in the kernel (hopefully for 1.4) such that xosview can grab
all of its data through /kern/summary.  Longer-term goals
include adding a similar verbosely-formatted file to the /proc
file system so that ps and top can reconstruct all the
important information in a kinfo_proc from a single file
(currently, /proc does not provide enough information for full
ps functionality).  I have no idea on the timescale here.  If
things go swell and I have the free time, it could take only a
weekend.

  At the end, we should have a ps, top, and xosview that, as an
option, use only /proc and /kern, and thus no longer need
recompilation very often at all.

  If you strongly believe that this is a Really Really Bad Idea,
please speak now, or forever hold your peace.  :)

  Happy hacking!
  Brian Grayson