forked from Minki/linux
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. Signed-off-by: Bhaktipriya Shridhar <bhaktipriya96@gmail.com> Acked-by: Tejun Heo <tj@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
2d5f6feca9
commit
6fe5efa141
@ -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();
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user