Skip to content

Commit 23e879d

Browse files
q2venKernel Patches Daemon
authored andcommitted
tcp: Save lock_sock() for memcg in inet_csk_accept().
If memcg is enabled, accept() acquires lock_sock() twice for each new TCP/MPTCP socket in inet_csk_accept() and __inet_accept(). Let's move memcg operations from inet_csk_accept() to __inet_accept(). Note that SCTP somehow allocates a new socket by sk_alloc() in sk->sk_prot->accept() and clones fields manually, instead of using sk_clone_lock(). mem_cgroup_sk_alloc() is called for SCTP before __inet_accept(), so I added the protocol check in __inet_accept(), but this can be removed once SCTP uses sk_clone_lock(). Signed-off-by: Kuniyuki Iwashima <[email protected]> Reviewed-by: Shakeel Butt <[email protected]>
1 parent bfbc0ff commit 23e879d

File tree

2 files changed

+22
-25
lines changed

2 files changed

+22
-25
lines changed

net/ipv4/af_inet.c

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -753,6 +753,28 @@ EXPORT_SYMBOL(inet_stream_connect);
753753

754754
void __inet_accept(struct socket *sock, struct socket *newsock, struct sock *newsk)
755755
{
756+
/* TODO: use sk_clone_lock() in SCTP and remove protocol checks */
757+
if (mem_cgroup_sockets_enabled &&
758+
(!IS_ENABLED(CONFIG_IP_SCTP) || sk_is_tcp(newsk))) {
759+
gfp_t gfp = GFP_KERNEL | __GFP_NOFAIL;
760+
761+
mem_cgroup_sk_alloc(newsk);
762+
763+
if (mem_cgroup_from_sk(newsk)) {
764+
int amt;
765+
766+
/* The socket has not been accepted yet, no need
767+
* to look at newsk->sk_wmem_queued.
768+
*/
769+
amt = sk_mem_pages(newsk->sk_forward_alloc +
770+
atomic_read(&newsk->sk_rmem_alloc));
771+
if (amt)
772+
mem_cgroup_sk_charge(newsk, amt, gfp);
773+
}
774+
775+
kmem_cache_charge(newsk, gfp);
776+
}
777+
756778
sock_rps_record_flow(newsk);
757779
WARN_ON(!((1 << newsk->sk_state) &
758780
(TCPF_ESTABLISHED | TCPF_SYN_RECV |

net/ipv4/inet_connection_sock.c

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -708,31 +708,6 @@ struct sock *inet_csk_accept(struct sock *sk, struct proto_accept_arg *arg)
708708

709709
release_sock(sk);
710710

711-
if (mem_cgroup_sockets_enabled) {
712-
gfp_t gfp = GFP_KERNEL | __GFP_NOFAIL;
713-
int amt = 0;
714-
715-
/* atomically get the memory usage, set and charge the
716-
* newsk->sk_memcg.
717-
*/
718-
lock_sock(newsk);
719-
720-
mem_cgroup_sk_alloc(newsk);
721-
if (mem_cgroup_from_sk(newsk)) {
722-
/* The socket has not been accepted yet, no need
723-
* to look at newsk->sk_wmem_queued.
724-
*/
725-
amt = sk_mem_pages(newsk->sk_forward_alloc +
726-
atomic_read(&newsk->sk_rmem_alloc));
727-
}
728-
729-
if (amt)
730-
mem_cgroup_sk_charge(newsk, amt, gfp);
731-
kmem_cache_charge(newsk, gfp);
732-
733-
release_sock(newsk);
734-
}
735-
736711
if (req)
737712
reqsk_put(req);
738713

0 commit comments

Comments
 (0)