Skip to contentSkip to conversation

staging: octeon: Convert create_singlethread_workqueue()

PATCH Superseded Bhaktipriya Shridhar 2 participants 3 messages Feb 26, 2016 – Feb 27, 2016 Staging

lore
Share & tools
lore
#0 lore raw

PATCH v3 1/1 staging: octeon: Convert create_singlethread_workqueue()

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.

---
Changes in v3:
- Made the commit message more detailed
- Removed extern declaration of cvm_oct_poll_queue from octeon-ethernet.h

 drivers/staging/octeon/ethernet.c        | 21 ++++-----------------
 drivers/staging/octeon/octeon-ethernet.h |  1 -
 2 files changed, 4 insertions(+), 18 deletions(-)
drivers/staging/octeon/ethernet.c +4 -17
index 00adc52..c4d3f76 100644
@@ -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();
 
drivers/staging/octeon/octeon-ethernet.h +0 -1
index 5b4fdd2..6275c15 100644
@@ -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;
 

--
2.1.4

Acked-by on v3 1/1
#1 lore raw
Quoted 8 lines · Bhaktipriya Shridhar

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.

Quoted 4 lines

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.

For the workqueue part,

Let's repost with the driver maintainers cc'd so that the patch can be tested and applied.

Thanks.

Signature · 1 line
tejun
#2 lore raw

Hello Tejun,

I have emailed the patch to the developers. I hope to hear from them soon.

Thanks,
Bhaktipriya

Quoted 27 lines · Tejun Heo
Quoted 8 lines · Bhaktipriya Shridhar

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.

Quoted 4 lines

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 <[email protected] <javascript:>>

For the workqueue part,

Acked-by Tejun Heo <[email protected] <javascript:>>

Let's repost with the driver maintainers cc'd so that the patch can be tested and applied.

Thanks.

Signature · 1 line
tejun