]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
inet_diag: add cgroup id attribute
authorDmitry Yakunin <zeil@yandex-team.ru>
Thu, 30 Apr 2020 15:51:14 +0000 (18:51 +0300)
committerDavid S. Miller <davem@davemloft.net>
Thu, 30 Apr 2020 19:54:01 +0000 (12:54 -0700)
This patch adds cgroup v2 ID to common inet diag message attributes.
Cgroup v2 ID is kernfs ID (ino or ino+gen). This attribute allows filter
inet diag output by cgroup ID obtained by name_to_handle_at() syscall.
When net_cls or net_prio cgroup is activated this ID is equal to 1 (root
cgroup ID) for newly created sockets.

Some notes about this ID:

1) gets initialized in socket() syscall
2) incoming socket gets ID from listening socket
   (not during accept() syscall)
3) not changed when process get moved to another cgroup
4) can point to deleted cgroup (refcounting)

v2:
  - use CONFIG_SOCK_CGROUP_DATA instead if CONFIG_CGROUPS

v3:
  - fix attr size by using nla_total_size_64bit() (Eric Dumazet)
  - more detailed commit message (Konstantin Khlebnikov)

Signed-off-by: Dmitry Yakunin <zeil@yandex-team.ru>
Reviewed-by: Konstantin Khlebnikov <khlebnikov@yandex-team.ru>
Acked-By: Tejun Heo <tj@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/inet_diag.h
include/uapi/linux/inet_diag.h
net/ipv4/inet_diag.c

index ce9ed1c0602f971a8eccefcc98d64dd3a3ee697a..0ef2d800fda7256d70ee82e8e4c17a5203ce8d45 100644 (file)
@@ -71,7 +71,11 @@ static inline size_t inet_diag_msg_attrs_size(void)
                + nla_total_size(1)  /* INET_DIAG_SKV6ONLY */
 #endif
                + nla_total_size(4)  /* INET_DIAG_MARK */
-               + nla_total_size(4); /* INET_DIAG_CLASS_ID */
+               + nla_total_size(4)  /* INET_DIAG_CLASS_ID */
+#ifdef CONFIG_SOCK_CGROUP_DATA
+               + nla_total_size_64bit(sizeof(u64))  /* INET_DIAG_CGROUP_ID */
+#endif
+               ;
 }
 int inet_diag_msg_attrs_fill(struct sock *sk, struct sk_buff *skb,
                             struct inet_diag_msg *r, int ext,
index 57cc429a9177bec4fe49feeb71562b68cdf6aba1..c9b1e551792c64a1d376264634331e8906114a14 100644 (file)
@@ -157,6 +157,7 @@ enum {
        INET_DIAG_MD5SIG,
        INET_DIAG_ULP_INFO,
        INET_DIAG_SK_BPF_STORAGES,
+       INET_DIAG_CGROUP_ID,
        __INET_DIAG_MAX,
 };
 
index 5d50aad3cdbf420b4fd8baa8429f213d1846fa55..9c4c315cbc1023703d1ca4133cbfd5d50e222595 100644 (file)
@@ -162,6 +162,13 @@ int inet_diag_msg_attrs_fill(struct sock *sk, struct sk_buff *skb,
                        goto errout;
        }
 
+#ifdef CONFIG_SOCK_CGROUP_DATA
+       if (nla_put_u64_64bit(skb, INET_DIAG_CGROUP_ID,
+                             cgroup_id(sock_cgroup_ptr(&sk->sk_cgrp_data)),
+                             INET_DIAG_PAD))
+               goto errout;
+#endif
+
        r->idiag_uid = from_kuid_munged(user_ns, sock_i_uid(sk));
        r->idiag_inode = sock_i_ino(sk);