Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

samples/bpf, selftests/bpf: Use bpf_probe_read_kernel

A handful of samples and selftests fail to build on s390, because
after commit 0ebeea8ca8a4 ("bpf: Restrict bpf_probe_read{, str}()
only to archs where they work") bpf_probe_read is not available
anymore.

Fix by using bpf_probe_read_kernel.

Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Link: https://lore.kernel.org/bpf/20200720114806.88823-1-iii@linux.ibm.com

authored by

Ilya Leoshkevich and committed by
Alexei Starovoitov
e4d9c232 6bd55727

+33 -16
+6 -1
samples/bpf/offwaketime_kern.c
··· 12 12 #include <bpf/bpf_helpers.h> 13 13 #include <bpf/bpf_tracing.h> 14 14 15 - #define _(P) ({typeof(P) val; bpf_probe_read(&val, sizeof(val), &P); val;}) 15 + #define _(P) \ 16 + ({ \ 17 + typeof(P) val; \ 18 + bpf_probe_read_kernel(&val, sizeof(val), &(P)); \ 19 + val; \ 20 + }) 16 21 17 22 #define MINBLOCK_US 1 18 23
+9 -3
samples/bpf/test_overhead_kprobe_kern.c
··· 10 10 #include <bpf/bpf_helpers.h> 11 11 #include <bpf/bpf_tracing.h> 12 12 13 - #define _(P) ({typeof(P) val = 0; bpf_probe_read(&val, sizeof(val), &P); val;}) 13 + #define _(P) \ 14 + ({ \ 15 + typeof(P) val = 0; \ 16 + bpf_probe_read_kernel(&val, sizeof(val), &(P)); \ 17 + val; \ 18 + }) 14 19 15 20 SEC("kprobe/__set_task_comm") 16 21 int prog(struct pt_regs *ctx) ··· 30 25 tsk = (void *)PT_REGS_PARM1(ctx); 31 26 32 27 pid = _(tsk->pid); 33 - bpf_probe_read(oldcomm, sizeof(oldcomm), &tsk->comm); 34 - bpf_probe_read(newcomm, sizeof(newcomm), (void *)PT_REGS_PARM2(ctx)); 28 + bpf_probe_read_kernel(oldcomm, sizeof(oldcomm), &tsk->comm); 29 + bpf_probe_read_kernel(newcomm, sizeof(newcomm), 30 + (void *)PT_REGS_PARM2(ctx)); 35 31 signal = _(tsk->signal); 36 32 oom_score_adj = _(signal->oom_score_adj); 37 33 return 0;
+7 -2
samples/bpf/tracex1_kern.c
··· 11 11 #include <bpf/bpf_helpers.h> 12 12 #include <bpf/bpf_tracing.h> 13 13 14 - #define _(P) ({typeof(P) val = 0; bpf_probe_read(&val, sizeof(val), &P); val;}) 14 + #define _(P) \ 15 + ({ \ 16 + typeof(P) val = 0; \ 17 + bpf_probe_read_kernel(&val, sizeof(val), &(P)); \ 18 + val; \ 19 + }) 15 20 16 21 /* kprobe is NOT a stable ABI 17 22 * kernel functions can be removed, renamed or completely change semantics. ··· 39 34 dev = _(skb->dev); 40 35 len = _(skb->len); 41 36 42 - bpf_probe_read(devname, sizeof(devname), dev->name); 37 + bpf_probe_read_kernel(devname, sizeof(devname), dev->name); 43 38 44 39 if (devname[0] == 'l' && devname[1] == 'o') { 45 40 char fmt[] = "skb %p len %d\n";
+2 -2
samples/bpf/tracex5_kern.c
··· 47 47 { 48 48 struct seccomp_data sd; 49 49 50 - bpf_probe_read(&sd, sizeof(sd), (void *)PT_REGS_PARM2(ctx)); 50 + bpf_probe_read_kernel(&sd, sizeof(sd), (void *)PT_REGS_PARM2(ctx)); 51 51 if (sd.args[2] == 512) { 52 52 char fmt[] = "write(fd=%d, buf=%p, size=%d)\n"; 53 53 bpf_trace_printk(fmt, sizeof(fmt), ··· 60 60 { 61 61 struct seccomp_data sd; 62 62 63 - bpf_probe_read(&sd, sizeof(sd), (void *)PT_REGS_PARM2(ctx)); 63 + bpf_probe_read_kernel(&sd, sizeof(sd), (void *)PT_REGS_PARM2(ctx)); 64 64 if (sd.args[2] > 128 && sd.args[2] <= 1024) { 65 65 char fmt[] = "read(fd=%d, buf=%p, size=%d)\n"; 66 66 bpf_trace_printk(fmt, sizeof(fmt),
+2 -1
tools/bpf/bpftool/skeleton/pid_iter.bpf.c
··· 71 71 72 72 e.pid = task->tgid; 73 73 e.id = get_obj_id(file->private_data, obj_type); 74 - bpf_probe_read(&e.comm, sizeof(e.comm), task->group_leader->comm); 74 + bpf_probe_read_kernel(&e.comm, sizeof(e.comm), 75 + task->group_leader->comm); 75 76 bpf_seq_write(ctx->meta->seq, &e, sizeof(e)); 76 77 77 78 return 0;
+3 -3
tools/testing/selftests/bpf/progs/bpf_iter_netlink.c
··· 36 36 if (!nlk->groups) { 37 37 group = 0; 38 38 } else { 39 - /* FIXME: temporary use bpf_probe_read here, needs 39 + /* FIXME: temporary use bpf_probe_read_kernel here, needs 40 40 * verifier support to do direct access. 41 41 */ 42 - bpf_probe_read(&group, sizeof(group), &nlk->groups[0]); 42 + bpf_probe_read_kernel(&group, sizeof(group), &nlk->groups[0]); 43 43 } 44 44 BPF_SEQ_PRINTF(seq, "%-10u %08x %-8d %-8d %-5d %-8d ", 45 45 nlk->portid, (u32)group, ··· 56 56 * with current verifier. 57 57 */ 58 58 inode = SOCK_INODE(sk); 59 - bpf_probe_read(&ino, sizeof(ino), &inode->i_ino); 59 + bpf_probe_read_kernel(&ino, sizeof(ino), &inode->i_ino); 60 60 } 61 61 BPF_SEQ_PRINTF(seq, "%-8u %-8lu\n", s->sk_drops.counter, ino); 62 62
+1 -1
tools/testing/selftests/bpf/progs/bpf_iter_tcp4.c
··· 57 57 return 0; 58 58 59 59 inode = &container_of(sk_socket, struct socket_alloc, socket)->vfs_inode; 60 - bpf_probe_read(&ino, sizeof(ino), &inode->i_ino); 60 + bpf_probe_read_kernel(&ino, sizeof(ino), &inode->i_ino); 61 61 return ino; 62 62 } 63 63
+1 -1
tools/testing/selftests/bpf/progs/bpf_iter_tcp6.c
··· 57 57 return 0; 58 58 59 59 inode = &container_of(sk_socket, struct socket_alloc, socket)->vfs_inode; 60 - bpf_probe_read(&ino, sizeof(ino), &inode->i_ino); 60 + bpf_probe_read_kernel(&ino, sizeof(ino), &inode->i_ino); 61 61 return ino; 62 62 } 63 63
+1 -1
tools/testing/selftests/bpf/progs/bpf_iter_udp4.c
··· 18 18 return 0; 19 19 20 20 inode = &container_of(sk_socket, struct socket_alloc, socket)->vfs_inode; 21 - bpf_probe_read(&ino, sizeof(ino), &inode->i_ino); 21 + bpf_probe_read_kernel(&ino, sizeof(ino), &inode->i_ino); 22 22 return ino; 23 23 } 24 24
+1 -1
tools/testing/selftests/bpf/progs/bpf_iter_udp6.c
··· 25 25 return 0; 26 26 27 27 inode = &container_of(sk_socket, struct socket_alloc, socket)->vfs_inode; 28 - bpf_probe_read(&ino, sizeof(ino), &inode->i_ino); 28 + bpf_probe_read_kernel(&ino, sizeof(ino), &inode->i_ino); 29 29 return ino; 30 30 } 31 31