diff options
author | Stanislav Fomichev <sdf@google.com> | 2021-01-15 08:35:00 -0800 |
---|---|---|
committer | Alexei Starovoitov <ast@kernel.org> | 2021-01-20 14:23:00 -0800 |
commit | 20f2505fb436cfa674cf1f46aaa624f44d3d1d03 (patch) | |
tree | b23cdf6802d5b1f3952551c9648926450af095cd /include/linux/filter.h | |
parent | 9cacf81f8161111db25f98e78a7a0e32ae142b3f (diff) | |
download | linux-stable-20f2505fb436cfa674cf1f46aaa624f44d3d1d03.tar.gz linux-stable-20f2505fb436cfa674cf1f46aaa624f44d3d1d03.tar.bz2 linux-stable-20f2505fb436cfa674cf1f46aaa624f44d3d1d03.zip |
bpf: Try to avoid kzalloc in cgroup/{s,g}etsockopt
When we attach a bpf program to cgroup/getsockopt any other getsockopt()
syscall starts incurring kzalloc/kfree cost.
Let add a small buffer on the stack and use it for small (majority)
{s,g}etsockopt values. The buffer is small enough to fit into
the cache line and cover the majority of simple options (most
of them are 4 byte ints).
It seems natural to do the same for setsockopt, but it's a bit more
involved when the BPF program modifies the data (where we have to
kmalloc). The assumption is that for the majority of setsockopt
calls (which are doing pure BPF options or apply policy) this
will bring some benefit as well.
Without this patch (we remove about 1% __kmalloc):
3.38% 0.07% tcp_mmap [kernel.kallsyms] [k] __cgroup_bpf_run_filter_getsockopt
|
--3.30%--__cgroup_bpf_run_filter_getsockopt
|
--0.81%--__kmalloc
Signed-off-by: Stanislav Fomichev <sdf@google.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Acked-by: Martin KaFai Lau <kafai@fb.com>
Link: https://lore.kernel.org/bpf/20210115163501.805133-3-sdf@google.com
Diffstat (limited to 'include/linux/filter.h')
-rw-r--r-- | include/linux/filter.h | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/include/linux/filter.h b/include/linux/filter.h index 7fdce5407214..5b3137d7b690 100644 --- a/include/linux/filter.h +++ b/include/linux/filter.h @@ -1298,6 +1298,11 @@ struct bpf_sysctl_kern { u64 tmp_reg; }; +#define BPF_SOCKOPT_KERN_BUF_SIZE 32 +struct bpf_sockopt_buf { + u8 data[BPF_SOCKOPT_KERN_BUF_SIZE]; +}; + struct bpf_sockopt_kern { struct sock *sk; u8 *optval; |