Creating SDT Probes
If you are a device driver developer, you might be interested in
creating your own SDT probes in your Solaris driver. The disabled probe
effect of SDT is essentially the cost of several no-operation machine instructions.
You are therefore encouraged to add SDT probes to your device drivers
as needed. Unless these probes negatively affect performance, you can leave them
in your shipping code.
Declaring Probes
SDT probes are declared using the DTRACE_PROBE, DTRACE_PROBE1, DTRACE_PROBE2, DTRACE_PROBE3 and DTRACE_PROBE4
macros from <sys/sdt.h>. The module name and function name of an SDT-based
probe corresponds to the kernel module and function of the probe. The
name of the probe depends on the name given in the DTRACE_PROBEn
macro. If the name contains no two consecutive underbars (__), the name
of the probe is as written in the macro. If the name
contains any two consecutive underbars, the probe name converts the consecutive underbars
to a single dash (-). For example, if a DTRACE_PROBE macro specifies
transaction__start, the SDT probe will be named transaction-start. This substitution allows C
code to provide macro names that are not valid C identifiers without
specifying a string.
DTrace includes the kernel module name and function name as part of
the tuple identifying a probe, so you do not need to include
this information in the probe name to prevent name space collisions. You
can use the command dtrace -l -P sdt -m module on your driver module to list the
probes you have installed and the full names that will be seen
by users of DTrace.
Probe Arguments
The arguments for each SDT probe are the arguments specified in the
corresponding DTRACE_PROBEn macro reference. The number of arguments depends on which macro
was used to create the probe: DTRACE_PROBE1 specifies one argument, DTRACE_PROBE2 specifies
two arguments, and so on. When declaring your SDT probes, you can
minimize their disabled probe effect by not dereferencing pointers and not loading
from global variables in the probe arguments. Both pointer dereferencing and global
variable loading may be done safely in D actions that enable probes,
so DTrace users can request these actions only when they are needed.