Merge tag 'probes-v6.10' of git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace
Pull probes updates from Masami Hiramatsu:
- tracing/probes: Add new pseudo-types %pd and %pD support for dumping
dentry name from 'struct dentry *' and file name from 'struct file *'
- uprobes performance optimizations:
- Speed up the BPF uprobe event by delaying the fetching of the
uprobe event arguments that are not used in BPF
- Avoid locking by speculatively checking whether uprobe event is
valid
- Reduce lock contention by using read/write_lock instead of
spinlock for uprobe list operation. This improved BPF uprobe
benchmark result 43% on average
- rethook: Remove non-fatal warning messages when tracing stack from
BPF and skip rcu_is_watching() validation in rethook if possible
- objpool: Optimize objpool (which is used by kretprobes and fprobe as
rethook backend storage) by inlining functions and avoid caching
nr_cpu_ids because it is a const value
- fprobe: Add entry/exit callbacks types (code cleanup)
- kprobes: Check ftrace was killed in kprobes if it uses ftrace
* tag 'probes-v6.10' of git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace:
kprobe/ftrace: bail out if ftrace was killed
selftests/ftrace: Fix required features for VFS type test case
objpool: cache nr_possible_cpus() and avoid caching nr_cpu_ids
objpool: enable inlining objpool_push() and objpool_pop() operations
rethook: honor CONFIG_FTRACE_VALIDATE_RCU_IS_WATCHING in rethook_try_get()
ftrace: make extra rcu_is_watching() validation check optional
uprobes: reduce contention on uprobes_tree access
rethook: Remove warning messages printed for finding return address of a frame.
fprobe: Add entry/exit callbacks types
selftests/ftrace: add fprobe test cases for VFS type "%pd" and "%pD"
selftests/ftrace: add kprobe test cases for VFS type "%pd" and "%pD"
Documentation: tracing: add new type '%pd' and '%pD' for kprobe
tracing/probes: support '%pD' type for print struct file's name
tracing/probes: support '%pd' type for print struct dentry's name
uprobes: add speculative lockless system-wide uprobe filter check
uprobes: prepare uprobe args buffer lazily
uprobes: encapsulate preparation of uprobe args buffer
This commit is contained in:
commit
70a663205d
26 files changed
+406
-176
No files matched your search
@@ -12,6 +12,7 @@
|
||||
#define pr_fmt(fmt) "trace_probe: " fmt
|
||||
|
||||
#include <linux/bpf.h>
|
||||
#include <linux/fs.h>
|
||||
#include "trace_btf.h"
|
||||
|
||||
#include "trace_probe.h"
|
||||
@@ -1737,6 +1738,68 @@ error:
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
|
||||
/* @buf: *buf must be equal to NULL. Caller must to free *buf */
|
||||
int traceprobe_expand_dentry_args(int argc, const char *argv[], char **buf)
|
||||
{
|
||||
int i, used, ret;
|
||||
const int bufsize = MAX_DENTRY_ARGS_LEN;
|
||||
char *tmpbuf = NULL;
|
||||
|
||||
if (*buf)
|
||||
return -EINVAL;
|
||||
|
||||
used = 0;
|
||||
for (i = 0; i < argc; i++) {
|
||||
char *tmp;
|
||||
char *equal;
|
||||
size_t arg_len;
|
||||
|
||||
if (!glob_match("*:%p[dD]", argv[i]))
|
||||
continue;
|
||||
|
||||
if (!tmpbuf) {
|
||||
tmpbuf = kmalloc(bufsize, GFP_KERNEL);
|
||||
if (!tmpbuf)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
tmp = kstrdup(argv[i], GFP_KERNEL);
|
||||
if (!tmp)
|
||||
goto nomem;
|
||||
|
||||
equal = strchr(tmp, '=');
|
||||
if (equal)
|
||||
*equal = '\0';
|
||||
arg_len = strlen(argv[i]);
|
||||
tmp[arg_len - 4] = '\0';
|
||||
if (argv[i][arg_len - 1] == 'd')
|
||||
ret = snprintf(tmpbuf + used, bufsize - used,
|
||||
"%s%s+0x0(+0x%zx(%s)):string",
|
||||
equal ? tmp : "", equal ? "=" : "",
|
||||
offsetof(struct dentry, d_name.name),
|
||||
equal ? equal + 1 : tmp);
|
||||
else
|
||||
ret = snprintf(tmpbuf + used, bufsize - used,
|
||||
"%s%s+0x0(+0x%zx(+0x%zx(%s))):string",
|
||||
equal ? tmp : "", equal ? "=" : "",
|
||||
offsetof(struct dentry, d_name.name),
|
||||
offsetof(struct file, f_path.dentry),
|
||||
equal ? equal + 1 : tmp);
|
||||
|
||||
kfree(tmp);
|
||||
if (ret >= bufsize - used)
|
||||
goto nomem;
|
||||
argv[i] = tmpbuf + used;
|
||||
used += ret + 1;
|
||||
}
|
||||
|
||||
*buf = tmpbuf;
|
||||
return 0;
|
||||
nomem:
|
||||
kfree(tmpbuf);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
void traceprobe_finish_parse(struct traceprobe_parse_context *ctx)
|
||||
{
|
||||
clear_btf_context(ctx);
|
||||
|
||||
Reference in new issue
Block a user