bpf, samples: don't zero data when not needed
authorDaniel Borkmann <daniel@iogearbox.net>
Tue, 12 Apr 2016 22:10:53 +0000 (00:10 +0200)
committerDavid S. Miller <davem@davemloft.net>
Fri, 15 Apr 2016 01:40:42 +0000 (21:40 -0400)
Remove the zero initialization in the sample programs where appropriate.
Note that this is an optimization which is now possible, old programs
still doing the zero initialization are just fine as well. Also, make
sure we don't have padding issues when we don't memset() the entire
struct anymore.

Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Alexei Starovoitov <ast@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
samples/bpf/offwaketime_kern.c
samples/bpf/tracex1_kern.c
samples/bpf/tracex2_kern.c
samples/bpf/tracex5_kern.c

index 983629a31c79f6c4d0b4a00808d202cabe45c114..e7d9a0a3d45b12cfa68ace224be590709aba2008 100644 (file)
@@ -11,7 +11,7 @@
 #include <linux/version.h>
 #include <linux/sched.h>
 
-#define _(P) ({typeof(P) val = 0; bpf_probe_read(&val, sizeof(val), &P); val;})
+#define _(P) ({typeof(P) val; bpf_probe_read(&val, sizeof(val), &P); val;})
 
 #define MINBLOCK_US    1
 
@@ -61,7 +61,7 @@ SEC("kprobe/try_to_wake_up")
 int waker(struct pt_regs *ctx)
 {
        struct task_struct *p = (void *) PT_REGS_PARM1(ctx);
-       struct wokeby_t woke = {};
+       struct wokeby_t woke;
        u32 pid;
 
        pid = _(p->pid);
@@ -75,17 +75,19 @@ int waker(struct pt_regs *ctx)
 
 static inline int update_counts(void *ctx, u32 pid, u64 delta)
 {
-       struct key_t key = {};
        struct wokeby_t *woke;
        u64 zero = 0, *val;
+       struct key_t key;
 
+       __builtin_memset(&key.waker, 0, sizeof(key.waker));
        bpf_get_current_comm(&key.target, sizeof(key.target));
        key.tret = bpf_get_stackid(ctx, &stackmap, STACKID_FLAGS);
+       key.wret = 0;
 
        woke = bpf_map_lookup_elem(&wokeby, &pid);
        if (woke) {
                key.wret = woke->ret;
-               __builtin_memcpy(&key.waker, woke->name, TASK_COMM_LEN);
+               __builtin_memcpy(&key.waker, woke->name, sizeof(key.waker));
                bpf_map_delete_elem(&wokeby, &pid);
        }
 
index 3f450a8fa1f3487b2cf2d9b261f63dc3d25f6599..107da148820fc6cdaadcd6e55ab38b8fa78015b5 100644 (file)
@@ -23,16 +23,14 @@ int bpf_prog1(struct pt_regs *ctx)
        /* attaches to kprobe netif_receive_skb,
         * looks for packets on loobpack device and prints them
         */
-       char devname[IFNAMSIZ] = {};
+       char devname[IFNAMSIZ];
        struct net_device *dev;
        struct sk_buff *skb;
        int len;
 
        /* non-portable! works for the given kernel only */
        skb = (struct sk_buff *) PT_REGS_PARM1(ctx);
-
        dev = _(skb->dev);
-
        len = _(skb->len);
 
        bpf_probe_read(devname, sizeof(devname), dev->name);
index 6d6eefd0d4655ed3bdcebe6bf1956a7f43a70d27..5e11c20ce5ecd9558c4a01f34ad7f994e3418809 100644 (file)
@@ -66,7 +66,7 @@ struct hist_key {
        char comm[16];
        u64 pid_tgid;
        u64 uid_gid;
-       u32 index;
+       u64 index;
 };
 
 struct bpf_map_def SEC("maps") my_hist_map = {
@@ -82,7 +82,7 @@ int bpf_prog3(struct pt_regs *ctx)
        long write_size = PT_REGS_PARM3(ctx);
        long init_val = 1;
        long *value;
-       struct hist_key key = {};
+       struct hist_key key;
 
        key.index = log2l(write_size);
        key.pid_tgid = bpf_get_current_pid_tgid();
index b3f4295bf288536c1f9ae7500b542a77cf8aaec1..f95f232cbab9e308cd65396e1a1f85d3ac9544b9 100644 (file)
@@ -22,7 +22,7 @@ struct bpf_map_def SEC("maps") progs = {
 SEC("kprobe/seccomp_phase1")
 int bpf_prog1(struct pt_regs *ctx)
 {
-       struct seccomp_data sd = {};
+       struct seccomp_data sd;
 
        bpf_probe_read(&sd, sizeof(sd), (void *)PT_REGS_PARM1(ctx));
 
@@ -40,7 +40,7 @@ int bpf_prog1(struct pt_regs *ctx)
 /* we jump here when syscall number == __NR_write */
 PROG(__NR_write)(struct pt_regs *ctx)
 {
-       struct seccomp_data sd = {};
+       struct seccomp_data sd;
 
        bpf_probe_read(&sd, sizeof(sd), (void *)PT_REGS_PARM1(ctx));
        if (sd.args[2] == 512) {
@@ -53,7 +53,7 @@ PROG(__NR_write)(struct pt_regs *ctx)
 
 PROG(__NR_read)(struct pt_regs *ctx)
 {
-       struct seccomp_data sd = {};
+       struct seccomp_data sd;
 
        bpf_probe_read(&sd, sizeof(sd), (void *)PT_REGS_PARM1(ctx));
        if (sd.args[2] > 128 && sd.args[2] <= 1024) {