Skip to content

Commit c90ecbf

Browse files
sowminivdavem330
authored andcommitted
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 <[email protected]> Acked-by: Santosh Shilimkar <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent eb9aa1b commit c90ecbf

File tree

3 files changed

+7
-6
lines changed

3 files changed

+7
-6
lines changed

net/rds/connection.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -366,7 +366,7 @@ void rds_conn_shutdown(struct rds_conn_path *cp)
366366
* to the conn hash, so we never trigger a reconnect on this
367367
* conn - the reconnect is always triggered by the active peer. */
368368
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))
370370
return;
371371
rcu_read_lock();
372372
if (!hlist_unhashed(&conn->c_hash_node)) {
@@ -384,6 +384,8 @@ static void rds_conn_path_destroy(struct rds_conn_path *cp)
384384
{
385385
struct rds_message *rm, *rtmp;
386386

387+
set_bit(RDS_DESTROY_PENDING, &cp->cp_flags);
388+
387389
if (!cp->cp_transport_data)
388390
return;
389391

@@ -426,7 +428,6 @@ void rds_conn_destroy(struct rds_connection *conn)
426428
"%pI4\n", conn, &conn->c_laddr,
427429
&conn->c_faddr);
428430

429-
conn->c_destroy_in_prog = 1;
430431
/* Ensure conn will not be scheduled for reconnect */
431432
spin_lock_irq(&rds_conn_lock);
432433
hlist_del_init_rcu(&conn->c_hash_node);
@@ -685,7 +686,7 @@ void rds_conn_path_drop(struct rds_conn_path *cp, bool destroy)
685686
{
686687
atomic_set(&cp->cp_state, RDS_CONN_ERROR);
687688

688-
if (!destroy && cp->cp_conn->c_destroy_in_prog)
689+
if (!destroy && test_bit(RDS_DESTROY_PENDING, &cp->cp_flags))
689690
return;
690691

691692
queue_work(rds_wq, &cp->cp_down_w);

net/rds/rds.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ enum {
8888
#define RDS_RECONNECT_PENDING 1
8989
#define RDS_IN_XMIT 2
9090
#define RDS_RECV_REFILL 3
91+
#define RDS_DESTROY_PENDING 4
9192

9293
/* Max number of multipaths per RDS connection. Must be a power of 2 */
9394
#define RDS_MPATH_WORKERS 8
@@ -139,8 +140,7 @@ struct rds_connection {
139140
__be32 c_faddr;
140141
unsigned int c_loopback:1,
141142
c_ping_triggered:1,
142-
c_destroy_in_prog:1,
143-
c_pad_to_32:29;
143+
c_pad_to_32:30;
144144
int c_npaths;
145145
struct rds_connection *c_passive;
146146
struct rds_transport *c_trans;

net/rds/tcp_connect.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ void rds_tcp_conn_path_shutdown(struct rds_conn_path *cp)
170170
cp->cp_conn, tc, sock);
171171

172172
if (sock) {
173-
if (cp->cp_conn->c_destroy_in_prog)
173+
if (test_bit(RDS_DESTROY_PENDING, &cp->cp_flags))
174174
rds_tcp_set_linger(sock);
175175
sock->ops->shutdown(sock, RCV_SHUTDOWN | SEND_SHUTDOWN);
176176
lock_sock(sock->sk);

0 commit comments

Comments
 (0)