staging: octeon: Convert create_singlethread_workqueue()
authorBhaktipriya Shridhar <bhaktipriya96@gmail.com>
Sat, 27 Feb 2016 17:51:47 +0000 (23:21 +0530)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 12 Mar 2016 06:09:09 +0000 (22:09 -0800)
With conccurency managed workqueues, use of dedicated workqueues can
be replaced by system_wq. Drop cvm_oct_poll_queue by using system_wq.

There are multiple work items per cvm_oct_poll_queue (viz.
cvm_oct_rx_refill_work, port_periodic_work) and different
cvm_oct_poll_queues need not be be ordered. Hence, concurrency
can be increased by switching to system_wq.

All work items are sync canceled in cvm_oct_remove() so it
is guaranteed that no work is in flight by the time exit path runs.

Signed-off-by: Bhaktipriya Shridhar <bhaktipriya96@gmail.com>
Acked-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/octeon/ethernet.c
drivers/staging/octeon/octeon-ethernet.h

index 00adc52a168024ca06666d9ecbe7ba4891d56f03..c4d3f76ef2fe2667cb1110ce801c28a881aaa45a 100644 (file)
@@ -86,10 +86,6 @@ int rx_napi_weight = 32;
 module_param(rx_napi_weight, int, 0444);
 MODULE_PARM_DESC(rx_napi_weight, "The NAPI WEIGHT parameter.");
 
-/*
- * cvm_oct_poll_queue - Workqueue for polling operations.
- */
-struct workqueue_struct *cvm_oct_poll_queue;
 
 /*
  * cvm_oct_poll_queue_stopping - flag to indicate polling should stop.
@@ -121,8 +117,7 @@ static void cvm_oct_rx_refill_worker(struct work_struct *work)
        cvm_oct_rx_refill_pool(num_packet_buffers / 2);
 
        if (!atomic_read(&cvm_oct_poll_queue_stopping))
-               queue_delayed_work(cvm_oct_poll_queue,
-                                  &cvm_oct_rx_refill_work, HZ);
+               schedule_delayed_work(&cvm_oct_rx_refill_work, HZ);
 }
 
 static void cvm_oct_periodic_worker(struct work_struct *work)
@@ -138,8 +133,7 @@ static void cvm_oct_periodic_worker(struct work_struct *work)
                                                cvm_oct_device[priv->port]);
 
        if (!atomic_read(&cvm_oct_poll_queue_stopping))
-               queue_delayed_work(cvm_oct_poll_queue,
-                                               &priv->port_periodic_work, HZ);
+               schedule_delayed_work(&priv->port_periodic_work, HZ);
 }
 
 static void cvm_oct_configure_common_hw(void)
@@ -666,11 +660,6 @@ static int cvm_oct_probe(struct platform_device *pdev)
                return -EINVAL;
        }
 
-       cvm_oct_poll_queue = create_singlethread_workqueue("octeon-ethernet");
-       if (!cvm_oct_poll_queue) {
-               pr_err("octeon-ethernet: Cannot create workqueue");
-               return -ENOMEM;
-       }
 
        cvm_oct_configure_common_hw();
 
@@ -828,8 +817,7 @@ static int cvm_oct_probe(struct platform_device *pdev)
                                fau -=
                                    cvmx_pko_get_num_queues(priv->port) *
                                    sizeof(u32);
-                               queue_delayed_work(cvm_oct_poll_queue,
-                                               &priv->port_periodic_work, HZ);
+                               schedule_delayed_work(&priv->port_periodic_work, HZ);
                        }
                }
        }
@@ -842,7 +830,7 @@ static int cvm_oct_probe(struct platform_device *pdev)
         */
        cvm_oct_tx_poll_interval = 150 * (octeon_get_clock_rate() / 1000000);
 
-       queue_delayed_work(cvm_oct_poll_queue, &cvm_oct_rx_refill_work, HZ);
+       schedule_delayed_work(&cvm_oct_rx_refill_work, HZ);
 
        return 0;
 }
@@ -885,7 +873,6 @@ static int cvm_oct_remove(struct platform_device *pdev)
                }
        }
 
-       destroy_workqueue(cvm_oct_poll_queue);
 
        cvmx_pko_shutdown();
 
index 5b4fdd21ef575f148e5f818cb45fbc5c38ebaa46..6275c15e0035097fb582c504dc69ca4bb09628a5 100644 (file)
@@ -76,7 +76,6 @@ extern int pow_send_group;
 extern int pow_receive_group;
 extern char pow_send_list[];
 extern struct net_device *cvm_oct_device[];
-extern struct workqueue_struct *cvm_oct_poll_queue;
 extern atomic_t cvm_oct_poll_queue_stopping;
 extern u64 cvm_oct_tx_poll_interval;