mirror of
https://github.com/torvalds/linux.git
synced 2024-11-26 22:21:42 +00:00
net: introduce sk_forward_alloc_get()
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>
This commit is contained in:
parent
5823fc96d7
commit
292e6077b0
@ -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))
|
||||
|
@ -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));
|
||||
|
@ -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),
|
||||
};
|
||||
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user