Skip to content

Commit 04ae87a

Browse files
Peter ZijlstraIngo Molnar
authored andcommitted
ftrace: Rework event_create_dir()
Rework event_create_dir() to use an array of static data instead of function pointers where possible. The problem is that it would call the function pointer on module load before parse_args(), possibly even before jump_labels were initialized. Luckily the generated functions don't use jump_labels but it still seems fragile. It also gets in the way of changing when we make the module map executable. The generated function are basically calling trace_define_field() with a bunch of static arguments. So instead of a function, capture these arguments in a static array, avoiding the function call. Now there are a number of cases where the fields are dynamic (syscall arguments, kprobes and uprobes), in which case a static array does not work, for these we preserve the function call. Luckily all these cases are not related to modules and so we can retain the function call for them. Also fix up all broken tracepoint definitions that now generate a compile error. Tested-by: Alexei Starovoitov <[email protected]> Tested-by: Steven Rostedt (VMware) <[email protected]> Signed-off-by: Peter Zijlstra (Intel) <[email protected]> Reviewed-by: Steven Rostedt (VMware) <[email protected]> Acked-by: Alexei Starovoitov <[email protected]> Cc: Andy Lutomirski <[email protected]> Cc: Borislav Petkov <[email protected]> Cc: Brian Gerst <[email protected]> Cc: Denys Vlasenko <[email protected]> Cc: H. Peter Anvin <[email protected]> Cc: Linus Torvalds <[email protected]> Cc: Peter Zijlstra <[email protected]> Cc: Steven Rostedt <[email protected]> Cc: Thomas Gleixner <[email protected]> Link: https://lkml.kernel.org/r/[email protected] Signed-off-by: Ingo Molnar <[email protected]>
1 parent 958de66 commit 04ae87a

File tree

21 files changed

+213
-249
lines changed

21 files changed

+213
-249
lines changed

drivers/infiniband/hw/hfi1/trace_tid.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -138,10 +138,10 @@ TRACE_EVENT(/* put_tid */
138138
TP_ARGS(dd, index, type, pa, order),
139139
TP_STRUCT__entry(/* entry */
140140
DD_DEV_ENTRY(dd)
141-
__field(unsigned long, pa);
142-
__field(u32, index);
143-
__field(u32, type);
144-
__field(u16, order);
141+
__field(unsigned long, pa)
142+
__field(u32, index)
143+
__field(u32, type)
144+
__field(u16, order)
145145
),
146146
TP_fast_assign(/* assign */
147147
DD_DEV_ASSIGN(dd);

drivers/infiniband/hw/hfi1/trace_tx.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -588,7 +588,7 @@ TRACE_EVENT(hfi1_sdma_user_reqinfo,
588588
TP_PROTO(struct hfi1_devdata *dd, u16 ctxt, u8 subctxt, u16 *i),
589589
TP_ARGS(dd, ctxt, subctxt, i),
590590
TP_STRUCT__entry(
591-
DD_DEV_ENTRY(dd);
591+
DD_DEV_ENTRY(dd)
592592
__field(u16, ctxt)
593593
__field(u8, subctxt)
594594
__field(u8, ver_opcode)

drivers/lightnvm/pblk-trace.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ TRACE_EVENT(pblk_chunk_reset,
4646
TP_STRUCT__entry(
4747
__string(name, name)
4848
__field(u64, ppa)
49-
__field(int, state);
49+
__field(int, state)
5050
),
5151

5252
TP_fast_assign(
@@ -72,7 +72,7 @@ TRACE_EVENT(pblk_chunk_state,
7272
TP_STRUCT__entry(
7373
__string(name, name)
7474
__field(u64, ppa)
75-
__field(int, state);
75+
__field(int, state)
7676
),
7777

7878
TP_fast_assign(
@@ -98,7 +98,7 @@ TRACE_EVENT(pblk_line_state,
9898
TP_STRUCT__entry(
9999
__string(name, name)
100100
__field(int, line)
101-
__field(int, state);
101+
__field(int, state)
102102
),
103103

104104
TP_fast_assign(
@@ -121,7 +121,7 @@ TRACE_EVENT(pblk_state,
121121

122122
TP_STRUCT__entry(
123123
__string(name, name)
124-
__field(int, state);
124+
__field(int, state)
125125
),
126126

127127
TP_fast_assign(

drivers/net/fjes/fjes_trace.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ TRACE_EVENT(fjes_hw_issue_request_command,
2828
__field(u8, cs_busy)
2929
__field(u8, cs_complete)
3030
__field(int, timeout)
31-
__field(int, ret);
31+
__field(int, ret)
3232
),
3333
TP_fast_assign(
3434
__entry->cr_req = cr->bits.req_code;

drivers/net/wireless/ath/ath10k/trace.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ TRACE_EVENT(ath10k_wmi_dbglog,
239239
TP_STRUCT__entry(
240240
__string(device, dev_name(ar->dev))
241241
__string(driver, dev_driver_string(ar->dev))
242-
__field(u8, hw_type);
242+
__field(u8, hw_type)
243243
__field(size_t, buf_len)
244244
__dynamic_array(u8, buf, buf_len)
245245
),
@@ -269,7 +269,7 @@ TRACE_EVENT(ath10k_htt_pktlog,
269269
TP_STRUCT__entry(
270270
__string(device, dev_name(ar->dev))
271271
__string(driver, dev_driver_string(ar->dev))
272-
__field(u8, hw_type);
272+
__field(u8, hw_type)
273273
__field(u16, buf_len)
274274
__dynamic_array(u8, pktlog, buf_len)
275275
),
@@ -435,7 +435,7 @@ TRACE_EVENT(ath10k_htt_rx_desc,
435435
TP_STRUCT__entry(
436436
__string(device, dev_name(ar->dev))
437437
__string(driver, dev_driver_string(ar->dev))
438-
__field(u8, hw_type);
438+
__field(u8, hw_type)
439439
__field(u16, len)
440440
__dynamic_array(u8, rxdesc, len)
441441
),

fs/xfs/scrub/trace.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@ TRACE_EVENT(xchk_btree_op_error,
329329
__field(int, level)
330330
__field(xfs_agnumber_t, agno)
331331
__field(xfs_agblock_t, bno)
332-
__field(int, ptr);
332+
__field(int, ptr)
333333
__field(int, error)
334334
__field(void *, ret_ip)
335335
),
@@ -414,7 +414,7 @@ TRACE_EVENT(xchk_btree_error,
414414
__field(int, level)
415415
__field(xfs_agnumber_t, agno)
416416
__field(xfs_agblock_t, bno)
417-
__field(int, ptr);
417+
__field(int, ptr)
418418
__field(void *, ret_ip)
419419
),
420420
TP_fast_assign(
@@ -452,7 +452,7 @@ TRACE_EVENT(xchk_ifork_btree_error,
452452
__field(int, level)
453453
__field(xfs_agnumber_t, agno)
454454
__field(xfs_agblock_t, bno)
455-
__field(int, ptr);
455+
__field(int, ptr)
456456
__field(void *, ret_ip)
457457
),
458458
TP_fast_assign(

fs/xfs/xfs_trace.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -218,8 +218,8 @@ DECLARE_EVENT_CLASS(xfs_bmap_class,
218218
TP_STRUCT__entry(
219219
__field(dev_t, dev)
220220
__field(xfs_ino_t, ino)
221-
__field(void *, leaf);
222-
__field(int, pos);
221+
__field(void *, leaf)
222+
__field(int, pos)
223223
__field(xfs_fileoff_t, startoff)
224224
__field(xfs_fsblock_t, startblock)
225225
__field(xfs_filblks_t, blockcount)

include/linux/trace_events.h

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,22 @@ enum trace_reg {
187187

188188
struct trace_event_call;
189189

190+
#define TRACE_FUNCTION_TYPE ((const char *)~0UL)
191+
192+
struct trace_event_fields {
193+
const char *type;
194+
union {
195+
struct {
196+
const char *name;
197+
const int size;
198+
const int align;
199+
const int is_signed;
200+
const int filter_type;
201+
};
202+
int (*define_fields)(struct trace_event_call *);
203+
};
204+
};
205+
190206
struct trace_event_class {
191207
const char *system;
192208
void *probe;
@@ -195,7 +211,7 @@ struct trace_event_class {
195211
#endif
196212
int (*reg)(struct trace_event_call *event,
197213
enum trace_reg type, void *data);
198-
int (*define_fields)(struct trace_event_call *);
214+
struct trace_event_fields *fields_array;
199215
struct list_head *(*get_fields)(struct trace_event_call *);
200216
struct list_head fields;
201217
int (*raw_init)(struct trace_event_call *);

include/trace/events/filemap.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ TRACE_EVENT(file_check_and_advance_wb_err,
8585
TP_ARGS(file, old),
8686

8787
TP_STRUCT__entry(
88-
__field(struct file *, file);
88+
__field(struct file *, file)
8989
__field(unsigned long, i_ino)
9090
__field(dev_t, s_dev)
9191
__field(errseq_t, old)

include/trace/events/rpcrdma.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1507,7 +1507,7 @@ TRACE_EVENT(svcrdma_dma_map_page,
15071507
TP_ARGS(rdma, page),
15081508

15091509
TP_STRUCT__entry(
1510-
__field(const void *, page);
1510+
__field(const void *, page)
15111511
__string(device, rdma->sc_cm_id->device->name)
15121512
__string(addr, rdma->sc_xprt.xpt_remotebuf)
15131513
),

include/trace/trace_events.h

Lines changed: 21 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -394,22 +394,16 @@ static struct trace_event_functions trace_event_type_funcs_##call = { \
394394
#include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
395395

396396
#undef __field_ext
397-
#define __field_ext(type, item, filter_type) \
398-
ret = trace_define_field(event_call, #type, #item, \
399-
offsetof(typeof(field), item), \
400-
sizeof(field.item), \
401-
is_signed_type(type), filter_type); \
402-
if (ret) \
403-
return ret;
397+
#define __field_ext(_type, _item, _filter_type) { \
398+
.type = #_type, .name = #_item, \
399+
.size = sizeof(_type), .align = __alignof__(_type), \
400+
.is_signed = is_signed_type(_type), .filter_type = _filter_type },
404401

405402
#undef __field_struct_ext
406-
#define __field_struct_ext(type, item, filter_type) \
407-
ret = trace_define_field(event_call, #type, #item, \
408-
offsetof(typeof(field), item), \
409-
sizeof(field.item), \
410-
0, filter_type); \
411-
if (ret) \
412-
return ret;
403+
#define __field_struct_ext(_type, _item, _filter_type) { \
404+
.type = #_type, .name = #_item, \
405+
.size = sizeof(_type), .align = __alignof__(_type), \
406+
0, .filter_type = _filter_type },
413407

414408
#undef __field
415409
#define __field(type, item) __field_ext(type, item, FILTER_OTHER)
@@ -418,25 +412,16 @@ static struct trace_event_functions trace_event_type_funcs_##call = { \
418412
#define __field_struct(type, item) __field_struct_ext(type, item, FILTER_OTHER)
419413

420414
#undef __array
421-
#define __array(type, item, len) \
422-
do { \
423-
char *type_str = #type"["__stringify(len)"]"; \
424-
BUILD_BUG_ON(len > MAX_FILTER_STR_VAL); \
425-
BUILD_BUG_ON(len <= 0); \
426-
ret = trace_define_field(event_call, type_str, #item, \
427-
offsetof(typeof(field), item), \
428-
sizeof(field.item), \
429-
is_signed_type(type), FILTER_OTHER); \
430-
if (ret) \
431-
return ret; \
432-
} while (0);
415+
#define __array(_type, _item, _len) { \
416+
.type = #_type"["__stringify(_len)"]", .name = #_item, \
417+
.size = sizeof(_type[_len]), .align = __alignof__(_type), \
418+
.is_signed = is_signed_type(_type), .filter_type = FILTER_OTHER },
433419

434420
#undef __dynamic_array
435-
#define __dynamic_array(type, item, len) \
436-
ret = trace_define_field(event_call, "__data_loc " #type "[]", #item, \
437-
offsetof(typeof(field), __data_loc_##item), \
438-
sizeof(field.__data_loc_##item), \
439-
is_signed_type(type), FILTER_OTHER);
421+
#define __dynamic_array(_type, _item, _len) { \
422+
.type = "__data_loc " #_type "[]", .name = #_item, \
423+
.size = 4, .align = 4, \
424+
.is_signed = is_signed_type(_type), .filter_type = FILTER_OTHER },
440425

441426
#undef __string
442427
#define __string(item, src) __dynamic_array(char, item, -1)
@@ -446,16 +431,9 @@ static struct trace_event_functions trace_event_type_funcs_##call = { \
446431

447432
#undef DECLARE_EVENT_CLASS
448433
#define DECLARE_EVENT_CLASS(call, proto, args, tstruct, func, print) \
449-
static int notrace __init \
450-
trace_event_define_fields_##call(struct trace_event_call *event_call) \
451-
{ \
452-
struct trace_event_raw_##call field; \
453-
int ret; \
454-
\
455-
tstruct; \
456-
\
457-
return ret; \
458-
}
434+
static struct trace_event_fields trace_event_fields_##call[] = { \
435+
tstruct \
436+
{} };
459437

460438
#undef DEFINE_EVENT
461439
#define DEFINE_EVENT(template, name, proto, args)
@@ -613,7 +591,7 @@ static inline notrace int trace_event_get_offsets_##call( \
613591
*
614592
* static struct trace_event_class __used event_class_<template> = {
615593
* .system = "<system>",
616-
* .define_fields = trace_event_define_fields_<call>,
594+
* .fields_array = trace_event_fields_<call>,
617595
* .fields = LIST_HEAD_INIT(event_class_##call.fields),
618596
* .raw_init = trace_event_raw_init,
619597
* .probe = trace_event_raw_event_##call,
@@ -761,7 +739,7 @@ _TRACE_PERF_PROTO(call, PARAMS(proto)); \
761739
static char print_fmt_##call[] = print; \
762740
static struct trace_event_class __used __refdata event_class_##call = { \
763741
.system = TRACE_SYSTEM_STRING, \
764-
.define_fields = trace_event_define_fields_##call, \
742+
.fields_array = trace_event_fields_##call, \
765743
.fields = LIST_HEAD_INIT(event_class_##call.fields),\
766744
.raw_init = trace_event_raw_init, \
767745
.probe = trace_event_raw_event_##call, \

kernel/trace/trace.h

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,9 @@ enum trace_type {
4949
#undef __field
5050
#define __field(type, item) type item;
5151

52+
#undef __field_fn
53+
#define __field_fn(type, item) type item;
54+
5255
#undef __field_struct
5356
#define __field_struct(type, item) __field(type, item)
5457

@@ -68,26 +71,22 @@ enum trace_type {
6871
#define F_STRUCT(args...) args
6972

7073
#undef FTRACE_ENTRY
71-
#define FTRACE_ENTRY(name, struct_name, id, tstruct, print, filter) \
74+
#define FTRACE_ENTRY(name, struct_name, id, tstruct, print) \
7275
struct struct_name { \
7376
struct trace_entry ent; \
7477
tstruct \
7578
}
7679

7780
#undef FTRACE_ENTRY_DUP
78-
#define FTRACE_ENTRY_DUP(name, name_struct, id, tstruct, printk, filter)
81+
#define FTRACE_ENTRY_DUP(name, name_struct, id, tstruct, printk)
7982

8083
#undef FTRACE_ENTRY_REG
81-
#define FTRACE_ENTRY_REG(name, struct_name, id, tstruct, print, \
82-
filter, regfn) \
83-
FTRACE_ENTRY(name, struct_name, id, PARAMS(tstruct), PARAMS(print), \
84-
filter)
84+
#define FTRACE_ENTRY_REG(name, struct_name, id, tstruct, print, regfn) \
85+
FTRACE_ENTRY(name, struct_name, id, PARAMS(tstruct), PARAMS(print))
8586

8687
#undef FTRACE_ENTRY_PACKED
87-
#define FTRACE_ENTRY_PACKED(name, struct_name, id, tstruct, print, \
88-
filter) \
89-
FTRACE_ENTRY(name, struct_name, id, PARAMS(tstruct), PARAMS(print), \
90-
filter) __packed
88+
#define FTRACE_ENTRY_PACKED(name, struct_name, id, tstruct, print) \
89+
FTRACE_ENTRY(name, struct_name, id, PARAMS(tstruct), PARAMS(print)) __packed
9190

9291
#include "trace_entries.h"
9392

@@ -1899,17 +1898,15 @@ extern void tracing_log_err(struct trace_array *tr,
18991898
#define internal_trace_puts(str) __trace_puts(_THIS_IP_, str, strlen(str))
19001899

19011900
#undef FTRACE_ENTRY
1902-
#define FTRACE_ENTRY(call, struct_name, id, tstruct, print, filter) \
1901+
#define FTRACE_ENTRY(call, struct_name, id, tstruct, print) \
19031902
extern struct trace_event_call \
19041903
__aligned(4) event_##call;
19051904
#undef FTRACE_ENTRY_DUP
1906-
#define FTRACE_ENTRY_DUP(call, struct_name, id, tstruct, print, filter) \
1907-
FTRACE_ENTRY(call, struct_name, id, PARAMS(tstruct), PARAMS(print), \
1908-
filter)
1905+
#define FTRACE_ENTRY_DUP(call, struct_name, id, tstruct, print) \
1906+
FTRACE_ENTRY(call, struct_name, id, PARAMS(tstruct), PARAMS(print))
19091907
#undef FTRACE_ENTRY_PACKED
1910-
#define FTRACE_ENTRY_PACKED(call, struct_name, id, tstruct, print, filter) \
1911-
FTRACE_ENTRY(call, struct_name, id, PARAMS(tstruct), PARAMS(print), \
1912-
filter)
1908+
#define FTRACE_ENTRY_PACKED(call, struct_name, id, tstruct, print) \
1909+
FTRACE_ENTRY(call, struct_name, id, PARAMS(tstruct), PARAMS(print))
19131910

19141911
#include "trace_entries.h"
19151912

0 commit comments

Comments
 (0)