getting 'load average' info from inside a kernel module
Robert Bonomi <bonomi <at> mail.r-bonomi.com>
2014-12-17 20:06:26 GMT
originally sent to -questions, where it was suggested that -hackers was more
likely to produce some useful info.
> Subject: getting 'load averages' (or something similar) from inside a _kernel_
> I'm trying to get the current 'runnable processes' count from inside a
> kernel loadable module for BSD 8.4, so I can tweak it's behavior depending
> on the current activity level. All I've found so far is what's in 'man 9
> runqueue', and it is *badly* out-of-sync with the 8.4 kernel code. <snarl>
> <wry grin> e.g., the external arrays at the beginning of the synopisis
> are shown as being of type 'struct rq' -- but there *ISN"T* any defined
> struct 'rq'; it seems to be named 'runq', at least in /usr/include/sys/runq.h
> Then the cr*p gets deeper -- trying to make heads or tails out of how to
> get a count of runnable processes from the _arrays_ (of unknown size)
> described on the 'man 9 runqueue' page info has me defeated.
> Looking at '/usr/include/sys/runq.h', it appears that 'struct runq' is
> a single item with an array of queues (by 'nice' level), and a bitmap of
> which array elements have non-zero length queues.
> I'm perfectly willing to brute-force the data out of the queue lists, *IF*
> there's some reasonable, _current_, descriptive info of the format/usage
> of those kernel structures.
if 'man 9 runqueue' is 'mostly' correct -- reality just being 'runq' instead
of 'rq' -- then 'how to find out' how mamy elements are in those 'unknown size'
arrays is the missing element. *OR* if those four items are _not_ arrays,
but simple structs -- given the array of queueheads in the 'runq' struct,
I can probably decipher the rest.