]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
RDS: make the rds_{local_}wq part of rds_connection
authorSantosh Shilimkar <santosh.shilimkar@oracle.com>
Fri, 5 Aug 2016 22:02:55 +0000 (15:02 -0700)
committerSantosh Shilimkar <santosh.shilimkar@oracle.com>
Wed, 12 Oct 2016 17:20:24 +0000 (10:20 -0700)
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 <michael.nowak@oracle.com>
Tested-by: Rafael Alejandro Peralez <rafael.peralez@oracle.com>
Tested-by: Liwen Huang <liwen.huang@oracle.com>
Tested-by: Hong Liu <hong.x.liu@oracle.com>
Reviewed-by: Mukesh Kacker <mukesh.kacker@oracle.com>
Signed-off-by: Santosh Shilimkar <santosh.shilimkar@oracle.com>
net/rds/connection.c
net/rds/rdma_transport.c
net/rds/rds.h
net/rds/threads.c

index 7053cbfe07bdb6205690a95592712fa835538861..5a55cd83ac00cf6cf975c62b27529d007d9e7122 100644 (file)
@@ -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);
index 13a5dcfc250bbc2e08cc2cb0ee74f7cdf92d26a2..d37a240353b1f94594989c6ff0827383aa522169 100644 (file)
@@ -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) {
index fda614f055496887037313a37044a9af17043cd2..5f73d6ac359f545173ff6b45267d2ebaab76783e 100644 (file)
@@ -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;
index 541c0b6e74520988e164fd512b7966b1fd7fba6c..b729f36220b1e4584422c68dc709e369879a166d 100644 (file)
@@ -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",