Commit a7e135fe authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull probes updates from Masami Hiramatsu:

 - probe-events: Add comments about entry data storing code to clarify
   where and how the entry data is stored for function return events.

 - probe-events: Log error for exceeding the number of arguments to help
   user to identify error reason via tracefs/error_log file.

 - Improve the ftracetest selftests:
    - Expand the tprobe event test to check if it can correctly find the
      wrong format tracepoint name.
    - Add new syntax error test to check whether error_log correctly
      indicates a wrong character in the tracepoint name.
    - Add a new dynamic events argument limitation test case which
      checks max number of probe arguments.

* tag 'probes-v6.15' of git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace:
  tracing: probe-events: Add comments about entry data storing code
  selftests/ftrace: Add dynamic events argument limitation test case
  selftests/ftrace: Add new syntax error test
  selftests/ftrace: Expand the tprobe event test to check wrong format
  tracing: probe-events: Log error for exceeding the number of arguments
parents dcf9f31c bb9c6020
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -913,6 +913,8 @@ static int __trace_eprobe_create(int argc, const char *argv[])
	}

	if (argc - 2 > MAX_TRACE_ARGS) {
		trace_probe_log_set_index(2);
		trace_probe_log_err(0, TOO_MANY_ARGS);
		ret = -E2BIG;
		goto error;
	}
+4 −1
Original line number Diff line number Diff line
@@ -1199,8 +1199,11 @@ static int trace_fprobe_create_internal(int argc, const char *argv[],
		argc = new_argc;
		argv = new_argv;
	}
	if (argc > MAX_TRACE_ARGS)
	if (argc > MAX_TRACE_ARGS) {
		trace_probe_log_set_index(2);
		trace_probe_log_err(0, TOO_MANY_ARGS);
		return -E2BIG;
	}

	ret = traceprobe_expand_dentry_args(argc, argv, &dbuf);
	if (ret)
+4 −1
Original line number Diff line number Diff line
@@ -1007,8 +1007,11 @@ static int trace_kprobe_create_internal(int argc, const char *argv[],
		argc = new_argc;
		argv = new_argv;
	}
	if (argc > MAX_TRACE_ARGS)
	if (argc > MAX_TRACE_ARGS) {
		trace_probe_log_set_index(2);
		trace_probe_log_err(0, TOO_MANY_ARGS);
		return -E2BIG;
	}

	ret = traceprobe_expand_dentry_args(argc, argv, &dbuf);
	if (ret)
+28 −0
Original line number Diff line number Diff line
@@ -770,6 +770,10 @@ static int check_prepare_btf_string_fetch(char *typename,

#ifdef CONFIG_HAVE_FUNCTION_ARG_ACCESS_API

/*
 * Add the entry code to store the 'argnum'th parameter and return the offset
 * in the entry data buffer where the data will be stored.
 */
static int __store_entry_arg(struct trace_probe *tp, int argnum)
{
	struct probe_entry_arg *earg = tp->entry_arg;
@@ -793,6 +797,20 @@ static int __store_entry_arg(struct trace_probe *tp, int argnum)
		tp->entry_arg = earg;
	}

	/*
	 * The entry code array is repeating the pair of
	 * [FETCH_OP_ARG(argnum)][FETCH_OP_ST_EDATA(offset of entry data buffer)]
	 * and the rest of entries are filled with [FETCH_OP_END].
	 *
	 * To reduce the redundant function parameter fetching, we scan the entry
	 * code array to find the FETCH_OP_ARG which already fetches the 'argnum'
	 * parameter. If it doesn't match, update 'offset' to find the last
	 * offset.
	 * If we find the FETCH_OP_END without matching FETCH_OP_ARG entry, we
	 * will save the entry with FETCH_OP_ARG and FETCH_OP_ST_EDATA, and
	 * return data offset so that caller can find the data offset in the entry
	 * data buffer.
	 */
	offset = 0;
	for (i = 0; i < earg->size - 1; i++) {
		switch (earg->code[i].op) {
@@ -826,6 +844,16 @@ int traceprobe_get_entry_data_size(struct trace_probe *tp)
	if (!earg)
		return 0;

	/*
	 * earg->code[] array has an operation sequence which is run in
	 * the entry handler.
	 * The sequence stopped by FETCH_OP_END and each data stored in
	 * the entry data buffer by FETCH_OP_ST_EDATA. The FETCH_OP_ST_EDATA
	 * stores the data at the data buffer + its offset, and all data are
	 * "unsigned long" size. The offset must be increased when a data is
	 * stored. Thus we need to find the last FETCH_OP_ST_EDATA in the
	 * code array.
	 */
	for (i = 0; i < earg->size; i++) {
		switch (earg->code[i].op) {
		case FETCH_OP_END:
+1 −0
Original line number Diff line number Diff line
@@ -545,6 +545,7 @@ extern int traceprobe_define_arg_fields(struct trace_event_call *event_call,
	C(BAD_BTF_TID,		"Failed to get BTF type info."),\
	C(BAD_TYPE4STR,		"This type does not fit for string."),\
	C(NEED_STRING_TYPE,	"$comm and immediate-string only accepts string type"),\
	C(TOO_MANY_ARGS,	"Too many arguments are specified"),	\
	C(TOO_MANY_EARGS,	"Too many entry arguments specified"),

#undef C
Loading