Skip to content

Commit b47d05d

Browse files
sharathmsrinivijay-suman
authored andcommitted
net/rds: Add krefs to struct rds_connection
We need to add krefs to struct rds_connection to make connection destroy/reaping safer and this encompasses the following code changes: rds_conn_create() does a kref_init() when a new connection is created. Transports (rds_rdma, rds_tcp, loopback) will now call rds_conn_destroy_init() as the destroy conn mechanism is split into two phases of init (quiesce) and fini (free). In the first destroy_init/quiesce phase all worker threads are cancelled and pending messages are dropped/torn-down. The second free phase begins when the conn->c_refcount drops to 0 and rds_conn_destroy_fini() is called by the kref callback. kref coverage via rds_conn_get()/rds_conn_put() includes the following class of functions: - rds_conn_lookup(), rds_conn_laddr_list(), rds_conn_drop_sock_cancel_worker(), rds_conn_ha_changed_task(), rds_send_worker(), rds_recv_worker(), rds_hb_worker(). - af_rds: rds(6)_user_reset(), rds_sock->rs_conn/rds_sock_put(). - congestion: rds_cong_{add,remove}_conn(). - send & recv: rds_sendmsg(), qp & cm_id contexts. - All callers of rds_conn_create(). Orabug: 38118655 Reviewed-by: Gerd Rausch <[email protected]> Signed-off-by: Sharath Srinivasan <[email protected]> Signed-off-by: Vijayendra Suman <[email protected]>
1 parent 5f09c92 commit b47d05d

File tree

14 files changed

+370
-124
lines changed

14 files changed

+370
-124
lines changed

net/rds/af_rds.c

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ static struct rt_debug_tp rt_debug_tp_map[] = {
9898
{ RDS_RTD_ERR_EXT,
9999
{ "rds_send_worker_err", "rds_receive_worker_err", NULL }},
100100
{ RDS_RTD_CM,
101-
{ "rds_conn_destroy", "rds_conn_drop",
101+
{ "rds_conn_destroy_init", "rds_conn_destroy_fini", "rds_conn_drop",
102102
"rds_ib_cm_initiate_connect_err", "rds_ib_conn_path_connect",
103103
"rds_rdma_cm_event_handler", "rds_rdma_cm_event_handler_err",
104104
NULL }},
@@ -584,8 +584,10 @@ static int rds_user_reset(struct rds_sock *rs, sockptr_t optval, int optlen)
584584
}
585585

586586
list_for_each_entry(conn, &s_addr_conns, c_laddr_node)
587-
if (conn)
587+
if (conn) {
588588
rds_user_conn_paths_drop(conn);
589+
rds_conn_put(conn); /* for rds_conn_laddr_list */
590+
}
589591
mutex_unlock(&conn_reset_zero_dest);
590592
goto done;
591593
}
@@ -603,6 +605,7 @@ static int rds_user_reset(struct rds_sock *rs, sockptr_t optval, int optlen)
603605
&reset.src.s_addr,
604606
&reset.dst.s_addr, conn->c_tos);
605607
rds_user_conn_paths_drop(conn);
608+
rds_conn_put(conn); /* for rds_conn_find */
606609
}
607610
done:
608611
return 0;
@@ -636,8 +639,10 @@ static int rds6_user_reset(struct rds_sock *rs, sockptr_t optval, int optlen)
636639
}
637640

638641
list_for_each_entry(conn, &s_addr_conns, c_laddr_node)
639-
if (conn)
642+
if (conn) {
640643
rds_user_conn_paths_drop(conn);
644+
rds_conn_put(conn); /* for rds_conn_laddr_list */
645+
}
641646
mutex_unlock(&conn_reset_zero_dest);
642647
goto done;
643648
}
@@ -653,6 +658,7 @@ static int rds6_user_reset(struct rds_sock *rs, sockptr_t optval, int optlen)
653658
is_tcp ? "tcp" : "IB",
654659
&reset.src, &reset.dst, conn->c_tos);
655660
rds_user_conn_paths_drop(conn);
661+
rds_conn_put(conn); /* for rds_conn_find */
656662
}
657663
done:
658664
return 0;
@@ -1165,6 +1171,9 @@ void debug_sock_put(struct sock *sk)
11651171
if (refcount_dec_and_test(&sk->sk_refcnt)) {
11661172
struct rds_sock *rs = rds_sk_to_rs(sk);
11671173

1174+
if (rs->rs_conn)
1175+
rds_conn_put(rs->rs_conn); /* rs_conn from rds_sendmsg */
1176+
11681177
if (READ_ONCE(rs->poison) != RED_ACTIVE) {
11691178
pr_err_ratelimited("bad poison on put %llx\n", READ_ONCE(rs->poison));
11701179
WARN_ON(1);

net/rds/cong.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,7 @@ void rds_cong_add_conn(struct rds_connection *conn)
289289
unsigned long flags;
290290

291291
rdsdebug("conn %p now on map %p\n", conn, conn->c_lcong);
292+
rds_conn_get(conn); /* put in rds_cong_remove_conn */
292293
spin_lock_irqsave(&rds_cong_lock, flags);
293294
list_add_tail(&conn->c_map_item, &conn->c_lcong->m_conn_list);
294295
spin_unlock_irqrestore(&rds_cong_lock, flags);
@@ -302,6 +303,7 @@ void rds_cong_remove_conn(struct rds_connection *conn)
302303
spin_lock_irqsave(&rds_cong_lock, flags);
303304
list_del_init(&conn->c_map_item);
304305
spin_unlock_irqrestore(&rds_cong_lock, flags);
306+
rds_conn_put(conn); /* get in rds_cong_add_conn */
305307
}
306308

307309
int rds_cong_get_maps(struct rds_connection *conn)

0 commit comments

Comments
 (0)