aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSowmini Varadhan <sowmini.varadhan@oracle.com>2018-01-04 09:52:59 -0500
committerDavid S. Miller <davem@davemloft.net>2018-01-05 13:39:18 -0500
commitc90ecbfaf50d2d7db25c531d9169be7e47435f3f (patch)
tree51a00b04b5e2ecc649922007def9b8836fb76245
parenteb9aa1bfbad8c9fc280adf43cb480911295cfa3f (diff)
rds: Use atomic flag to track connections being destroyed
Replace c_destroy_in_prog by using a bit in cp_flags that can set/tested atomically. Signed-off-by: Sowmini Varadhan <sowmini.varadhan@oracle.com> Acked-by: Santosh Shilimkar <santosh.shilimkar@oracle.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--net/rds/connection.c7
-rw-r--r--net/rds/rds.h4
-rw-r--r--net/rds/tcp_connect.c2
3 files changed, 7 insertions, 6 deletions
diff --git a/net/rds/connection.c b/net/rds/connection.c
index 6492c0b608a4..1eed197e694f 100644
--- a/net/rds/connection.c
+++ b/net/rds/connection.c
@@ -366,7 +366,7 @@ void rds_conn_shutdown(struct rds_conn_path *cp)
366 * to the conn hash, so we never trigger a reconnect on this 366 * to the conn hash, so we never trigger a reconnect on this
367 * conn - the reconnect is always triggered by the active peer. */ 367 * conn - the reconnect is always triggered by the active peer. */
368 cancel_delayed_work_sync(&cp->cp_conn_w); 368 cancel_delayed_work_sync(&cp->cp_conn_w);
369 if (conn->c_destroy_in_prog) 369 if (test_bit(RDS_DESTROY_PENDING, &cp->cp_flags))
370 return; 370 return;
371 rcu_read_lock(); 371 rcu_read_lock();
372 if (!hlist_unhashed(&conn->c_hash_node)) { 372 if (!hlist_unhashed(&conn->c_hash_node)) {
@@ -384,6 +384,8 @@ static void rds_conn_path_destroy(struct rds_conn_path *cp)
384{ 384{
385 struct rds_message *rm, *rtmp; 385 struct rds_message *rm, *rtmp;
386 386
387 set_bit(RDS_DESTROY_PENDING, &cp->cp_flags);
388
387 if (!cp->cp_transport_data) 389 if (!cp->cp_transport_data)
388 return; 390 return;
389 391
@@ -426,7 +428,6 @@ void rds_conn_destroy(struct rds_connection *conn)
426 "%pI4\n", conn, &conn->c_laddr, 428 "%pI4\n", conn, &conn->c_laddr,
427 &conn->c_faddr); 429 &conn->c_faddr);
428 430
429 conn->c_destroy_in_prog = 1;
430 /* Ensure conn will not be scheduled for reconnect */ 431 /* Ensure conn will not be scheduled for reconnect */
431 spin_lock_irq(&rds_conn_lock); 432 spin_lock_irq(&rds_conn_lock);
432 hlist_del_init_rcu(&conn->c_hash_node); 433 hlist_del_init_rcu(&conn->c_hash_node);
@@ -685,7 +686,7 @@ void rds_conn_path_drop(struct rds_conn_path *cp, bool destroy)
685{ 686{
686 atomic_set(&cp->cp_state, RDS_CONN_ERROR); 687 atomic_set(&cp->cp_state, RDS_CONN_ERROR);
687 688
688 if (!destroy && cp->cp_conn->c_destroy_in_prog) 689 if (!destroy && test_bit(RDS_DESTROY_PENDING, &cp->cp_flags))
689 return; 690 return;
690 691
691 queue_work(rds_wq, &cp->cp_down_w); 692 queue_work(rds_wq, &cp->cp_down_w);
diff --git a/net/rds/rds.h b/net/rds/rds.h
index d09f6c1facb4..374ae83b60d4 100644
--- a/net/rds/rds.h
+++ b/net/rds/rds.h
@@ -88,6 +88,7 @@ enum {
88#define RDS_RECONNECT_PENDING 1 88#define RDS_RECONNECT_PENDING 1
89#define RDS_IN_XMIT 2 89#define RDS_IN_XMIT 2
90#define RDS_RECV_REFILL 3 90#define RDS_RECV_REFILL 3
91#define RDS_DESTROY_PENDING 4
91 92
92/* Max number of multipaths per RDS connection. Must be a power of 2 */ 93/* Max number of multipaths per RDS connection. Must be a power of 2 */
93#define RDS_MPATH_WORKERS 8 94#define RDS_MPATH_WORKERS 8
@@ -139,8 +140,7 @@ struct rds_connection {
139 __be32 c_faddr; 140 __be32 c_faddr;
140 unsigned int c_loopback:1, 141 unsigned int c_loopback:1,
141 c_ping_triggered:1, 142 c_ping_triggered:1,
142 c_destroy_in_prog:1, 143 c_pad_to_32:30;
143 c_pad_to_32:29;
144 int c_npaths; 144 int c_npaths;
145 struct rds_connection *c_passive; 145 struct rds_connection *c_passive;
146 struct rds_transport *c_trans; 146 struct rds_transport *c_trans;
diff --git a/net/rds/tcp_connect.c b/net/rds/tcp_connect.c
index 46f74dad0e16..534c67aeb20f 100644
--- a/net/rds/tcp_connect.c
+++ b/net/rds/tcp_connect.c
@@ -170,7 +170,7 @@ void rds_tcp_conn_path_shutdown(struct rds_conn_path *cp)
170 cp->cp_conn, tc, sock); 170 cp->cp_conn, tc, sock);
171 171
172 if (sock) { 172 if (sock) {
173 if (cp->cp_conn->c_destroy_in_prog) 173 if (test_bit(RDS_DESTROY_PENDING, &cp->cp_flags))
174 rds_tcp_set_linger(sock); 174 rds_tcp_set_linger(sock);
175 sock->ops->shutdown(sock, RCV_SHUTDOWN | SEND_SHUTDOWN); 175 sock->ops->shutdown(sock, RCV_SHUTDOWN | SEND_SHUTDOWN);
176 lock_sock(sock->sk); 176 lock_sock(sock->sk);