[lttng-dev] [PATCH lttng-modules] RFC: fix: Remove start and number from syscall_get_arguments() args (v5.1)

Mathieu Desnoyers mathieu.desnoyers at efficios.com
Wed Apr 10 17:11:00 EDT 2019


merged into master, 2.11, 2.10, 2.9, thanks!

Mathieu

----- On Apr 9, 2019, at 2:12 PM, Michael Jeanson mjeanson at efficios.com wrote:

> commit b35f549df1d7520d37ba1e6d4a8d4df6bd52d136
>  Author: Steven Rostedt (Red Hat) <rostedt at goodmis.org>
>  Date:   Mon Nov 7 16:26:37 2016 -0500
> 
>    syscalls: Remove start and number from syscall_get_arguments() args
> 
>    At Linux Plumbers, Andy Lutomirski approached me and pointed out that the
>    function call syscall_get_arguments() implemented in x86 was horribly
>    written and not optimized for the standard case of passing in 0 and 6 for
>    the starting index and the number of system calls to get. When looking at
>    all the users of this function, I discovered that all instances pass in only
>    0 and 6 for these arguments. Instead of having this function handle
>    different cases that are never used, simply rewrite it to return the first 6
>    arguments of a system call.
> 
>    This should help out the performance of tracing system calls by ptrace,
>    ftrace and perf.
> 
>    Link: http://lkml.kernel.org/r/20161107213233.754809394@goodmis.org
> 
> Signed-off-by: Michael Jeanson <mjeanson at efficios.com>
> ---
> lttng-syscalls.c  | 57 ++++++++++++++++++++++++-----------------------
> wrapper/syscall.h | 34 ++++++++++++++++++++++++++++
> 2 files changed, 63 insertions(+), 28 deletions(-)
> create mode 100644 wrapper/syscall.h
> 
> diff --git a/lttng-syscalls.c b/lttng-syscalls.c
> index bcc06b5..ebd9246 100644
> --- a/lttng-syscalls.c
> +++ b/lttng-syscalls.c
> @@ -25,6 +25,7 @@
> #include <wrapper/tracepoint.h>
> #include <wrapper/file.h>
> #include <wrapper/rcu.h>
> +#include <wrapper/syscall.h>
> #include <lttng-events.h>
> 
> #ifndef CONFIG_COMPAT
> @@ -361,9 +362,9 @@ struct lttng_syscall_filter {
> static void syscall_entry_unknown(struct lttng_event *event,
> 	struct pt_regs *regs, unsigned int id)
> {
> -	unsigned long args[UNKNOWN_SYSCALL_NRARGS];
> +	unsigned long args[LTTNG_SYSCALL_NR_ARGS];
> 
> -	syscall_get_arguments(current, regs, 0, UNKNOWN_SYSCALL_NRARGS, args);
> +	lttng_syscall_get_arguments(current, regs, args);
> 	if (unlikely(in_compat_syscall()))
> 		__event_probe__compat_syscall_entry_unknown(event, id, args);
> 	else
> @@ -432,9 +433,9 @@ void syscall_entry_probe(void *__data, struct pt_regs *regs,
> long id)
> 	case 1:
> 	{
> 		void (*fptr)(void *__data, unsigned long arg0) = entry->func;
> -		unsigned long args[1];
> +		unsigned long args[LTTNG_SYSCALL_NR_ARGS];
> 
> -		syscall_get_arguments(current, regs, 0, entry->nrargs, args);
> +		lttng_syscall_get_arguments(current, regs, args);
> 		fptr(event, args[0]);
> 		break;
> 	}
> @@ -443,9 +444,9 @@ void syscall_entry_probe(void *__data, struct pt_regs *regs,
> long id)
> 		void (*fptr)(void *__data,
> 			unsigned long arg0,
> 			unsigned long arg1) = entry->func;
> -		unsigned long args[2];
> +		unsigned long args[LTTNG_SYSCALL_NR_ARGS];
> 
> -		syscall_get_arguments(current, regs, 0, entry->nrargs, args);
> +		lttng_syscall_get_arguments(current, regs, args);
> 		fptr(event, args[0], args[1]);
> 		break;
> 	}
> @@ -455,9 +456,9 @@ void syscall_entry_probe(void *__data, struct pt_regs *regs,
> long id)
> 			unsigned long arg0,
> 			unsigned long arg1,
> 			unsigned long arg2) = entry->func;
> -		unsigned long args[3];
> +		unsigned long args[LTTNG_SYSCALL_NR_ARGS];
> 
> -		syscall_get_arguments(current, regs, 0, entry->nrargs, args);
> +		lttng_syscall_get_arguments(current, regs, args);
> 		fptr(event, args[0], args[1], args[2]);
> 		break;
> 	}
> @@ -468,9 +469,9 @@ void syscall_entry_probe(void *__data, struct pt_regs *regs,
> long id)
> 			unsigned long arg1,
> 			unsigned long arg2,
> 			unsigned long arg3) = entry->func;
> -		unsigned long args[4];
> +		unsigned long args[LTTNG_SYSCALL_NR_ARGS];
> 
> -		syscall_get_arguments(current, regs, 0, entry->nrargs, args);
> +		lttng_syscall_get_arguments(current, regs, args);
> 		fptr(event, args[0], args[1], args[2], args[3]);
> 		break;
> 	}
> @@ -482,9 +483,9 @@ void syscall_entry_probe(void *__data, struct pt_regs *regs,
> long id)
> 			unsigned long arg2,
> 			unsigned long arg3,
> 			unsigned long arg4) = entry->func;
> -		unsigned long args[5];
> +		unsigned long args[LTTNG_SYSCALL_NR_ARGS];
> 
> -		syscall_get_arguments(current, regs, 0, entry->nrargs, args);
> +		lttng_syscall_get_arguments(current, regs, args);
> 		fptr(event, args[0], args[1], args[2], args[3], args[4]);
> 		break;
> 	}
> @@ -497,9 +498,9 @@ void syscall_entry_probe(void *__data, struct pt_regs *regs,
> long id)
> 			unsigned long arg3,
> 			unsigned long arg4,
> 			unsigned long arg5) = entry->func;
> -		unsigned long args[6];
> +		unsigned long args[LTTNG_SYSCALL_NR_ARGS];
> 
> -		syscall_get_arguments(current, regs, 0, entry->nrargs, args);
> +		lttng_syscall_get_arguments(current, regs, args);
> 		fptr(event, args[0], args[1], args[2],
> 			args[3], args[4], args[5]);
> 		break;
> @@ -512,9 +513,9 @@ void syscall_entry_probe(void *__data, struct pt_regs *regs,
> long id)
> static void syscall_exit_unknown(struct lttng_event *event,
> 	struct pt_regs *regs, int id, long ret)
> {
> -	unsigned long args[UNKNOWN_SYSCALL_NRARGS];
> +	unsigned long args[LTTNG_SYSCALL_NR_ARGS];
> 
> -	syscall_get_arguments(current, regs, 0, UNKNOWN_SYSCALL_NRARGS, args);
> +	lttng_syscall_get_arguments(current, regs, args);
> 	if (unlikely(in_compat_syscall()))
> 		__event_probe__compat_syscall_exit_unknown(event, id, ret,
> 			args);
> @@ -588,9 +589,9 @@ void syscall_exit_probe(void *__data, struct pt_regs *regs,
> long ret)
> 		void (*fptr)(void *__data,
> 			long ret,
> 			unsigned long arg0) = entry->func;
> -		unsigned long args[1];
> +		unsigned long args[LTTNG_SYSCALL_NR_ARGS];
> 
> -		syscall_get_arguments(current, regs, 0, entry->nrargs, args);
> +		lttng_syscall_get_arguments(current, regs, args);
> 		fptr(event, ret, args[0]);
> 		break;
> 	}
> @@ -600,9 +601,9 @@ void syscall_exit_probe(void *__data, struct pt_regs *regs,
> long ret)
> 			long ret,
> 			unsigned long arg0,
> 			unsigned long arg1) = entry->func;
> -		unsigned long args[2];
> +		unsigned long args[LTTNG_SYSCALL_NR_ARGS];
> 
> -		syscall_get_arguments(current, regs, 0, entry->nrargs, args);
> +		lttng_syscall_get_arguments(current, regs, args);
> 		fptr(event, ret, args[0], args[1]);
> 		break;
> 	}
> @@ -613,9 +614,9 @@ void syscall_exit_probe(void *__data, struct pt_regs *regs,
> long ret)
> 			unsigned long arg0,
> 			unsigned long arg1,
> 			unsigned long arg2) = entry->func;
> -		unsigned long args[3];
> +		unsigned long args[LTTNG_SYSCALL_NR_ARGS];
> 
> -		syscall_get_arguments(current, regs, 0, entry->nrargs, args);
> +		lttng_syscall_get_arguments(current, regs, args);
> 		fptr(event, ret, args[0], args[1], args[2]);
> 		break;
> 	}
> @@ -627,9 +628,9 @@ void syscall_exit_probe(void *__data, struct pt_regs *regs,
> long ret)
> 			unsigned long arg1,
> 			unsigned long arg2,
> 			unsigned long arg3) = entry->func;
> -		unsigned long args[4];
> +		unsigned long args[LTTNG_SYSCALL_NR_ARGS];
> 
> -		syscall_get_arguments(current, regs, 0, entry->nrargs, args);
> +		lttng_syscall_get_arguments(current, regs, args);
> 		fptr(event, ret, args[0], args[1], args[2], args[3]);
> 		break;
> 	}
> @@ -642,9 +643,9 @@ void syscall_exit_probe(void *__data, struct pt_regs *regs,
> long ret)
> 			unsigned long arg2,
> 			unsigned long arg3,
> 			unsigned long arg4) = entry->func;
> -		unsigned long args[5];
> +		unsigned long args[LTTNG_SYSCALL_NR_ARGS];
> 
> -		syscall_get_arguments(current, regs, 0, entry->nrargs, args);
> +		lttng_syscall_get_arguments(current, regs, args);
> 		fptr(event, ret, args[0], args[1], args[2], args[3], args[4]);
> 		break;
> 	}
> @@ -658,9 +659,9 @@ void syscall_exit_probe(void *__data, struct pt_regs *regs,
> long ret)
> 			unsigned long arg3,
> 			unsigned long arg4,
> 			unsigned long arg5) = entry->func;
> -		unsigned long args[6];
> +		unsigned long args[LTTNG_SYSCALL_NR_ARGS];
> 
> -		syscall_get_arguments(current, regs, 0, entry->nrargs, args);
> +		lttng_syscall_get_arguments(current, regs, args);
> 		fptr(event, ret, args[0], args[1], args[2],
> 			args[3], args[4], args[5]);
> 		break;
> diff --git a/wrapper/syscall.h b/wrapper/syscall.h
> new file mode 100644
> index 0000000..8715f0c
> --- /dev/null
> +++ b/wrapper/syscall.h
> @@ -0,0 +1,34 @@
> +/* SPDX-License-Identifier: (GPL-2.0 or LGPL-2.1)
> + *
> + * wrapper/syscall.h
> + *
> + * wrapper around asm/syscall.h.
> + *
> + * Copyright (C) 2019 Michael Jeanson <mjeanson at efficios.com>
> + */
> +
> +#ifndef _LTTNG_WRAPPER_SYSCALL_H
> +#define _LTTNG_WRAPPER_SYSCALL_H
> +
> +#include <asm/syscall.h>
> +#include <lttng-kernel-version.h>
> +
> +#define LTTNG_SYSCALL_NR_ARGS 6
> +
> +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5,1,0))
> +
> +#define lttng_syscall_get_arguments(task, regs, args) \
> +	syscall_get_arguments(task, regs, args)
> +
> +#else /* LINUX_VERSION_CODE >= KERNEL_VERSION(5,1,0) */
> +
> +static inline
> +void lttng_syscall_get_arguments(struct task_struct *task,
> +		struct pt_regs *regs, unsigned long *args)
> +{
> +	syscall_get_arguments(task, regs, 0, LTTNG_SYSCALL_NR_ARGS, args);
> +}
> +
> +#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(5,1,0) */
> +
> +#endif /* _LTTNG_WRAPPER_SYSCALL_H */
> --
> 2.17.1

-- 
Mathieu Desnoyers
EfficiOS Inc.
http://www.efficios.com


More information about the lttng-dev mailing list