diff options
author | Sowmini Varadhan <sowmini.varadhan@oracle.com> | 2018-01-04 09:52:59 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2018-01-05 13:39:18 -0500 |
commit | c90ecbfaf50d2d7db25c531d9169be7e47435f3f (patch) | |
tree | 51a00b04b5e2ecc649922007def9b8836fb76245 | |
parent | eb9aa1bfbad8c9fc280adf43cb480911295cfa3f (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.c | 7 | ||||
-rw-r--r-- | net/rds/rds.h | 4 | ||||
-rw-r--r-- | net/rds/tcp_connect.c | 2 |
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); |