Commit 9bd871df authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman

Merge tag 'trace-v4.19-rc8' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace

Steven writes:
  "tracing: Two fixes for 4.19

   This fixes two bugs:
    - Fix size mismatch of tracepoint array
    - Have preemptirq test module use same clock source of the selftest"

* tag 'trace-v4.19-rc8' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace:
  tracing: Use trace_clock_local() for looping in preemptirq_delay_test.c
  tracepoint: Fix tracepoint array element size mismatch
parents c343db45 12ad0cb2
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
#include <linux/export.h> #include <linux/export.h>
#include <linux/rbtree_latch.h> #include <linux/rbtree_latch.h>
#include <linux/error-injection.h> #include <linux/error-injection.h>
#include <linux/tracepoint-defs.h>
#include <linux/percpu.h> #include <linux/percpu.h>
#include <asm/module.h> #include <asm/module.h>
...@@ -430,7 +431,7 @@ struct module { ...@@ -430,7 +431,7 @@ struct module {
#ifdef CONFIG_TRACEPOINTS #ifdef CONFIG_TRACEPOINTS
unsigned int num_tracepoints; unsigned int num_tracepoints;
struct tracepoint * const *tracepoints_ptrs; tracepoint_ptr_t *tracepoints_ptrs;
#endif #endif
#ifdef HAVE_JUMP_LABEL #ifdef HAVE_JUMP_LABEL
struct jump_entry *jump_entries; struct jump_entry *jump_entries;
......
...@@ -35,6 +35,12 @@ struct tracepoint { ...@@ -35,6 +35,12 @@ struct tracepoint {
struct tracepoint_func __rcu *funcs; struct tracepoint_func __rcu *funcs;
}; };
#ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS
typedef const int tracepoint_ptr_t;
#else
typedef struct tracepoint * const tracepoint_ptr_t;
#endif
struct bpf_raw_event_map { struct bpf_raw_event_map {
struct tracepoint *tp; struct tracepoint *tp;
void *bpf_func; void *bpf_func;
......
...@@ -99,6 +99,29 @@ extern void syscall_unregfunc(void); ...@@ -99,6 +99,29 @@ extern void syscall_unregfunc(void);
#define TRACE_DEFINE_ENUM(x) #define TRACE_DEFINE_ENUM(x)
#define TRACE_DEFINE_SIZEOF(x) #define TRACE_DEFINE_SIZEOF(x)
#ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS
static inline struct tracepoint *tracepoint_ptr_deref(tracepoint_ptr_t *p)
{
return offset_to_ptr(p);
}
#define __TRACEPOINT_ENTRY(name) \
asm(" .section \"__tracepoints_ptrs\", \"a\" \n" \
" .balign 4 \n" \
" .long __tracepoint_" #name " - . \n" \
" .previous \n")
#else
static inline struct tracepoint *tracepoint_ptr_deref(tracepoint_ptr_t *p)
{
return *p;
}
#define __TRACEPOINT_ENTRY(name) \
static tracepoint_ptr_t __tracepoint_ptr_##name __used \
__attribute__((section("__tracepoints_ptrs"))) = \
&__tracepoint_##name
#endif
#endif /* _LINUX_TRACEPOINT_H */ #endif /* _LINUX_TRACEPOINT_H */
/* /*
...@@ -253,19 +276,6 @@ extern void syscall_unregfunc(void); ...@@ -253,19 +276,6 @@ extern void syscall_unregfunc(void);
return static_key_false(&__tracepoint_##name.key); \ return static_key_false(&__tracepoint_##name.key); \
} }
#ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS
#define __TRACEPOINT_ENTRY(name) \
asm(" .section \"__tracepoints_ptrs\", \"a\" \n" \
" .balign 4 \n" \
" .long __tracepoint_" #name " - . \n" \
" .previous \n")
#else
#define __TRACEPOINT_ENTRY(name) \
static struct tracepoint * const __tracepoint_ptr_##name __used \
__attribute__((section("__tracepoints_ptrs"))) = \
&__tracepoint_##name
#endif
/* /*
* We have no guarantee that gcc and the linker won't up-align the tracepoint * We have no guarantee that gcc and the linker won't up-align the tracepoint
* structures, so we create an array of pointers that will be used for iteration * structures, so we create an array of pointers that will be used for iteration
......
...@@ -5,12 +5,12 @@ ...@@ -5,12 +5,12 @@
* Copyright (C) 2018 Joel Fernandes (Google) <joel@joelfernandes.org> * Copyright (C) 2018 Joel Fernandes (Google) <joel@joelfernandes.org>
*/ */
#include <linux/trace_clock.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/irq.h> #include <linux/irq.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/kthread.h> #include <linux/kthread.h>
#include <linux/ktime.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/printk.h> #include <linux/printk.h>
#include <linux/string.h> #include <linux/string.h>
...@@ -25,13 +25,13 @@ MODULE_PARM_DESC(test_mode, "Mode of the test such as preempt or irq (default ir ...@@ -25,13 +25,13 @@ MODULE_PARM_DESC(test_mode, "Mode of the test such as preempt or irq (default ir
static void busy_wait(ulong time) static void busy_wait(ulong time)
{ {
ktime_t start, end; u64 start, end;
start = ktime_get(); start = trace_clock_local();
do { do {
end = ktime_get(); end = trace_clock_local();
if (kthread_should_stop()) if (kthread_should_stop())
break; break;
} while (ktime_to_ns(ktime_sub(end, start)) < (time * 1000)); } while ((end - start) < (time * 1000));
} }
static int preemptirq_delay_run(void *data) static int preemptirq_delay_run(void *data)
......
...@@ -28,8 +28,8 @@ ...@@ -28,8 +28,8 @@
#include <linux/sched/task.h> #include <linux/sched/task.h>
#include <linux/static_key.h> #include <linux/static_key.h>
extern struct tracepoint * const __start___tracepoints_ptrs[]; extern tracepoint_ptr_t __start___tracepoints_ptrs[];
extern struct tracepoint * const __stop___tracepoints_ptrs[]; extern tracepoint_ptr_t __stop___tracepoints_ptrs[];
DEFINE_SRCU(tracepoint_srcu); DEFINE_SRCU(tracepoint_srcu);
EXPORT_SYMBOL_GPL(tracepoint_srcu); EXPORT_SYMBOL_GPL(tracepoint_srcu);
...@@ -371,25 +371,17 @@ int tracepoint_probe_unregister(struct tracepoint *tp, void *probe, void *data) ...@@ -371,25 +371,17 @@ int tracepoint_probe_unregister(struct tracepoint *tp, void *probe, void *data)
} }
EXPORT_SYMBOL_GPL(tracepoint_probe_unregister); EXPORT_SYMBOL_GPL(tracepoint_probe_unregister);
static void for_each_tracepoint_range(struct tracepoint * const *begin, static void for_each_tracepoint_range(
struct tracepoint * const *end, tracepoint_ptr_t *begin, tracepoint_ptr_t *end,
void (*fct)(struct tracepoint *tp, void *priv), void (*fct)(struct tracepoint *tp, void *priv),
void *priv) void *priv)
{ {
tracepoint_ptr_t *iter;
if (!begin) if (!begin)
return; return;
if (IS_ENABLED(CONFIG_HAVE_ARCH_PREL32_RELOCATIONS)) {
const int *iter;
for (iter = (const int *)begin; iter < (const int *)end; iter++)
fct(offset_to_ptr(iter), priv);
} else {
struct tracepoint * const *iter;
for (iter = begin; iter < end; iter++) for (iter = begin; iter < end; iter++)
fct(*iter, priv); fct(tracepoint_ptr_deref(iter), priv);
}
} }
#ifdef CONFIG_MODULES #ifdef CONFIG_MODULES
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment