]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
net: introduce sk_forward_alloc_get()
authorPaolo Abeni <pabeni@redhat.com>
Tue, 26 Oct 2021 23:29:14 +0000 (16:29 -0700)
committerJakub Kicinski <kuba@kernel.org>
Thu, 28 Oct 2021 01:20:29 +0000 (18:20 -0700)
A later patch will change the MPTCP memory accounting schema
in such a way that MPTCP sockets will encode the total amount of
forward allocated memory in two separate fields (one for tx and
one for rx).

MPTCP sockets will use their own helper to provide the accurate
amount of fwd allocated memory.

To allow the above, this patch adds a new, optional, sk method to
fetch the fwd memory, wrap the call in a new helper and use it
where it is appropriate.

Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
include/net/sock.h
net/ipv4/af_inet.c
net/ipv4/inet_diag.c
net/sched/em_meta.c

index df0e0efb18826a621882da08f454b432a4114a95..4f0280ad6c23e71e932bb66f476df5754ccfa157 100644 (file)
@@ -1210,6 +1210,8 @@ struct proto {
        unsigned int            inuse_idx;
 #endif
 
+       int                     (*forward_alloc_get)(const struct sock *sk);
+
        bool                    (*stream_memory_free)(const struct sock *sk, int wake);
        bool                    (*stream_memory_read)(const struct sock *sk);
        /* Memory pressure */
@@ -1217,6 +1219,7 @@ struct proto {
        void                    (*leave_memory_pressure)(struct sock *sk);
        atomic_long_t           *memory_allocated;      /* Current allocated memory. */
        struct percpu_counter   *sockets_allocated;     /* Current number of sockets. */
+
        /*
         * Pressure flag: try to collapse.
         * Technical note: it is used by multiple contexts non atomically.
@@ -1294,6 +1297,14 @@ static inline void sk_refcnt_debug_release(const struct sock *sk)
 
 INDIRECT_CALLABLE_DECLARE(bool tcp_stream_memory_free(const struct sock *sk, int wake));
 
+static inline int sk_forward_alloc_get(const struct sock *sk)
+{
+       if (!sk->sk_prot->forward_alloc_get)
+               return sk->sk_forward_alloc;
+
+       return sk->sk_prot->forward_alloc_get(sk);
+}
+
 static inline bool __sk_stream_memory_free(const struct sock *sk, int wake)
 {
        if (READ_ONCE(sk->sk_wmem_queued) >= READ_ONCE(sk->sk_sndbuf))
index 31d5cefa99799ca25969894c4bcdfc578f3b4cec..0189e3cd4a7df2dc2ea7121182ee290e0164df90 100644 (file)
@@ -150,7 +150,7 @@ void inet_sock_destruct(struct sock *sk)
        WARN_ON(atomic_read(&sk->sk_rmem_alloc));
        WARN_ON(refcount_read(&sk->sk_wmem_alloc));
        WARN_ON(sk->sk_wmem_queued);
-       WARN_ON(sk->sk_forward_alloc);
+       WARN_ON(sk_forward_alloc_get(sk));
 
        kfree(rcu_dereference_protected(inet->inet_opt, 1));
        dst_release(rcu_dereference_protected(sk->sk_dst_cache, 1));
index ef7897226f08e5d85eadedab95eb210096087b39..c8fa6e7f7d1241691e048c868878b388e04b6f80 100644 (file)
@@ -271,7 +271,7 @@ int inet_sk_diag_fill(struct sock *sk, struct inet_connection_sock *icsk,
                struct inet_diag_meminfo minfo = {
                        .idiag_rmem = sk_rmem_alloc_get(sk),
                        .idiag_wmem = READ_ONCE(sk->sk_wmem_queued),
-                       .idiag_fmem = sk->sk_forward_alloc,
+                       .idiag_fmem = sk_forward_alloc_get(sk),
                        .idiag_tmem = sk_wmem_alloc_get(sk),
                };
 
index 46254968d390fc50a1b77c1bf94971ded5233142..0a04468b73145546097788db0645ef9e5b459bca 100644 (file)
@@ -457,7 +457,7 @@ META_COLLECTOR(int_sk_fwd_alloc)
                *err = -1;
                return;
        }
-       dst->value = sk->sk_forward_alloc;
+       dst->value = sk_forward_alloc_get(sk);
 }
 
 META_COLLECTOR(int_sk_sndbuf)