diff options
| author | Yonghong Song <yhs@fb.com> | 2017-11-30 16:47:55 -0500 |
|---|---|---|
| committer | Daniel Borkmann <daniel@iogearbox.net> | 2017-11-30 20:59:21 -0500 |
| commit | 0ec9552b43b98deb882bf48efd347be4bd7afc9f (patch) | |
| tree | a71ca8775603c52eb8c8d086f02505a3459f34b6 /samples | |
| parent | c8c088ba0edf65044c254b96fc438c91914aaab0 (diff) | |
samples/bpf: add error checking for perf ioctl calls in bpf loader
load_bpf_file() should fail if ioctl with command
PERF_EVENT_IOC_ENABLE and PERF_EVENT_IOC_SET_BPF fails.
When they do fail, proper error messages are printed.
With this change, the below "syscall_tp" run shows that
the maximum number of bpf progs attaching to the same
perf tracepoint is indeed enforced.
$ ./syscall_tp -i 64
prog #0: map ids 4 5
...
prog #63: map ids 382 383
$ ./syscall_tp -i 65
prog #0: map ids 4 5
...
prog #64: map ids 388 389
ioctl PERF_EVENT_IOC_SET_BPF failed err Argument list too long
Signed-off-by: Yonghong Song <yhs@fb.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Diffstat (limited to 'samples')
| -rw-r--r-- | samples/bpf/bpf_load.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/samples/bpf/bpf_load.c b/samples/bpf/bpf_load.c index 522ca9252d6c..242631aa4ea2 100644 --- a/samples/bpf/bpf_load.c +++ b/samples/bpf/bpf_load.c | |||
| @@ -193,8 +193,18 @@ static int load_and_attach(const char *event, struct bpf_insn *prog, int size) | |||
| 193 | return -1; | 193 | return -1; |
| 194 | } | 194 | } |
| 195 | event_fd[prog_cnt - 1] = efd; | 195 | event_fd[prog_cnt - 1] = efd; |
| 196 | ioctl(efd, PERF_EVENT_IOC_ENABLE, 0); | 196 | err = ioctl(efd, PERF_EVENT_IOC_ENABLE, 0); |
| 197 | ioctl(efd, PERF_EVENT_IOC_SET_BPF, fd); | 197 | if (err < 0) { |
| 198 | printf("ioctl PERF_EVENT_IOC_ENABLE failed err %s\n", | ||
| 199 | strerror(errno)); | ||
| 200 | return -1; | ||
| 201 | } | ||
| 202 | err = ioctl(efd, PERF_EVENT_IOC_SET_BPF, fd); | ||
| 203 | if (err < 0) { | ||
| 204 | printf("ioctl PERF_EVENT_IOC_SET_BPF failed err %s\n", | ||
| 205 | strerror(errno)); | ||
| 206 | return -1; | ||
| 207 | } | ||
| 198 | 208 | ||
| 199 | return 0; | 209 | return 0; |
| 200 | } | 210 | } |
