From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2992530AbcB0Ryj (ORCPT ); Sat, 27 Feb 2016 12:54:39 -0500 Received: from mail-pa0-f67.google.com ([209.85.220.67]:34560 "EHLO mail-pa0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756590AbcB0Ryh (ORCPT ); Sat, 27 Feb 2016 12:54:37 -0500 Date: Sat, 27 Feb 2016 23:21:47 +0530 From: Bhaktipriya Shridhar To: gregkh@linuxfoundation.org, aaro.koskinen@iki.fi, cristina.moraru09@gmail.com, avid.daney@cavium.com, david.daney@cavium.com, ralf@linux-mips.org, paul.martin@codethink.co.uk, arnd@arndb.de, joe@perches.com, aybuke.147@gmail.com Cc: linux-kernel@vger.kernel.org, devel@driverdev.osuosl.org, tj@kernel.org Subject: [PATCH v3] staging: octeon: Convert create_singlethread_workqueue() Message-ID: <20160227175147.GA28115@Karyakshetra> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.23 (2014-03-12) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 --- drivers/staging/octeon/ethernet.c | 21 ++++----------------- drivers/staging/octeon/octeon-ethernet.h | 1 - 2 files changed, 4 insertions(+), 18 deletions(-) diff --git a/drivers/staging/octeon/ethernet.c b/drivers/staging/octeon/ethernet.c index 00adc52..c4d3f76 100644 --- a/drivers/staging/octeon/ethernet.c +++ b/drivers/staging/octeon/ethernet.c @@ -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(); diff --git a/drivers/staging/octeon/octeon-ethernet.h b/drivers/staging/octeon/octeon-ethernet.h index 5b4fdd2..6275c15 100644 --- a/drivers/staging/octeon/octeon-ethernet.h +++ b/drivers/staging/octeon/octeon-ethernet.h @@ -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