]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
net/rds: use different workqueue for base_conn
authorWei Lin Guay <wei.lin.guay@oracle.com>
Wed, 12 Apr 2017 10:16:39 +0000 (12:16 +0200)
committerChuck Anderson <chuck.anderson@oracle.com>
Fri, 23 Jun 2017 04:30:03 +0000 (21:30 -0700)
RDS uses rds_wq for various operations. During ADDR_CHANGE event,
each connection queues at least two tasks into this single-threaded
workqueue. Furthermore, the TOS connections have dependency on its
base connection. Thus, a separate workqueue is created specifically
for the base connections to speed up base connection establishment.

Orabug: 25521901

Signed-off-by: Wei Lin Guay <wei.lin.guay@oracle.com>
Reviewed-by: HÃ¥kon Bugge <haakon.bugge@oracle.com>
Reviewed-by: Ajaykumar Hotchandani <ajaykumar.hotchandani@oracle.com>
Tested-by: Dib Chatterjee <dib.chatterjee@oracle.com>
Tested-by: Rosa Isela Lopez Romero <rosa.lopez@oracle.com>
net/rds/connection.c
net/rds/ib.c
net/rds/rds.h
net/rds/threads.c

index 19e259945d38048ac532e49bcecde40eaef70dd4..00d349b4491aa59d66105408a7d96e87132e2163 100644 (file)
@@ -243,7 +243,6 @@ static struct rds_connection *__rds_conn_create(struct net *net,
        }
 
        conn->c_trans = trans;
-
        init_waitqueue_head(&conn->c_hs_waitq);
        for (i = 0; i < RDS_MPATH_WORKERS; i++) {
                struct rds_conn_path *cp;
@@ -254,7 +253,7 @@ static struct rds_connection *__rds_conn_create(struct net *net,
                if (conn->c_loopback)
                        cp->cp_wq = rds_local_wq;
                else
-                       cp->cp_wq = rds_wq;
+                       cp->cp_wq = tos ? rds_wq : rds_tos_wq;
        }
        ret = trans->conn_alloc(conn, gfp);
        if (ret) {
index d34ca3383a399b2e1d7271b52106d047763ecb92..93425b800dfba6d468223cebf9d0817bb67b9a6b 100644 (file)
@@ -2099,6 +2099,8 @@ static void rds_ib_unregister_client(void)
        ib_unregister_client(&rds_ib_client);
        /* wait for rds_ib_dev_free() to complete */
        flush_workqueue(rds_ip_wq);
+       flush_workqueue(rds_wq);
+       flush_workqueue(rds_tos_wq);
        flush_workqueue(rds_local_wq);
 }
 
index 9c2ec849d22e3853f6459d4411d0942cccdccc58..53e71e1b41b3f6c9aeeeff7ac42547b5ef3dd576 100644 (file)
@@ -1136,6 +1136,7 @@ extern unsigned int  rds_sysctl_shutdown_trace_end_time;
 int rds_threads_init(void);
 void rds_threads_exit(void);
 extern struct workqueue_struct *rds_wq;
+extern struct workqueue_struct *rds_tos_wq;
 extern struct workqueue_struct *rds_local_wq;
 void rds_queue_reconnect(struct rds_conn_path *cp);
 void rds_connect_worker(struct work_struct *);
index dc76c0c90df30760458f7ee19d47477b4951b9ee..c8a3861052caba57f9effb0348bb6e484f569e8c 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_tos_wq;
+EXPORT_SYMBOL_GPL(rds_tos_wq);
 struct workqueue_struct *rds_local_wq;
 EXPORT_SYMBOL_GPL(rds_local_wq);
 
@@ -352,6 +354,7 @@ void rds_shutdown_worker(struct work_struct *work)
 void rds_threads_exit(void)
 {
        destroy_workqueue(rds_wq);
+       destroy_workqueue(rds_tos_wq);
        destroy_workqueue(rds_local_wq);
 }
 
@@ -361,6 +364,10 @@ int rds_threads_init(void)
        if (!rds_wq)
                return -ENOMEM;
 
+       rds_tos_wq = create_singlethread_workqueue("krdsd_tos");
+       if (!rds_wq)
+               return -ENOMEM;
+
        rds_local_wq = create_singlethread_workqueue("krdsd_local");
        if (!rds_local_wq)
                return -ENOMEM;