Skip to content

Commit 866f26f

Browse files
Paolo Abenikuba-moo
Paolo Abeni
authored andcommitted
mptcp: always graft subflow socket to parent
Currently, incoming subflows link to the parent socket, while outgoing ones link to a per subflow socket. The latter is not really needed, except at the initial connect() time and for the first subflow. Always graft the outgoing subflow to the parent socket and free the unneeded ones early. This allows some code cleanup, reduces the amount of memory used and will simplify the next patch Reviewed-by: Mat Martineau <[email protected]> Signed-off-by: Paolo Abeni <[email protected]> Signed-off-by: Jakub Kicinski <[email protected]>
1 parent e26ca4b commit 866f26f

File tree

3 files changed

+14
-26
lines changed

3 files changed

+14
-26
lines changed

net/mptcp/protocol.c

Lines changed: 10 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -114,11 +114,7 @@ static int __mptcp_socket_create(struct mptcp_sock *msk)
114114
list_add(&subflow->node, &msk->conn_list);
115115
sock_hold(ssock->sk);
116116
subflow->request_mptcp = 1;
117-
118-
/* accept() will wait on first subflow sk_wq, and we always wakes up
119-
* via msk->sk_socket
120-
*/
121-
RCU_INIT_POINTER(msk->first->sk_wq, &sk->sk_socket->wq);
117+
mptcp_sock_graft(msk->first, sk->sk_socket);
122118

123119
return 0;
124120
}
@@ -2116,21 +2112,15 @@ static struct sock *mptcp_subflow_get_retrans(const struct mptcp_sock *msk)
21162112
void __mptcp_close_ssk(struct sock *sk, struct sock *ssk,
21172113
struct mptcp_subflow_context *subflow)
21182114
{
2119-
bool dispose_socket = false;
2120-
struct socket *sock;
2121-
21222115
list_del(&subflow->node);
21232116

21242117
lock_sock_nested(ssk, SINGLE_DEPTH_NESTING);
21252118

21262119
/* if we are invoked by the msk cleanup code, the subflow is
21272120
* already orphaned
21282121
*/
2129-
sock = ssk->sk_socket;
2130-
if (sock) {
2131-
dispose_socket = sock != sk->sk_socket;
2122+
if (ssk->sk_socket)
21322123
sock_orphan(ssk);
2133-
}
21342124

21352125
subflow->disposable = 1;
21362126

@@ -2148,8 +2138,6 @@ void __mptcp_close_ssk(struct sock *sk, struct sock *ssk,
21482138
__sock_put(ssk);
21492139
}
21502140
release_sock(ssk);
2151-
if (dispose_socket)
2152-
iput(SOCK_INODE(sock));
21532141

21542142
sock_put(ssk);
21552143
}
@@ -2536,6 +2524,12 @@ static void __mptcp_destroy_sock(struct sock *sk)
25362524

25372525
pr_debug("msk=%p", msk);
25382526

2527+
/* dispose the ancillatory tcp socket, if any */
2528+
if (msk->subflow) {
2529+
iput(SOCK_INODE(msk->subflow));
2530+
msk->subflow = NULL;
2531+
}
2532+
25392533
/* be sure to always acquire the join list lock, to sync vs
25402534
* mptcp_finish_join().
25412535
*/
@@ -2586,20 +2580,10 @@ static void mptcp_close(struct sock *sk, long timeout)
25862580
inet_csk(sk)->icsk_mtup.probe_timestamp = tcp_jiffies32;
25872581
list_for_each_entry(subflow, &mptcp_sk(sk)->conn_list, node) {
25882582
struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
2589-
bool slow, dispose_socket;
2590-
struct socket *sock;
2583+
bool slow = lock_sock_fast(ssk);
25912584

2592-
slow = lock_sock_fast(ssk);
2593-
sock = ssk->sk_socket;
2594-
dispose_socket = sock && sock != sk->sk_socket;
25952585
sock_orphan(ssk);
25962586
unlock_sock_fast(ssk, slow);
2597-
2598-
/* for the outgoing subflows we additionally need to free
2599-
* the associated socket
2600-
*/
2601-
if (dispose_socket)
2602-
iput(SOCK_INODE(sock));
26032587
}
26042588
sock_orphan(sk);
26052589

@@ -3041,7 +3025,7 @@ void mptcp_finish_connect(struct sock *ssk)
30413025
mptcp_rcv_space_init(msk, ssk);
30423026
}
30433027

3044-
static void mptcp_sock_graft(struct sock *sk, struct socket *parent)
3028+
void mptcp_sock_graft(struct sock *sk, struct socket *parent)
30453029
{
30463030
write_lock_bh(&sk->sk_callback_lock);
30473031
rcu_assign_pointer(sk->sk_wq, &parent->wq);

net/mptcp/protocol.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -473,6 +473,7 @@ void mptcp_subflow_shutdown(struct sock *sk, struct sock *ssk, int how);
473473
void __mptcp_close_ssk(struct sock *sk, struct sock *ssk,
474474
struct mptcp_subflow_context *subflow);
475475
void mptcp_subflow_reset(struct sock *ssk);
476+
void mptcp_sock_graft(struct sock *sk, struct socket *parent);
476477

477478
/* called with sk socket lock held */
478479
int __mptcp_subflow_connect(struct sock *sk, const struct mptcp_addr_info *loc,

net/mptcp/subflow.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1159,6 +1159,9 @@ int __mptcp_subflow_connect(struct sock *sk, const struct mptcp_addr_info *loc,
11591159
if (err && err != -EINPROGRESS)
11601160
goto failed_unlink;
11611161

1162+
/* discard the subflow socket */
1163+
mptcp_sock_graft(ssk, sk->sk_socket);
1164+
iput(SOCK_INODE(sf));
11621165
return err;
11631166

11641167
failed_unlink:

0 commit comments

Comments
 (0)