forked from Minki/linux
5722569bb9
Enable helpers to directly access a map element value by passing a
register type PTR_TO_MAP_VALUE (or PTR_TO_MAP_VALUE_ADJ) to helper
arguments ARG_PTR_TO_STACK or ARG_PTR_TO_RAW_STACK.
This enables several use cases. For example, a typical tracing program
might want to capture pathnames passed to sys_open() with:
struct trace_data {
char pathname[PATHLEN];
};
SEC("kprobe/sys_open")
void bpf_sys_open(struct pt_regs *ctx)
{
struct trace_data data;
bpf_probe_read(data.pathname, sizeof(data.pathname), ctx->di);
/* consume data.pathname, for example via
* bpf_trace_printk() or bpf_perf_event_output()
*/
}
Such a program could easily hit the stack limit in case PATHLEN needs to
be large or more local variables need to exist, both of which are quite
common scenarios. Allowing direct helper access to map element values,
one could do:
struct bpf_map_def SEC("maps") scratch_map = {
.type = BPF_MAP_TYPE_PERCPU_ARRAY,
.key_size = sizeof(u32),
.value_size = sizeof(struct trace_data),
.max_entries = 1,
};
SEC("kprobe/sys_open")
int bpf_sys_open(struct pt_regs *ctx)
{
int id = 0;
struct trace_data *p = bpf_map_lookup_elem(&scratch_map, &id);
if (!p)
return;
bpf_probe_read(p->pathname, sizeof(p->pathname), ctx->di);
/* consume p->pathname, for example via
* bpf_trace_printk() or bpf_perf_event_output()
*/
}
And wouldn't risk exhausting the stack.
Code changes are loosely modeled after commit
|
||
---|---|---|
.. | ||
bpf | ||
breakpoints | ||
capabilities | ||
cpu-hotplug | ||
drivers/gpu | ||
efivarfs | ||
exec | ||
filesystems | ||
firmware | ||
ftrace | ||
futex | ||
gpio | ||
ia64 | ||
intel_pstate | ||
ipc | ||
kcmp | ||
lib | ||
media_tests | ||
membarrier | ||
memfd | ||
memory-hotplug | ||
mount | ||
mqueue | ||
net | ||
networking/timestamping | ||
nsfs | ||
ntb | ||
powerpc | ||
prctl | ||
pstore | ||
ptp | ||
ptrace | ||
rcutorture | ||
seccomp | ||
sigaltstack | ||
size | ||
static_keys | ||
sync | ||
sysctl | ||
timers | ||
user | ||
vDSO | ||
vm | ||
watchdog | ||
x86 | ||
zram | ||
.gitignore | ||
gen_kselftest_tar.sh | ||
kselftest_install.sh | ||
kselftest.h | ||
lib.mk | ||
Makefile |