counter
is a generic facility to create counters
that can be utilized for any purpose (such as collecting statistical
data).
A
counter
is guaranteed to be lossless when several kernel threads do simultaneous
updates.
However,
counter
does not block the calling thread,
also no
atomic(9)
operations are used for the update, therefore the counters
can be used in any non-interrupt context.
Moreover,
counter
has special optimisations for SMP environments, making
counter
update faster than simple arithmetic on the global variable.
Thus
counter
is considered suitable for accounting in the performance-critical
code paths.
counter_u64_alloc(wait)
|
|
Allocate a new 64-bit unsigned counter.
The
wait
argument is the
malloc(9)
wait flag, should be either
M_NOWAIT
or
M_WAITOK.
If
M_NOWAIT
is specified the operation may fail and return
NULL.
|
counter_u64_free(c)
|
|
Free the previously allocated counter
c.
It is safe to pass
NULL.
|
counter_u64_add(c, v)
|
|
Add
v
to
c.
The KPI does not guarantee any protection from wraparound.
|
counter_enter()
|
|
Enter mode that would allow the safe update of several counters via
counter_u64_add_protected().
On some machines this expands to
critical(9)
section, while on other is a nop.
See
IMPLEMENTATION DETAILS.
|
counter_exit()
|
|
Exit mode for updating several counters.
|
counter_u64_add_protected(c, v)
|
|
Same as
counter_u64_add(),
but should be preceded by
counter_enter().
|
counter_u64_fetch(c)
|
|
Take a snapshot of counter
c.
The data obtained is not guaranteed to reflect the real cumulative
value for any moment.
|
counter_u64_zero(c)
|
|
Clear the counter
c
and set it to zero.
|
counter_ratecheck(cr, limit)
|
|
The function is a multiprocessor-friendly version of
ppsratecheck()
which uses
counter
internally.
Returns non-negative value if the rate is not yet reached during the current
second, and a negative value otherwise.
If the limit was reached on previous second, but was just reset back to zero,
then
counter_ratecheck()
returns number of events since previous reset.
|
COUNTER_U64_SYSINIT(c)
|
|
Define a
SYSINIT(9)
initializer for the global counter
c.
|
COUNTER_U64_DEFINE_EARLY(c)
|
|
Define and initialize a global counter
c.
It is always safe to increment
c,
though updates prior to the
SI_SUB_COUNTER
SYSINIT(9)
event are lost.
|
SYSCTL_COUNTER_U64(parent, nbr, name, access, ptr, descr)
|
|
Declare a static
sysctl(9)
oid that would represent a
counter.
The
ptr
argument should be a pointer to allocated
counter_u64_t.
A read of the oid returns value obtained through
counter_u64_fetch().
Any write to the oid zeroes it.
|
SYSCTL_ADD_COUNTER_U64(ctx, parent, nbr, name, access, ptr, descr)
|
|
Create a
sysctl(9)
oid that would represent a
counter.
The
ptr
argument should be a pointer to allocated
counter_u64_t.
A read of the oid returns value obtained through
counter_u64_fetch().
Any write to the oid zeroes it.
|
SYSCTL_COUNTER_U64_ARRAY(parent, nbr, name, access, ptr, len, descr)
|
|
Declare a static
sysctl(9)
oid that would represent an array of
counter.
The
ptr
argument should be a pointer to allocated array of
counter_u64_t's.
The
len
argument should specify number of elements in the array.
A read of the oid returns len-sized array of
uint64_t
values obtained through
counter_u64_fetch().
Any write to the oid zeroes all array elements.
|
SYSCTL_ADD_COUNTER_U64_ARRAY(ctx, parent, nbr, name, access, ptr, len, descr)
|
|
Create a
sysctl(9)
oid that would represent an array of
counter.
The
ptr
argument should be a pointer to allocated array of
counter_u64_t's.
The
len
argument should specify number of elements in the array.
A read of the oid returns len-sized array of
uint64_t
values obtained through
counter_u64_fetch().
Any write to the oid zeroes all array elements.
|