Skip to content

Commit

Permalink
mptcp: use fast lock for subflows when possible
Browse files Browse the repository at this point in the history
[ Upstream commit 75e908c ]

There are a bunch of callsite where the ssk socket
lock is acquired using the full-blown version eligible for
the fast variant. Let's move to the latter.

Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
  • Loading branch information
Paolo Abeni authored and gregkh committed Jul 28, 2021
1 parent c888aa8 commit b245508
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 10 deletions.
10 changes: 6 additions & 4 deletions net/mptcp/pm_netlink.c
Expand Up @@ -540,16 +540,17 @@ void mptcp_pm_nl_addr_send_ack(struct mptcp_sock *msk)
subflow = list_first_entry_or_null(&msk->conn_list, typeof(*subflow), node);
if (subflow) {
struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
bool slow;

spin_unlock_bh(&msk->pm.lock);
pr_debug("send ack for %s%s%s",
mptcp_pm_should_add_signal(msk) ? "add_addr" : "rm_addr",
mptcp_pm_should_add_signal_ipv6(msk) ? " [ipv6]" : "",
mptcp_pm_should_add_signal_port(msk) ? " [port]" : "");

lock_sock(ssk);
slow = lock_sock_fast(ssk);
tcp_send_ack(ssk);
release_sock(ssk);
unlock_sock_fast(ssk, slow);
spin_lock_bh(&msk->pm.lock);
}
}
Expand All @@ -566,6 +567,7 @@ int mptcp_pm_nl_mp_prio_send_ack(struct mptcp_sock *msk,
struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
struct sock *sk = (struct sock *)msk;
struct mptcp_addr_info local;
bool slow;

local_address((struct sock_common *)ssk, &local);
if (!addresses_equal(&local, addr, addr->port))
Expand All @@ -578,9 +580,9 @@ int mptcp_pm_nl_mp_prio_send_ack(struct mptcp_sock *msk,

spin_unlock_bh(&msk->pm.lock);
pr_debug("send ack for mp_prio");
lock_sock(ssk);
slow = lock_sock_fast(ssk);
tcp_send_ack(ssk);
release_sock(ssk);
unlock_sock_fast(ssk, slow);
spin_lock_bh(&msk->pm.lock);

return 0;
Expand Down
15 changes: 9 additions & 6 deletions net/mptcp/protocol.c
Expand Up @@ -424,23 +424,25 @@ static void mptcp_send_ack(struct mptcp_sock *msk)

mptcp_for_each_subflow(msk, subflow) {
struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
bool slow;

lock_sock(ssk);
slow = lock_sock_fast(ssk);
if (tcp_can_send_ack(ssk))
tcp_send_ack(ssk);
release_sock(ssk);
unlock_sock_fast(ssk, slow);
}
}

static bool mptcp_subflow_cleanup_rbuf(struct sock *ssk)
{
bool slow;
int ret;

lock_sock(ssk);
slow = lock_sock_fast(ssk);
ret = tcp_can_send_ack(ssk);
if (ret)
tcp_cleanup_rbuf(ssk, 1);
release_sock(ssk);
unlock_sock_fast(ssk, slow);
return ret;
}

Expand Down Expand Up @@ -2288,13 +2290,14 @@ static void mptcp_check_fastclose(struct mptcp_sock *msk)

list_for_each_entry_safe(subflow, tmp, &msk->conn_list, node) {
struct sock *tcp_sk = mptcp_subflow_tcp_sock(subflow);
bool slow;

lock_sock(tcp_sk);
slow = lock_sock_fast(tcp_sk);
if (tcp_sk->sk_state != TCP_CLOSE) {
tcp_send_active_reset(tcp_sk, GFP_ATOMIC);
tcp_set_state(tcp_sk, TCP_CLOSE);
}
release_sock(tcp_sk);
unlock_sock_fast(tcp_sk, slow);
}

inet_sk_state_store(sk, TCP_CLOSE);
Expand Down

0 comments on commit b245508

Please sign in to comment.