]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
RDS: add workqueue for local loopback connections
authorChien-Hua Yen <chien.yen@oracle.com>
Fri, 23 May 2014 04:57:06 +0000 (21:57 -0700)
committerMukesh Kacker <mukesh.kacker@oracle.com>
Wed, 8 Jul 2015 20:59:58 +0000 (13:59 -0700)
Switch reboot takes too long to recover

Orabug: 18892366

Signed-off-by: Chien-Hua Yen <chien.yen@oracle.com>
Signed-off-by: Bang Nguyen <bang.nguyen@oracle.com>
Signed-off-by: Ajaykumar Hotchandani <ajaykumar.hotchandani@oracle.com>
(cherry picked from commit 38a7f3de7dfbae339ff82149277f7794cd925711)

net/rds/connection.c
net/rds/ib.c
net/rds/rds.h
net/rds/threads.c

index c57e2d953f8bd3cefb8101b0e0e86021b09df567..c973425cb354555ea0c2a81dcae77bf80b5653a2 100644 (file)
@@ -640,7 +640,12 @@ void rds_conn_drop(struct rds_connection *conn)
        conn->c_reconnect_drops++;
 
        atomic_set(&conn->c_state, RDS_CONN_ERROR);
-       queue_work(rds_wq, &conn->c_down_w);
+
+       if (conn->c_loopback)
+               queue_work(rds_local_wq, &conn->c_down_w);
+       else
+               queue_work(rds_wq, &conn->c_down_w);
+
 }
 EXPORT_SYMBOL_GPL(rds_conn_drop);
 
index f75a95c4fc7c12abc5a5aec327ee81c438327f4d..187f2c90916144d9ae1507209d4427eede5a3199 100644 (file)
@@ -1560,6 +1560,7 @@ static void rds_ib_unregister_client(void)
        ib_unregister_client(&rds_ib_client);
        /* wait for rds_ib_dev_free() to complete */
        flush_workqueue(rds_wq);
+       flush_workqueue(rds_local_wq);
 }
 
 static void rds_ib_update_ip_config(void)
index 9f6d29fbb30f89c66661d158006ff049c6a90e2d..0295ee34f354c48606a1b53c000089b9107a14fd 100644 (file)
@@ -866,6 +866,7 @@ extern unsigned int  rds_sysctl_trace_level;
 int rds_threads_init(void);
 void rds_threads_exit(void);
 extern struct workqueue_struct *rds_wq;
+extern struct workqueue_struct *rds_local_wq;
 void rds_queue_reconnect(struct rds_connection *conn);
 void rds_connect_worker(struct work_struct *);
 void rds_shutdown_worker(struct work_struct *);
index c911cdc701a8f81553b7d22c35e06ff7b1b3eb0d..7ef1948b673493bc0f21af104f6bbdc72cb89d2f 100644 (file)
@@ -74,6 +74,8 @@ MODULE_PARM_DESC(rds_conn_hb_timeout, " Connection heartbeat timeout");
  */
 struct workqueue_struct *rds_wq;
 EXPORT_SYMBOL_GPL(rds_wq);
+struct workqueue_struct *rds_local_wq;
+EXPORT_SYMBOL_GPL(rds_local_wq);
 
 void rds_connect_complete(struct rds_connection *conn)
 {
@@ -141,11 +143,19 @@ void rds_queue_reconnect(struct rds_connection *conn)
        rdsdebug("%lu delay %lu ceil conn %p for %pI4 -> %pI4\n",
                 rand % conn->c_reconnect_jiffies, conn->c_reconnect_jiffies,
                 conn, &conn->c_laddr, &conn->c_faddr);
-       if (conn->c_laddr >= conn->c_faddr)
-               queue_delayed_work(rds_wq, &conn->c_conn_w,
+
+       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);
        else
-               queue_delayed_work(rds_wq, &conn->c_conn_w,
+                       queue_delayed_work(rds_wq, &conn->c_conn_w,
                                        msecs_to_jiffies(100));
 
        conn->c_reconnect_jiffies = min(conn->c_reconnect_jiffies * 2,
@@ -298,6 +308,7 @@ void rds_shutdown_worker(struct work_struct *work)
 void rds_threads_exit(void)
 {
        destroy_workqueue(rds_wq);
+       destroy_workqueue(rds_local_wq);
 }
 
 int rds_threads_init(void)
@@ -306,5 +317,9 @@ int rds_threads_init(void)
        if (!rds_wq)
                return -ENOMEM;
 
+       rds_local_wq = create_singlethread_workqueue("krdsd_local");
+       if (!rds_local_wq)
+               return -ENOMEM;
+
        return 0;
 }