svn commit: r333064 - in head/sys: cddl/dev/systrace kern sys

O. Hartmann ohartmann at walstatt.org
Fri Apr 27 15:26:51 UTC 2018


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512

Am Fri, 27 Apr 2018 15:16:34 +0000 (UTC)
Mateusz Guzik <mjg at FreeBSD.org> schrieb:

> Author: mjg
> Date: Fri Apr 27 15:16:34 2018
> New Revision: 333064
> URL: https://svnweb.freebsd.org/changeset/base/333064
> 
> Log:
>   systrace: track it like sdt probes
>   
>   While here predict false.
>   
>   Note the code is wrong (regardless of this change). Dereference of the
>   pointer can race with module unload. A fix would set the probe to a
>   nop stub instead of NULL.
> 
> Modified:
>   head/sys/cddl/dev/systrace/systrace.c
>   head/sys/kern/kern_dtrace.c
>   head/sys/kern/subr_syscall.c
>   head/sys/sys/sysent.h
> 
> Modified: head/sys/cddl/dev/systrace/systrace.c
> ==============================================================================
> --- head/sys/cddl/dev/systrace/systrace.c	Fri Apr 27 13:59:24 2018
> (r333063) +++ head/sys/cddl/dev/systrace/systrace.c	Fri Apr 27 15:16:34
> 2018	(r333064) @@ -135,6 +135,8 @@ extern const char *freebsd32_syscallnames[];
>  #error 1 << SYSTRACE_SHIFT must exceed number of system calls
>  #endif
>  
> +static int systrace_enabled_count;
> +
>  static void	systrace_load(void *);
>  static void	systrace_unload(void *);
>  
> @@ -315,6 +317,9 @@ systrace_enable(void *arg, dtrace_id_t id, void *parg)
>  		SYSENT[sysnum].sy_entry = id;
>  	else
>  		SYSENT[sysnum].sy_return = id;
> +	systrace_enabled_count++;
> +	if (systrace_enabled_count == 1)
> +		systrace_enabled = true;
>  }
>  
>  static void
> @@ -324,6 +329,9 @@ systrace_disable(void *arg, dtrace_id_t id, void *parg
>  
>  	SYSENT[sysnum].sy_entry = 0;
>  	SYSENT[sysnum].sy_return = 0;
> +	systrace_enabled_count--;
> +	if (systrace_enabled_count == 0)
> +		systrace_enabled = false;
>  }
>  
>  static void
> 
> Modified: head/sys/kern/kern_dtrace.c
> ==============================================================================
> --- head/sys/kern/kern_dtrace.c	Fri Apr 27 13:59:24 2018	(r333063)
> +++ head/sys/kern/kern_dtrace.c	Fri Apr 27 15:16:34 2018	(r333064)
> @@ -56,7 +56,8 @@ dtrace_doubletrap_func_t	dtrace_doubletrap_func;
>  dtrace_pid_probe_ptr_t		dtrace_pid_probe_ptr;
>  dtrace_return_probe_ptr_t	dtrace_return_probe_ptr;
>  
> -systrace_probe_func_t __read_frequently	systrace_probe_func;
> +bool __read_frequently		systrace_enabled;
> +systrace_probe_func_t 		systrace_probe_func;
>  
>  /* Return the DTrace process data size compiled in the kernel hooks. */
>  size_t
> 
> Modified: head/sys/kern/subr_syscall.c
> ==============================================================================
> --- head/sys/kern/subr_syscall.c	Fri Apr 27 13:59:24 2018	(r333063)
> +++ head/sys/kern/subr_syscall.c	Fri Apr 27 15:16:34 2018	(r333064)
> @@ -126,7 +126,8 @@ syscallenter(struct thread *td)
>  
>  #ifdef KDTRACE_HOOKS
>  		/* Give the syscall:::entry DTrace probe a chance to fire. */
> -		if (systrace_probe_func != NULL && sa->callp->sy_entry != 0)
> +		if (__predict_false(systrace_enabled &&
> +		    sa->callp->sy_entry != 0))
>  			(*systrace_probe_func)(sa, SYSTRACE_ENTRY, 0);
>  #endif
>  
> @@ -140,7 +141,8 @@ syscallenter(struct thread *td)
>  
>  #ifdef KDTRACE_HOOKS
>  		/* Give the syscall:::return DTrace probe a chance to fire. */
> -		if (systrace_probe_func != NULL && sa->callp->sy_return != 0)
> +		if (__predict_false(systrace_enabled &&
> +		    sa->callp->sy_return != 0))
>  			(*systrace_probe_func)(sa, SYSTRACE_RETURN,
>  			    error ? -1 : td->td_retval[0]);
>  #endif
> 
> Modified: head/sys/sys/sysent.h
> ==============================================================================
> --- head/sys/sys/sysent.h	Fri Apr 27 13:59:24 2018	(r333063)
> +++ head/sys/sys/sysent.h	Fri Apr 27 15:16:34 2018	(r333064)
> @@ -53,6 +53,7 @@ typedef	void	(*systrace_probe_func_t)(struct syscall_a
>  		    enum systrace_probe_t, int);
>  typedef	void	(*systrace_args_func_t)(int, void *, uint64_t *, int *);
>  
> +extern bool			systrace_enabled;
>  extern systrace_probe_func_t	systrace_probe_func;
>  
>  struct sysent {			/* system call table */
> _______________________________________________
> svn-src-head at freebsd.org mailing list
> https://lists.freebsd.org/mailman/listinfo/svn-src-head
> To unsubscribe, send any mail to "svn-src-head-unsubscribe at freebsd.org"

Fail :-(

[...]
- --- kvm_proc.o ---
In file included from /pool/sources/CURRENT/src/lib/libkvm/kvm_proc.c:66:
/pool/sources/CURRENT/obj/pool/sources/CURRENT/src/amd64.amd64/tmp/usr/include/sys/sysent.h:56:8:
error: unknown type name 'bool' extern bool                     systrace_enabled;
       ^


- -- 
O. Hartmann

Ich widerspreche der Nutzung oder Übermittlung meiner Daten für
Werbezwecke oder für die Markt- oder Meinungsforschung (§ 28 Abs. 4 BDSG).
-----BEGIN PGP SIGNATURE-----

iLUEARMKAB0WIQQZVZMzAtwC2T/86TrS528fyFhYlAUCWuNBKwAKCRDS528fyFhY
lPfrAgCnR4AnAZrI+gsBQmmvVIdoSqHWGYPqs41ApeLTThmiWvUfMhsuA5izIpMf
1ZLKJ2riNAIntZIUsQcEINyRYxv0AgCn8qSQZvoTWoxujsgy6w4L6MGc9ZVnkcTj
hG1ah5boD6MAT0SJYodK5hq8YQ3kXqVAdYBorqZafjoT093jOmVN
=400x
-----END PGP SIGNATURE-----


More information about the svn-src-head mailing list