From 0116245fd67c8cf8e63a63e6c964577f0d734e36 Mon Sep 17 00:00:00 2001 From: Michael Jeanson Date: Mon, 26 Oct 2020 17:09:05 -0400 Subject: [PATCH] fix: tracepoint: Optimize using static_call() (v5.10) See upstream commit : commit d25e37d89dd2f41d7acae0429039d2f0ae8b4a07 Author: Steven Rostedt (VMware) Date: Tue Aug 18 15:57:52 2020 +0200 tracepoint: Optimize using static_call() Currently the tracepoint site will iterate a vector and issue indirect calls to however many handlers are registered (ie. the vector is long). Using static_call() it is possible to optimize this for the common case of only having a single handler registered. In this case the static_call() can directly call this handler. Otherwise, if the vector is longer than 1, call a function that iterates the whole vector like the current code. Change-Id: I739dd84d62cc1a821b8bd8acff74fa29aa25d22f Signed-off-by: Michael Jeanson Signed-off-by: Mathieu Desnoyers --- include/wrapper/tracepoint.h | 8 +++ src/lttng-statedump-impl.c | 105 +++++++++++++++++++++++++++++------ src/probes/lttng.c | 7 ++- tests/probes/lttng-test.c | 7 ++- 4 files changed, 108 insertions(+), 19 deletions(-) diff --git a/include/wrapper/tracepoint.h b/include/wrapper/tracepoint.h index 9f631abd..41fcfad6 100644 --- a/include/wrapper/tracepoint.h +++ b/include/wrapper/tracepoint.h @@ -14,6 +14,14 @@ #include #include +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5,10,0)) +#define LTTNG_DEFINE_TRACE(name, proto, args) \ + DEFINE_TRACE(name, PARAMS(proto), PARAMS(args)) +#else +#define LTTNG_DEFINE_TRACE(name, proto, args) \ + DEFINE_TRACE(name) +#endif + #ifndef HAVE_KABI_2635_TRACEPOINT #define kabi_2635_tracepoint_probe_register tracepoint_probe_register diff --git a/src/lttng-statedump-impl.c b/src/lttng-statedump-impl.c index 153ddf8e..42052fae 100644 --- a/src/lttng-statedump-impl.c +++ b/src/lttng-statedump-impl.c @@ -55,27 +55,100 @@ #define LTTNG_INSTRUMENTATION #include -DEFINE_TRACE(lttng_statedump_block_device); -DEFINE_TRACE(lttng_statedump_end); -DEFINE_TRACE(lttng_statedump_interrupt); -DEFINE_TRACE(lttng_statedump_file_descriptor); -DEFINE_TRACE(lttng_statedump_start); -DEFINE_TRACE(lttng_statedump_process_state); -DEFINE_TRACE(lttng_statedump_process_pid_ns); +LTTNG_DEFINE_TRACE(lttng_statedump_block_device, + TP_PROTO(struct lttng_session *session, + dev_t dev, const char *diskname), + TP_ARGS(session, dev, diskname)); + +LTTNG_DEFINE_TRACE(lttng_statedump_end, + TP_PROTO(struct lttng_session *session), + TP_ARGS(session)); + +LTTNG_DEFINE_TRACE(lttng_statedump_interrupt, + TP_PROTO(struct lttng_session *session, + unsigned int irq, const char *chip_name, + struct irqaction *action), + TP_ARGS(session, irq, chip_name, action)); + +LTTNG_DEFINE_TRACE(lttng_statedump_file_descriptor, + TP_PROTO(struct lttng_session *session, + struct files_struct *files, + int fd, const char *filename, + unsigned int flags, fmode_t fmode), + TP_ARGS(session, files, fd, filename, flags, fmode)); + +LTTNG_DEFINE_TRACE(lttng_statedump_start, + TP_PROTO(struct lttng_session *session), + TP_ARGS(session)); + +LTTNG_DEFINE_TRACE(lttng_statedump_process_state, + TP_PROTO(struct lttng_session *session, + struct task_struct *p, + int type, int mode, int submode, int status, + struct files_struct *files), + TP_ARGS(session, p, type, mode, submode, status, files)); + +LTTNG_DEFINE_TRACE(lttng_statedump_process_pid_ns, + TP_PROTO(struct lttng_session *session, + struct task_struct *p, + struct pid_namespace *pid_ns), + TP_ARGS(session, p, pid_ns)); + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,6,0)) -DEFINE_TRACE(lttng_statedump_process_cgroup_ns); +LTTNG_DEFINE_TRACE(lttng_statedump_process_cgroup_ns, + TP_PROTO(struct lttng_session *session, + struct task_struct *p, + struct cgroup_namespace *cgroup_ns), + TP_ARGS(session, p, cgroup_ns)); #endif -DEFINE_TRACE(lttng_statedump_process_ipc_ns); + +LTTNG_DEFINE_TRACE(lttng_statedump_process_ipc_ns, + TP_PROTO(struct lttng_session *session, + struct task_struct *p, + struct ipc_namespace *ipc_ns), + TP_ARGS(session, p, ipc_ns)); + #ifndef LTTNG_MNT_NS_MISSING_HEADER -DEFINE_TRACE(lttng_statedump_process_mnt_ns); +LTTNG_DEFINE_TRACE(lttng_statedump_process_mnt_ns, + TP_PROTO(struct lttng_session *session, + struct task_struct *p, + struct mnt_namespace *mnt_ns), + TP_ARGS(session, p, mnt_ns)); #endif -DEFINE_TRACE(lttng_statedump_process_net_ns); -DEFINE_TRACE(lttng_statedump_process_user_ns); -DEFINE_TRACE(lttng_statedump_process_uts_ns); -DEFINE_TRACE(lttng_statedump_process_time_ns); -DEFINE_TRACE(lttng_statedump_network_interface); + +LTTNG_DEFINE_TRACE(lttng_statedump_process_net_ns, + TP_PROTO(struct lttng_session *session, + struct task_struct *p, + struct net *net_ns), + TP_ARGS(session, p, net_ns)); + +LTTNG_DEFINE_TRACE(lttng_statedump_process_user_ns, + TP_PROTO(struct lttng_session *session, + struct task_struct *p, + struct user_namespace *user_ns), + TP_ARGS(session, p, user_ns)); + +LTTNG_DEFINE_TRACE(lttng_statedump_process_uts_ns, + TP_PROTO(struct lttng_session *session, + struct task_struct *p, + struct uts_namespace *uts_ns), + TP_ARGS(session, p, uts_ns)); + +LTTNG_DEFINE_TRACE(lttng_statedump_process_time_ns, + TP_PROTO(struct lttng_session *session, + struct task_struct *p, + struct time_namespace *time_ns), + TP_ARGS(session, p, time_ns)); + +LTTNG_DEFINE_TRACE(lttng_statedump_network_interface, + TP_PROTO(struct lttng_session *session, + struct net_device *dev, struct in_ifaddr *ifa), + TP_ARGS(session, dev, ifa)); + #ifdef LTTNG_HAVE_STATEDUMP_CPU_TOPOLOGY -DEFINE_TRACE(lttng_statedump_cpu_topology); +LTTNG_DEFINE_TRACE(lttng_statedump_cpu_topology, + TP_PROTO(struct lttng_session *session, struct cpuinfo_x86 *c), + TP_ARGS(session, c)); #endif struct lttng_fd_ctx { diff --git a/src/probes/lttng.c b/src/probes/lttng.c index ab233c1a..1892d589 100644 --- a/src/probes/lttng.c +++ b/src/probes/lttng.c @@ -8,7 +8,7 @@ */ #include -#include +#include #include #include #include @@ -32,7 +32,10 @@ #define LTTNG_LOGGER_COUNT_MAX 1024 #define LTTNG_LOGGER_FILE "lttng-logger" -DEFINE_TRACE(lttng_logger); +LTTNG_DEFINE_TRACE(lttng_logger, + PARAMS(const char __user *text, size_t len), + PARAMS(text, len) +); static struct proc_dir_entry *lttng_logger_dentry; diff --git a/tests/probes/lttng-test.c b/tests/probes/lttng-test.c index 5064a685..098ceae8 100644 --- a/tests/probes/lttng-test.c +++ b/tests/probes/lttng-test.c @@ -25,7 +25,12 @@ #define LTTNG_INSTRUMENTATION #include -DEFINE_TRACE(lttng_test_filter_event); +LTTNG_DEFINE_TRACE(lttng_test_filter_event, + PARAMS(int anint, int netint, long *values, + char *text, size_t textlen, + char *etext, uint32_t * net_values), + PARAMS(anint, netint, values, text, textlen, etext, net_values) +); #define LTTNG_TEST_FILTER_EVENT_FILE "lttng-test-filter-event" -- 2.34.1