1
0
mirror of https://git.FreeBSD.org/src.git synced 2024-12-12 09:58:36 +00:00
freebsd/sys/conf
Mark Johnston ddf0ed09bd sdt: Implement SDT probes using hot-patching
The idea here is to avoid a memory access and conditional branch per
probe site.  Instead, the probe is represented by an "unreachable"
unconditional function call.  asm goto is used to store the address of
the probe site (represented by a no-op sled) and the address of the
function call into a tracepoint record.  Each SDT probe carries a list
of tracepoints.

When the probe is enabled, the no-op sled corresponding to each
tracepoint is overwritten with a jmp to the corresponding label.  The
implementation uses smp_rendezvous() to park all other CPUs while the
instruction is being overwritten, as this can't be done atomically in
general.  The compiler moves argument marshalling code and the
sdt_probe() function call out-of-line, i.e., to the end of the function.

Per gallatin@ in D43504, this approach has less overhead when probes are
disabled.  To make the implementation a bit simpler, I removed support
for probes with 7 arguments; nothing makes use of this except a
regression test case.  It could be re-added later if need be.

The approach taken in this patch enables some more improvements:
1. We can now automatically fill out the "function" field of SDT probe
   names.  The SDT macros let the programmer specify the function and
   module names, but this is really a bug and shouldn't have been
   allowed.  The intent was to be able to have the same probe in
   multiple functions and to let the user restrict which probes actually
   get enabled by specifying a function name or glob.
2. We can avoid branching on SDT_PROBES_ENABLED() by adding the ability
   to include blocks of code in the out-of-line path.  For example:

	if (SDT_PROBES_ENABLED()) {
		int reason = CLD_EXITED;

		if (WCOREDUMP(signo))
			reason = CLD_DUMPED;
		else if (WIFSIGNALED(signo))
			reason = CLD_KILLED;
		SDT_PROBE1(proc, , , exit, reason);
	}

could be written

	SDT_PROBE1_EXT(proc, , , exit, reason,
		int reason;

		reason = CLD_EXITED;
		if (WCOREDUMP(signo))
			reason = CLD_DUMPED;
		else if (WIFSIGNALED(signo))
			reason = CLD_KILLED;
	);

In the future I would like to use this mechanism more generally, e.g.,
to remove branches and marshalling code used by hwpmc, and generally to
make it easier to add new tracepoint consumers without having to add
more conditional branches to hot code paths.

Reviewed by:	Domagoj Stolfa, avg
MFC after:	2 months
Differential Revision:	https://reviews.freebsd.org/D44483
2024-06-19 16:57:41 -04:00
..
config.mk Revert "config.mk: Add MK_VIMAGE knob" 2024-04-25 22:43:36 +01:00
dtb.build.mk
dtb.mk
files Add an implementation of the 9P filesystem 2024-06-19 13:12:04 +01:00
files.amd64 Hyper-V: TLB flush enlightment using hypercall 2024-06-07 07:56:07 +00:00
files.arm sdt: Implement SDT probes using hot-patching 2024-06-19 16:57:41 -04:00
files.arm64 sdt: Implement SDT probes using hot-patching 2024-06-19 16:57:41 -04:00
files.i386 files.x86: Pull in some more duplicate lines from files.{amd64,i386} 2024-04-12 14:35:45 -07:00
files.powerpc sdt: Implement SDT probes using hot-patching 2024-06-19 16:57:41 -04:00
files.riscv sdt: Implement SDT probes using hot-patching 2024-06-19 16:57:41 -04:00
files.x86 sdt: Implement SDT probes using hot-patching 2024-06-19 16:57:41 -04:00
kern.mk arm64: Disable outling atomics 2024-06-05 09:23:40 +00:00
kern.opts.mk Revert "config.mk: Add MK_VIMAGE knob" 2024-04-25 22:43:36 +01:00
kern.post.mk sanitizers: Avoid building genassym.c and genoffset.c with sanitizers 2024-01-12 16:09:14 -05:00
kern.pre.mk Fix bnxt build in LINT 2024-05-29 09:49:53 -06:00
kmod_syms_prefix.awk
kmod_syms.awk
kmod.mk kmod.mk use ${XARGS} 2024-05-10 12:05:05 -07:00
kmod.opts.mk
ldscript.amd64 kernel: Sync ldscript files wrt gnu.attributes and .note.GNU-stack 2024-02-29 09:30:37 -07:00
ldscript.arm kernel: Sync ldscript files wrt gnu.attributes and .note.GNU-stack 2024-02-29 09:30:37 -07:00
ldscript.arm64 kernel: Sync ldscript files wrt gnu.attributes and .note.GNU-stack 2024-02-29 09:30:37 -07:00
ldscript.i386 kernel: Sync ldscript files wrt gnu.attributes and .note.GNU-stack 2024-02-29 09:30:37 -07:00
ldscript.kmod.amd64
ldscript.kmod.i386
ldscript.powerpc kernel: Sync ldscript files wrt gnu.attributes and .note.GNU-stack 2024-02-29 09:30:37 -07:00
ldscript.powerpc64 kernel: Sync ldscript files wrt gnu.attributes and .note.GNU-stack 2024-02-29 09:30:37 -07:00
ldscript.powerpc64le kernel: Sync ldscript files wrt gnu.attributes and .note.GNU-stack 2024-02-29 09:30:37 -07:00
ldscript.powerpcspe kernel: Sync ldscript files wrt gnu.attributes and .note.GNU-stack 2024-02-29 09:30:37 -07:00
ldscript.riscv kernel: Sync ldscript files wrt gnu.attributes and .note.GNU-stack 2024-02-29 09:30:37 -07:00
Makefile.amd64 sys: Remove ancient SCCS tags. 2023-11-26 22:23:30 -07:00
Makefile.arm sys: Remove ancient SCCS tags. 2023-11-26 22:23:30 -07:00
Makefile.arm64 sys: Build arm64 per-thread SSP with GCC 2024-05-22 08:20:01 +00:00
Makefile.i386 sys: Remove ancient SCCS tags. 2023-11-26 22:23:30 -07:00
Makefile.powerpc sys: Remove ancient SCCS tags. 2023-11-26 22:23:30 -07:00
Makefile.riscv sys: Remove ancient SCCS tags. 2023-11-26 22:23:30 -07:00
newvers.sh sys: Remove ancient SCCS tags. 2023-11-26 22:23:30 -07:00
NOTES snd_hdsp(4): RME HDSP 9632 and HDSP 9652 sound card driver. 2024-05-09 19:36:40 +01:00
options Add an implementation of the 9P filesystem 2024-06-19 13:12:04 +01:00
options.amd64
options.arm
options.arm64 Import the kernel parts of bhyve/arm64 2024-02-21 18:55:32 +00:00
options.i386 i386: Use DEV_HYPERV to enable HyperV APIC vector 2024-04-13 19:10:44 -07:00
options.powerpc
options.riscv
std.debug sys: add conf/std.debug, generic debugging options 2024-04-23 15:13:31 -06:00
std.nodebug
sysent.mk
systags.sh sys: Remove ancient SCCS tags. 2023-11-26 22:23:30 -07:00
vdso_amd64_ia32.ldscript
vdso_amd64.ldscript
WITHOUT_SOURCELESS
WITHOUT_SOURCELESS_HOST
WITHOUT_SOURCELESS_UCODE