Skip to content

Commit d769ef8

Browse files
sowminivdavem330
authored andcommitted
RDS: Update rds_conn_shutdown to work with rds_conn_path
This commit changes rds_conn_shutdown to take a rds_conn_path * argument, allowing it to shutdown paths other than c_path[0] for MP-capable transports. Signed-off-by: Sowmini Varadhan <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 1c5113c commit d769ef8

File tree

5 files changed

+44
-38
lines changed

5 files changed

+44
-38
lines changed

net/rds/connection.c

Lines changed: 37 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -96,14 +96,16 @@ static struct rds_connection *rds_conn_lookup(struct net *net,
9696
* and receiving over this connection again in the future. It is up to
9797
* the transport to have serialized this call with its send and recv.
9898
*/
99-
static void rds_conn_reset(struct rds_connection *conn)
99+
static void rds_conn_path_reset(struct rds_conn_path *cp)
100100
{
101+
struct rds_connection *conn = cp->cp_conn;
102+
101103
rdsdebug("connection %pI4 to %pI4 reset\n",
102104
&conn->c_laddr, &conn->c_faddr);
103105

104106
rds_stats_inc(s_conn_reset);
105-
rds_send_reset(conn);
106-
conn->c_flags = 0;
107+
rds_send_path_reset(cp);
108+
cp->cp_flags = 0;
107109

108110
/* Do not clear next_rx_seq here, else we cannot distinguish
109111
* retransmitted packets from new packets, and will hand all
@@ -294,46 +296,54 @@ struct rds_connection *rds_conn_create_outgoing(struct net *net,
294296
}
295297
EXPORT_SYMBOL_GPL(rds_conn_create_outgoing);
296298

297-
void rds_conn_shutdown(struct rds_connection *conn)
299+
void rds_conn_shutdown(struct rds_conn_path *cp)
298300
{
301+
struct rds_connection *conn = cp->cp_conn;
302+
299303
/* shut it down unless it's down already */
300-
if (!rds_conn_transition(conn, RDS_CONN_DOWN, RDS_CONN_DOWN)) {
304+
if (!rds_conn_path_transition(cp, RDS_CONN_DOWN, RDS_CONN_DOWN)) {
301305
/*
302306
* Quiesce the connection mgmt handlers before we start tearing
303307
* things down. We don't hold the mutex for the entire
304308
* duration of the shutdown operation, else we may be
305309
* deadlocking with the CM handler. Instead, the CM event
306310
* handler is supposed to check for state DISCONNECTING
307311
*/
308-
mutex_lock(&conn->c_cm_lock);
309-
if (!rds_conn_transition(conn, RDS_CONN_UP, RDS_CONN_DISCONNECTING)
310-
&& !rds_conn_transition(conn, RDS_CONN_ERROR, RDS_CONN_DISCONNECTING)) {
311-
rds_conn_error(conn, "shutdown called in state %d\n",
312-
atomic_read(&conn->c_state));
313-
mutex_unlock(&conn->c_cm_lock);
312+
mutex_lock(&cp->cp_cm_lock);
313+
if (!rds_conn_path_transition(cp, RDS_CONN_UP,
314+
RDS_CONN_DISCONNECTING) &&
315+
!rds_conn_path_transition(cp, RDS_CONN_ERROR,
316+
RDS_CONN_DISCONNECTING)) {
317+
rds_conn_path_error(cp,
318+
"shutdown called in state %d\n",
319+
atomic_read(&cp->cp_state));
320+
mutex_unlock(&cp->cp_cm_lock);
314321
return;
315322
}
316-
mutex_unlock(&conn->c_cm_lock);
323+
mutex_unlock(&cp->cp_cm_lock);
317324

318-
wait_event(conn->c_waitq,
319-
!test_bit(RDS_IN_XMIT, &conn->c_flags));
320-
wait_event(conn->c_waitq,
321-
!test_bit(RDS_RECV_REFILL, &conn->c_flags));
325+
wait_event(cp->cp_waitq,
326+
!test_bit(RDS_IN_XMIT, &cp->cp_flags));
327+
wait_event(cp->cp_waitq,
328+
!test_bit(RDS_RECV_REFILL, &cp->cp_flags));
322329

323-
conn->c_trans->conn_shutdown(conn);
324-
rds_conn_reset(conn);
330+
if (!conn->c_trans->t_mp_capable)
331+
conn->c_trans->conn_shutdown(conn);
332+
else
333+
conn->c_trans->conn_path_shutdown(cp);
334+
rds_conn_path_reset(cp);
325335

326-
if (!rds_conn_transition(conn, RDS_CONN_DISCONNECTING, RDS_CONN_DOWN)) {
336+
if (!rds_conn_path_transition(cp, RDS_CONN_DISCONNECTING,
337+
RDS_CONN_DOWN)) {
327338
/* This can happen - eg when we're in the middle of tearing
328339
* down the connection, and someone unloads the rds module.
329340
* Quite reproduceable with loopback connections.
330341
* Mostly harmless.
331342
*/
332-
rds_conn_error(conn,
333-
"%s: failed to transition to state DOWN, "
334-
"current state is %d\n",
335-
__func__,
336-
atomic_read(&conn->c_state));
343+
rds_conn_path_error(cp, "%s: failed to transition "
344+
"to state DOWN, current state "
345+
"is %d\n", __func__,
346+
atomic_read(&cp->cp_state));
337347
return;
338348
}
339349
}
@@ -342,13 +352,13 @@ void rds_conn_shutdown(struct rds_connection *conn)
342352
* The passive side of an IB loopback connection is never added
343353
* to the conn hash, so we never trigger a reconnect on this
344354
* conn - the reconnect is always triggered by the active peer. */
345-
cancel_delayed_work_sync(&conn->c_conn_w);
355+
cancel_delayed_work_sync(&cp->cp_conn_w);
346356
rcu_read_lock();
347357
if (!hlist_unhashed(&conn->c_hash_node)) {
348358
rcu_read_unlock();
349359
if (conn->c_trans->t_type != RDS_TRANS_TCP ||
350-
conn->c_path[0].cp_outgoing == 1)
351-
rds_queue_reconnect(&conn->c_path[0]);
360+
cp->cp_outgoing == 1)
361+
rds_queue_reconnect(cp);
352362
} else {
353363
rcu_read_unlock();
354364
}

net/rds/rds.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -456,6 +456,7 @@ struct rds_transport {
456456
void (*conn_free)(void *data);
457457
int (*conn_connect)(struct rds_connection *conn);
458458
void (*conn_shutdown)(struct rds_connection *conn);
459+
void (*conn_path_shutdown)(struct rds_conn_path *conn);
459460
void (*xmit_prepare)(struct rds_connection *conn);
460461
void (*xmit_path_prepare)(struct rds_conn_path *cp);
461462
void (*xmit_complete)(struct rds_connection *conn);
@@ -653,7 +654,7 @@ struct rds_connection *rds_conn_create(struct net *net,
653654
struct rds_connection *rds_conn_create_outgoing(struct net *net,
654655
__be32 laddr, __be32 faddr,
655656
struct rds_transport *trans, gfp_t gfp);
656-
void rds_conn_shutdown(struct rds_connection *conn);
657+
void rds_conn_shutdown(struct rds_conn_path *cpath);
657658
void rds_conn_destroy(struct rds_connection *conn);
658659
void rds_conn_drop(struct rds_connection *conn);
659660
void rds_conn_path_drop(struct rds_conn_path *cpath);
@@ -786,7 +787,7 @@ void rds_inc_info_copy(struct rds_incoming *inc,
786787

787788
/* send.c */
788789
int rds_sendmsg(struct socket *sock, struct msghdr *msg, size_t payload_len);
789-
void rds_send_reset(struct rds_connection *conn);
790+
void rds_send_path_reset(struct rds_conn_path *conn);
790791
int rds_send_xmit(struct rds_conn_path *cp);
791792
struct sockaddr_in;
792793
void rds_send_drop_to(struct rds_sock *rs, struct sockaddr_in *dest);

net/rds/send.c

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ static void rds_send_remove_from_sock(struct list_head *messages, int status);
6262
* Reset the send state. Callers must ensure that this doesn't race with
6363
* rds_send_xmit().
6464
*/
65-
static void rds_send_path_reset(struct rds_conn_path *cp)
65+
void rds_send_path_reset(struct rds_conn_path *cp)
6666
{
6767
struct rds_message *rm, *tmp;
6868
unsigned long flags;
@@ -99,12 +99,7 @@ static void rds_send_path_reset(struct rds_conn_path *cp)
9999
list_splice_init(&cp->cp_retrans, &cp->cp_send_queue);
100100
spin_unlock_irqrestore(&cp->cp_lock, flags);
101101
}
102-
103-
void rds_send_reset(struct rds_connection *conn)
104-
{
105-
rds_send_path_reset(&conn->c_path[0]);
106-
}
107-
EXPORT_SYMBOL_GPL(rds_send_reset);
102+
EXPORT_SYMBOL_GPL(rds_send_path_reset);
108103

109104
static int acquire_in_xmit(struct rds_conn_path *cp)
110105
{

net/rds/tcp.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ void rds_tcp_reset_callbacks(struct socket *sock,
186186
release_sock(osock->sk);
187187
sock_release(osock);
188188
newsock:
189-
rds_send_reset(conn);
189+
rds_send_path_reset(&conn->c_path[0]);
190190
lock_sock(sock->sk);
191191
write_lock_bh(&sock->sk->sk_callback_lock);
192192
tc->t_sock = sock;

net/rds/threads.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ void rds_shutdown_worker(struct work_struct *work)
225225
struct rds_conn_path,
226226
cp_down_w);
227227

228-
rds_conn_shutdown(cp->cp_conn);
228+
rds_conn_shutdown(cp);
229229
}
230230

231231
void rds_threads_exit(void)

0 commit comments

Comments
 (0)