kstat2_intr - structure for v2 interrupt kstats
#include <sys/types.h> #include <sys/kstat2.h> #include <sys/ddi.h> #include <sys/sunddi.h>
Solaris DDI specific (Solaris DDI)
v2 interrupt kstat statistics are held in a kstat2_intr structure which can be used synonymously as an array containing a single v2 kstat name-value pair. When kstat2_create_with_template(9F) function creates an interrupt kstat, the ks2_data field is a pointer to one of these structures and can be accessed using the macro KSTAT2_INTR_PTR() which is defined as follows:
#define KSTAT2_INTR_PTR(kptr) \ ((kstat2_intr_t *)(kptr->ks2_data))
kstat2_named_t intrs;
The type of the intrs field is an array of 64-bit integers which are accessed through intrs.value.integers.array. This access is simplified using the macro: KSTAT2_NV_INTS(intrs). intrs.value.integers.array must point directly to an array in driver memory. The contents of the array are copied out under the kstat's lock when read.
#include <sys/kstat2.h>
...
const char *pseg =
{ "category", "module", "name", "instance };
static uint64_t my_intrs[KSTAT_NUM_INTRS];
static kstat2_named_t *ks_data;
kstat2_template_t *t = kstat2_lookup_template(KSTAT2_MT_IO);
kstat2_t *ksp = kstat2_create_with_template(pseg, 4,
ALL_ZONES, t, 0, NULL,
"My driver IO", KSTAT2_MF_STABLE);
if (ksp != NULL) {
/*
* Set local array as the value on the kstat data.
*/
ks_data = KSTAT2_INTR_PTR(ksp)->intrs;
kstat2_nv_setints(ks_data, my_intrs, KSTAT_NUM_INTRS);
kstat2_install(ksp);
}
...
/*
* Increment an interrupt value.
* This can be done by explicit reference to the array
* in the kstat data:
* ks_data->value.integers.array[KSTAT_INTR_HARD]++;
* or by using the supplied macro to reference the array:
* KSTAT2_NV_INTS(ks_data)[KSTAT_INTR_HARD]++;
* or simply by using the local reference to the array:
*/
my_intrs[KSTAT_INTR_HARD]++;
kstat2_create(9F), kstat2_create_with_template(9F), kstat2(9S)