This fixes two bugs:
- Fix size mismatch of tracepoint array - Have preemptirq test module use same clock source of the selftest -----BEGIN PGP SIGNATURE----- iIoEABYIADIWIQRRSw7ePDh/lE+zeZMp5XQQmuv6qgUCW8eRhRQccm9zdGVkdEBn b29kbWlzLm9yZwAKCRAp5XQQmuv6qkEgAP4vscLVMSYBTUuDNXX0+l8FVdrpPagL 1tjTJpTUfG3QLQEA9XOl8vR/Yy/BywcU7K2R3zGbo7Qh6AgpWl2pJcmsGQk= =XS5E -----END PGP SIGNATURE----- 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
This commit is contained in:
Коммит
9bd871df56
|
@ -20,6 +20,7 @@
|
|||
#include <linux/export.h>
|
||||
#include <linux/rbtree_latch.h>
|
||||
#include <linux/error-injection.h>
|
||||
#include <linux/tracepoint-defs.h>
|
||||
|
||||
#include <linux/percpu.h>
|
||||
#include <asm/module.h>
|
||||
|
@ -430,7 +431,7 @@ struct module {
|
|||
|
||||
#ifdef CONFIG_TRACEPOINTS
|
||||
unsigned int num_tracepoints;
|
||||
struct tracepoint * const *tracepoints_ptrs;
|
||||
tracepoint_ptr_t *tracepoints_ptrs;
|
||||
#endif
|
||||
#ifdef HAVE_JUMP_LABEL
|
||||
struct jump_entry *jump_entries;
|
||||
|
|
|
@ -35,6 +35,12 @@ struct tracepoint {
|
|||
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 tracepoint *tp;
|
||||
void *bpf_func;
|
||||
|
|
|
@ -99,6 +99,29 @@ extern void syscall_unregfunc(void);
|
|||
#define TRACE_DEFINE_ENUM(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 */
|
||||
|
||||
/*
|
||||
|
@ -253,19 +276,6 @@ extern void syscall_unregfunc(void);
|
|||
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
|
||||
* structures, so we create an array of pointers that will be used for iteration
|
||||
|
|
|
@ -5,12 +5,12 @@
|
|||
* Copyright (C) 2018 Joel Fernandes (Google) <joel@joelfernandes.org>
|
||||
*/
|
||||
|
||||
#include <linux/trace_clock.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/kthread.h>
|
||||
#include <linux/ktime.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/printk.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
|
|||
|
||||
static void busy_wait(ulong time)
|
||||
{
|
||||
ktime_t start, end;
|
||||
start = ktime_get();
|
||||
u64 start, end;
|
||||
start = trace_clock_local();
|
||||
do {
|
||||
end = ktime_get();
|
||||
end = trace_clock_local();
|
||||
if (kthread_should_stop())
|
||||
break;
|
||||
} while (ktime_to_ns(ktime_sub(end, start)) < (time * 1000));
|
||||
} while ((end - start) < (time * 1000));
|
||||
}
|
||||
|
||||
static int preemptirq_delay_run(void *data)
|
||||
|
|
|
@ -28,8 +28,8 @@
|
|||
#include <linux/sched/task.h>
|
||||
#include <linux/static_key.h>
|
||||
|
||||
extern struct tracepoint * const __start___tracepoints_ptrs[];
|
||||
extern struct tracepoint * const __stop___tracepoints_ptrs[];
|
||||
extern tracepoint_ptr_t __start___tracepoints_ptrs[];
|
||||
extern tracepoint_ptr_t __stop___tracepoints_ptrs[];
|
||||
|
||||
DEFINE_SRCU(tracepoint_srcu);
|
||||
EXPORT_SYMBOL_GPL(tracepoint_srcu);
|
||||
|
@ -371,25 +371,17 @@ int tracepoint_probe_unregister(struct tracepoint *tp, void *probe, void *data)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(tracepoint_probe_unregister);
|
||||
|
||||
static void for_each_tracepoint_range(struct tracepoint * const *begin,
|
||||
struct tracepoint * const *end,
|
||||
static void for_each_tracepoint_range(
|
||||
tracepoint_ptr_t *begin, tracepoint_ptr_t *end,
|
||||
void (*fct)(struct tracepoint *tp, void *priv),
|
||||
void *priv)
|
||||
{
|
||||
tracepoint_ptr_t *iter;
|
||||
|
||||
if (!begin)
|
||||
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++)
|
||||
fct(*iter, priv);
|
||||
}
|
||||
for (iter = begin; iter < end; iter++)
|
||||
fct(tracepoint_ptr_deref(iter), priv);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_MODULES
|
||||
|
|
Загрузка…
Ссылка в новой задаче