[DTrace-devel] [PATCH v3] dtrace provider: add a predicate against the current tgid

Kris Van Hees kris.van.hees at oracle.com
Thu Feb 29 18:17:04 UTC 2024


On Thu, Feb 29, 2024 at 05:42:30PM +0000, Nick Alcock via DTrace-devel wrote:
> If we don't put a predicate on, BEGIN/END probes fire in every running
> dtrace at the same time, messing up the activity state of all but the one it
> was meant to fire in and often causing the others to fail to exit on exit()
> (they hang until ended by some other means, like an interrupt or -c
> termination).
> 
> Thankfully the -xcpu run-BEGIN/END-in-a-thread complexities can be ignored
> because we can match on DTrace's tgid instead of its PID (thread ID),
> which will always catch exactly our BEGIN/END firings and no-one else's.
> 
> (In theory this might cause trouble if you run multiple consumers in
> different threads in the same process, but that's not going to work as it
> is, and has never been considered a sane thing to do.)
> 
> Signed-off-by: Nick Alcock <nick.alcock at oracle.com>

Reviewed-by: Kris Van Hees <kris.van.hees at oracle.com>

> ---
>  libdtrace/dt_prov_dtrace.c | 19 +++++++++++++++++--
>  1 file changed, 17 insertions(+), 2 deletions(-)
> 
> diff --git a/libdtrace/dt_prov_dtrace.c b/libdtrace/dt_prov_dtrace.c
> index 307ad558874f3..3e6ae88a37848 100644
> --- a/libdtrace/dt_prov_dtrace.c
> +++ b/libdtrace/dt_prov_dtrace.c
> @@ -93,7 +93,8 @@ static int trampoline(dt_pcb_t *pcb, uint_t exitlbl)
>  	}
>  
>  	/*
> -	 * The BEGIN probe should only run when the activity state is INACTIVE.
> +	 * The BEGIN probe should only run when the activity state is INACTIVE,
> +	 * for this process's PID (TGID).
>  	 * At the end of the trampoline (after executing any clauses), the
>  	 * state must be advanced to the next state (INACTIVE -> ACTIVE, or if
>  	 * there was an exit() action in the clause, DRAINING -> STOPPED).
> @@ -102,7 +103,8 @@ static int trampoline(dt_pcb_t *pcb, uint_t exitlbl)
>  	 * on in state[DT_STATE_BEGANON] to ensure that we know which trace
>  	 * data buffer to process first.
>  	 *
> -	 * The END probe should only run when the activity state is DRAINING.
> +	 * The END probe should only run when the activity state is DRAINING,
> +	 * for this process's PID (TGID).
>  	 * At the end of the trampoline (after executing any clauses), the
>  	 * state must be advanced to the next state (DRAINING -> STOPPED).
>  	 *
> @@ -118,6 +120,19 @@ static int trampoline(dt_pcb_t *pcb, uint_t exitlbl)
>  		key = DT_STATE_ENDEDON;
>  	}
>  
> +	/*
> +	 * Retrieve the PID (TGID) of the process that caused the probe to fire,
> +	 * and check it against the PID we're meant to be using.  Do it before
> +	 * the trampoline to minimize the cost of pointless firings in other
> +	 * tracers, even though this means preserving the context in %r1 around
> +	 * the call.
> +	 */
> +	emit(dlp, BPF_MOV_REG(BPF_REG_6, BPF_REG_1));
> +	emit(dlp, BPF_CALL_HELPER(BPF_FUNC_get_current_pid_tgid));
> +	emit(dlp, BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32));
> +	emit(dlp, BPF_BRANCH_IMM(BPF_JNE, BPF_REG_0, getpid(), pcb->pcb_exitlbl));
> +	emit(dlp, BPF_MOV_REG(BPF_REG_1, BPF_REG_6));
> +
>  	dt_cg_tramp_prologue_act(pcb, act);
>  
>  	/*
> -- 
> 2.43.0.272.gce700b77fd
> 
> 
> _______________________________________________
> DTrace-devel mailing list
> DTrace-devel at oss.oracle.com
> https://oss.oracle.com/mailman/listinfo/dtrace-devel



More information about the DTrace-devel mailing list