From 8935c8fab58c0966673f51243818cd23c12f1240 Mon Sep 17 00:00:00 2001 From: Santosh Shilimkar Date: Fri, 5 Aug 2016 15:02:55 -0700 Subject: [PATCH] RDS: make the rds_{local_}wq part of rds_connection Instead of sprinkling if/else for loopback all over the place, lets just add c_wq as part of rds_connection. This will prevent missing cases like 'commit edca33be359c ("RDS: move more queing for loopback connections to separate queue"), 'commit 8502173071b6 ("rds: schedule local connection activity in proper workqueue") or any future changes. Orabug: 22347191 Tested-by: Michael Nowak Tested-by: Rafael Alejandro Peralez Tested-by: Liwen Huang Tested-by: Hong Liu Reviewed-by: Mukesh Kacker Signed-off-by: Santosh Shilimkar --- net/rds/connection.c | 15 ++++++--------- net/rds/rdma_transport.c | 11 +++-------- net/rds/rds.h | 1 + net/rds/threads.c | 35 +++++++++-------------------------- 4 files changed, 19 insertions(+), 43 deletions(-) diff --git a/net/rds/connection.c b/net/rds/connection.c index 7053cbfe07bdb..5a55cd83ac00c 100644 --- a/net/rds/connection.c +++ b/net/rds/connection.c @@ -215,6 +215,10 @@ static struct rds_connection *__rds_conn_create(struct net *net, } conn->c_trans = trans; + if (conn->c_loopback) + conn->c_wq = rds_local_wq; + else + conn->c_wq = rds_wq; ret = trans->conn_alloc(conn, gfp); if (ret) { @@ -781,11 +785,7 @@ void rds_conn_drop(struct rds_connection *conn, int reason) conn, NIPQUAD(conn->c_laddr), NIPQUAD(conn->c_faddr), conn->c_tos); - if (conn->c_loopback) - queue_work(rds_local_wq, &conn->c_down_w); - else - queue_work(rds_wq, &conn->c_down_w); - + queue_work(conn->c_wq, &conn->c_down_w); } EXPORT_SYMBOL_GPL(rds_conn_drop); @@ -801,10 +801,7 @@ void rds_conn_connect_if_down(struct rds_connection *conn) "queueing connect work, conn %p, <%u.%u.%u.%u,%u.%u.%u.%u,%d>\n", conn, NIPQUAD(conn->c_laddr), NIPQUAD(conn->c_faddr), conn->c_tos); - if (conn->c_loopback) - queue_delayed_work(rds_local_wq, &conn->c_conn_w, 0); - else - queue_delayed_work(rds_wq, &conn->c_conn_w, 0); + queue_delayed_work(conn->c_wq, &conn->c_conn_w, 0); } } EXPORT_SYMBOL_GPL(rds_conn_connect_if_down); diff --git a/net/rds/rdma_transport.c b/net/rds/rdma_transport.c index 13a5dcfc250bb..d37a240353b1f 100644 --- a/net/rds/rdma_transport.c +++ b/net/rds/rdma_transport.c @@ -275,14 +275,9 @@ int rds_rdma_cm_event_handler(struct rdma_cm_id *cm_id, rds_conn_drop(conn, DR_IB_CONSUMER_DEFINED_REJ); } else { - if (conn->c_loopback) - queue_delayed_work(rds_local_wq, - &conn->c_reject_w, - msecs_to_jiffies(10)); - else - queue_delayed_work(rds_wq, - &conn->c_reject_w, - msecs_to_jiffies(10)); + queue_delayed_work(conn->c_wq, + &conn->c_reject_w, + msecs_to_jiffies(10)); } } else if (event->status == RDS_REJ_CONSUMER_DEFINED && (*err) == RDS_ACL_FAILURE) { diff --git a/net/rds/rds.h b/net/rds/rds.h index fda614f055496..5f73d6ac359f5 100644 --- a/net/rds/rds.h +++ b/net/rds/rds.h @@ -244,6 +244,7 @@ struct rds_connection { struct rds_transport *c_trans; void *c_transport_data; + struct workqueue_struct *c_wq; atomic_t c_state; unsigned long c_send_gen; unsigned long c_flags; diff --git a/net/rds/threads.c b/net/rds/threads.c index 541c0b6e74520..b729f36220b1e 100644 --- a/net/rds/threads.c +++ b/net/rds/threads.c @@ -85,10 +85,7 @@ void rds_connect_path_complete(struct rds_connection *conn, int curr) __func__, atomic_read(&conn->c_state)); atomic_set(&conn->c_state, RDS_CONN_ERROR); - if (conn->c_loopback) - queue_work(rds_local_wq, &conn->c_down_w); - else - queue_work(rds_wq, &conn->c_down_w); + queue_work(conn->c_wq, &conn->c_down_w); return; } @@ -145,10 +142,7 @@ void rds_queue_reconnect(struct rds_connection *conn) set_bit(RDS_RECONNECT_PENDING, &conn->c_flags); if (conn->c_reconnect_jiffies == 0) { conn->c_reconnect_jiffies = rds_sysctl_reconnect_min_jiffies; - if (conn->c_loopback) - queue_delayed_work(rds_local_wq, &conn->c_conn_w, 0); - else - queue_delayed_work(rds_wq, &conn->c_conn_w, 0); + queue_delayed_work(conn->c_wq, &conn->c_conn_w, 0); return; } @@ -158,19 +152,12 @@ void rds_queue_reconnect(struct rds_connection *conn) rand % conn->c_reconnect_jiffies, conn->c_reconnect_jiffies, conn, &conn->c_laddr, &conn->c_faddr, conn->c_tos); - if (conn->c_loopback) { - if (conn->c_laddr >= conn->c_faddr) - queue_delayed_work(rds_local_wq, &conn->c_conn_w, - rand % conn->c_reconnect_jiffies); - else - queue_delayed_work(rds_local_wq, &conn->c_conn_w, - msecs_to_jiffies(100)); - } else if (conn->c_laddr >= conn->c_faddr) - queue_delayed_work(rds_wq, &conn->c_conn_w, - rand % conn->c_reconnect_jiffies); + if (conn->c_laddr >= conn->c_faddr) + queue_delayed_work(conn->c_wq, &conn->c_conn_w, + rand % conn->c_reconnect_jiffies); else - queue_delayed_work(rds_wq, &conn->c_conn_w, - msecs_to_jiffies(100)); + queue_delayed_work(conn->c_wq, &conn->c_conn_w, + msecs_to_jiffies(100)); conn->c_reconnect_jiffies = min(conn->c_reconnect_jiffies * 2, rds_sysctl_reconnect_max_jiffies); @@ -339,12 +326,8 @@ void rds_shutdown_worker(struct work_struct *work) conn, NIPQUAD(conn->c_laddr), NIPQUAD(conn->c_faddr), conn->c_tos); rds_conn_shutdown(conn, 0); - if (conn->c_loopback) - queue_delayed_work(rds_local_wq, &conn->c_reconn_w, - msecs_to_jiffies(5000)); - else - queue_delayed_work(rds_wq, &conn->c_reconn_w, - msecs_to_jiffies(5000)); + queue_delayed_work(conn->c_wq, &conn->c_reconn_w, + msecs_to_jiffies(5000)); } else { rds_rtd(RDS_RTD_CM, "calling rds_conn_shutdown, conn %p:1 <%u.%u.%u.%u,%u.%u.%u.%u,%d>\n", -- 2.50.1