meta-intel/recipes-kernel/lttng/lttng-modules/0005-Fix-Remove-start-and-number-from-syscall_get_argumen.patch
Naveen Saini 886d2063cd lttng-modules: add bbappend
Backport patches from upstream to fix build errors when building
with kernel v5.1. These patches are backported from stable branch.

The code v5.1 is protected by ifdefs so v4.19 works as well.

Signed-off-by: Naveen Saini <naveen.kumar.saini@intel.com>
Signed-off-by: Anuj Mittal <anuj.mittal@intel.com>
2019-05-21 14:54:56 +08:00

261 lines
9.0 KiB
Diff

From bd3fb656df0fedb0f87d1ef3690260a1d4b135e5 Mon Sep 17 00:00:00 2001
From: Michael Jeanson <mjeanson@efficios.com>
Date: Tue, 9 Apr 2019 14:12:41 -0400
Subject: [PATCH 5/5] Fix: Remove start and number from syscall_get_arguments()
args (v5.1)
commit b35f549df1d7520d37ba1e6d4a8d4df6bd52d136
Author: Steven Rostedt (Red Hat) <rostedt@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
Upstream-Status: Backport [http://git.lttng.org/?p=lttng-modules.git;a=commit;h=1b7b9c650ebb94358365512199559b0ece3e657c]
Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Signed-off-by: Naveen Saini <naveen.kumar.saini@intel.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 0b980a1..c9dc275 100644
--- a/lttng-syscalls.c
+++ b/lttng-syscalls.c
@@ -38,6 +38,7 @@
#include <wrapper/tracepoint.h>
#include <wrapper/file.h>
#include <wrapper/rcu.h>
+#include <wrapper/syscall.h>
#include <lttng-events.h>
#ifndef CONFIG_COMPAT
@@ -374,9 +375,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
@@ -445,9 +446,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;
}
@@ -456,9 +457,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;
}
@@ -468,9 +469,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;
}
@@ -481,9 +482,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;
}
@@ -495,9 +496,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;
}
@@ -510,9 +511,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;
@@ -525,9 +526,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);
@@ -601,9 +602,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;
}
@@ -613,9 +614,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;
}
@@ -626,9 +627,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;
}
@@ -640,9 +641,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;
}
@@ -655,9 +656,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;
}
@@ -671,9 +672,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@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.0