diff options
author | Stanislav Fomichev <sdf@google.com> | 2020-07-07 01:01:25 +0200 |
---|---|---|
committer | Daniel Borkmann <daniel@iogearbox.net> | 2020-07-08 01:03:31 +0200 |
commit | f5836749c9c04a10decd2742845ad4870965fdef (patch) | |
tree | 44335764c2ebba2099ba8bf26267bdfac7c36ed1 /net | |
parent | mvpp2: fix pointer check (diff) | |
download | linux-f5836749c9c04a10decd2742845ad4870965fdef.tar.xz linux-f5836749c9c04a10decd2742845ad4870965fdef.zip |
bpf: Add BPF_CGROUP_INET_SOCK_RELEASE hook
Sometimes it's handy to know when the socket gets freed. In
particular, we'd like to try to use a smarter allocation of
ports for bpf_bind and explore the possibility of limiting
the number of SOCK_DGRAM sockets the process can have.
Implement BPF_CGROUP_INET_SOCK_RELEASE hook that triggers on
inet socket release. It triggers only for userspace sockets
(not in-kernel ones) and therefore has the same semantics as
the existing BPF_CGROUP_INET_SOCK_CREATE.
Signed-off-by: Stanislav Fomichev <sdf@google.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Andrii Nakryiko <andriin@fb.com>
Link: https://lore.kernel.org/bpf/20200706230128.4073544-2-sdf@google.com
Diffstat (limited to 'net')
-rw-r--r-- | net/core/filter.c | 1 | ||||
-rw-r--r-- | net/ipv4/af_inet.c | 3 |
2 files changed, 4 insertions, 0 deletions
diff --git a/net/core/filter.c b/net/core/filter.c index c5e696e6c315..ddcc0d6209e1 100644 --- a/net/core/filter.c +++ b/net/core/filter.c @@ -6890,6 +6890,7 @@ static bool __sock_filter_check_attach_type(int off, case offsetof(struct bpf_sock, priority): switch (attach_type) { case BPF_CGROUP_INET_SOCK_CREATE: + case BPF_CGROUP_INET_SOCK_RELEASE: goto full_access; default: return false; diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c index ea6ed6d487ed..ff141d630bdf 100644 --- a/net/ipv4/af_inet.c +++ b/net/ipv4/af_inet.c @@ -411,6 +411,9 @@ int inet_release(struct socket *sock) if (sk) { long timeout; + if (!sk->sk_kern_sock) + BPF_CGROUP_RUN_PROG_INET_SOCK_RELEASE(sk); + /* Applications forget to leave groups before exiting */ ip_mc_drop_socket(sk); |