Commit 02413cab authored by Daniel Borkmann's avatar Daniel Borkmann Committed by David S. Miller

bpf, samples: don't zero data when not needed

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: default avatarDaniel Borkmann <daniel@iogearbox.net>
Acked-by: default avatarAlexei Starovoitov <ast@kernel.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 074f528e
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
#include <linux/version.h> #include <linux/version.h>
#include <linux/sched.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 #define MINBLOCK_US 1
...@@ -61,7 +61,7 @@ SEC("kprobe/try_to_wake_up") ...@@ -61,7 +61,7 @@ SEC("kprobe/try_to_wake_up")
int waker(struct pt_regs *ctx) int waker(struct pt_regs *ctx)
{ {
struct task_struct *p = (void *) PT_REGS_PARM1(ctx); struct task_struct *p = (void *) PT_REGS_PARM1(ctx);
struct wokeby_t woke = {}; struct wokeby_t woke;
u32 pid; u32 pid;
pid = _(p->pid); pid = _(p->pid);
...@@ -75,17 +75,19 @@ int waker(struct pt_regs *ctx) ...@@ -75,17 +75,19 @@ int waker(struct pt_regs *ctx)
static inline int update_counts(void *ctx, u32 pid, u64 delta) static inline int update_counts(void *ctx, u32 pid, u64 delta)
{ {
struct key_t key = {};
struct wokeby_t *woke; struct wokeby_t *woke;
u64 zero = 0, *val; 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)); bpf_get_current_comm(&key.target, sizeof(key.target));
key.tret = bpf_get_stackid(ctx, &stackmap, STACKID_FLAGS); key.tret = bpf_get_stackid(ctx, &stackmap, STACKID_FLAGS);
key.wret = 0;
woke = bpf_map_lookup_elem(&wokeby, &pid); woke = bpf_map_lookup_elem(&wokeby, &pid);
if (woke) { if (woke) {
key.wret = woke->ret; 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); bpf_map_delete_elem(&wokeby, &pid);
} }
......
...@@ -23,16 +23,14 @@ int bpf_prog1(struct pt_regs *ctx) ...@@ -23,16 +23,14 @@ int bpf_prog1(struct pt_regs *ctx)
/* attaches to kprobe netif_receive_skb, /* attaches to kprobe netif_receive_skb,
* looks for packets on loobpack device and prints them * looks for packets on loobpack device and prints them
*/ */
char devname[IFNAMSIZ] = {}; char devname[IFNAMSIZ];
struct net_device *dev; struct net_device *dev;
struct sk_buff *skb; struct sk_buff *skb;
int len; int len;
/* non-portable! works for the given kernel only */ /* non-portable! works for the given kernel only */
skb = (struct sk_buff *) PT_REGS_PARM1(ctx); skb = (struct sk_buff *) PT_REGS_PARM1(ctx);
dev = _(skb->dev); dev = _(skb->dev);
len = _(skb->len); len = _(skb->len);
bpf_probe_read(devname, sizeof(devname), dev->name); bpf_probe_read(devname, sizeof(devname), dev->name);
......
...@@ -66,7 +66,7 @@ struct hist_key { ...@@ -66,7 +66,7 @@ struct hist_key {
char comm[16]; char comm[16];
u64 pid_tgid; u64 pid_tgid;
u64 uid_gid; u64 uid_gid;
u32 index; u64 index;
}; };
struct bpf_map_def SEC("maps") my_hist_map = { struct bpf_map_def SEC("maps") my_hist_map = {
...@@ -82,7 +82,7 @@ int bpf_prog3(struct pt_regs *ctx) ...@@ -82,7 +82,7 @@ int bpf_prog3(struct pt_regs *ctx)
long write_size = PT_REGS_PARM3(ctx); long write_size = PT_REGS_PARM3(ctx);
long init_val = 1; long init_val = 1;
long *value; long *value;
struct hist_key key = {}; struct hist_key key;
key.index = log2l(write_size); key.index = log2l(write_size);
key.pid_tgid = bpf_get_current_pid_tgid(); key.pid_tgid = bpf_get_current_pid_tgid();
......
...@@ -22,7 +22,7 @@ struct bpf_map_def SEC("maps") progs = { ...@@ -22,7 +22,7 @@ struct bpf_map_def SEC("maps") progs = {
SEC("kprobe/seccomp_phase1") SEC("kprobe/seccomp_phase1")
int bpf_prog1(struct pt_regs *ctx) 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)); bpf_probe_read(&sd, sizeof(sd), (void *)PT_REGS_PARM1(ctx));
...@@ -40,7 +40,7 @@ int bpf_prog1(struct pt_regs *ctx) ...@@ -40,7 +40,7 @@ int bpf_prog1(struct pt_regs *ctx)
/* we jump here when syscall number == __NR_write */ /* we jump here when syscall number == __NR_write */
PROG(__NR_write)(struct pt_regs *ctx) 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)); bpf_probe_read(&sd, sizeof(sd), (void *)PT_REGS_PARM1(ctx));
if (sd.args[2] == 512) { if (sd.args[2] == 512) {
...@@ -53,7 +53,7 @@ PROG(__NR_write)(struct pt_regs *ctx) ...@@ -53,7 +53,7 @@ PROG(__NR_write)(struct pt_regs *ctx)
PROG(__NR_read)(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)); bpf_probe_read(&sd, sizeof(sd), (void *)PT_REGS_PARM1(ctx));
if (sd.args[2] > 128 && sd.args[2] <= 1024) { if (sd.args[2] > 128 && sd.args[2] <= 1024) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment