wifi: libertas: WQ_PERCPU added to alloc_workqueue users
Currently if a user enqueue a work item using schedule_delayed_work() the used wq is "system_wq" (per-cpu wq) while queue_delayed_work() use WORK_CPU_UNBOUND (used when a cpu is not specified). The same applies to schedule_work() that is using system_wq and queue_work(), that makes use again of WORK_CPU_UNBOUND. This lack of consistentcy cannot be addressed without refactoring the API. alloc_workqueue() treats all queues as per-CPU by default, while unbound workqueues must opt-in via WQ_UNBOUND. This default is suboptimal: most workloads benefit from unbound queues, allowing the scheduler to place worker threads where they’re needed and reducing noise when CPUs are isolated. This change add a new WQ_PERCPU flag, to explicitly request the use of the per-CPU behavior. Both flags coexist for one release cycle to allow callers to transition their calls. Once migration is complete, WQ_UNBOUND can be removed and unbound will become the implicit default. With the introduction of the WQ_PERCPU flag (equivalent to !WQ_UNBOUND), any alloc_workqueue() caller that doesn’t explicitly specify WQ_UNBOUND must now use WQ_PERCPU. All existing users have been updated accordingly. Suggested-by: Tejun Heo <tj@kernel.org> Signed-off-by: Marco Crivellari <marco.crivellari@suse.com> Link: https://patch.msgid.link/20250922102407.186660-2-marco.crivellari@suse.com Signed-off-by: Johannes Berg <johannes.berg@intel.com>pull/1354/merge
parent
17f34ab55a
commit
1e06a13751
|
|
@ -1181,7 +1181,8 @@ static int if_sdio_probe(struct sdio_func *func,
|
|||
spin_lock_init(&card->lock);
|
||||
INIT_LIST_HEAD(&card->packets);
|
||||
|
||||
card->workqueue = alloc_workqueue("libertas_sdio", WQ_MEM_RECLAIM, 0);
|
||||
card->workqueue = alloc_workqueue("libertas_sdio",
|
||||
WQ_MEM_RECLAIM | WQ_PERCPU, 0);
|
||||
if (unlikely(!card->workqueue)) {
|
||||
ret = -ENOMEM;
|
||||
goto err_queue;
|
||||
|
|
|
|||
|
|
@ -1153,7 +1153,8 @@ static int if_spi_probe(struct spi_device *spi)
|
|||
priv->fw_ready = 1;
|
||||
|
||||
/* Initialize interrupt handling stuff. */
|
||||
card->workqueue = alloc_workqueue("libertas_spi", WQ_MEM_RECLAIM, 0);
|
||||
card->workqueue = alloc_workqueue("libertas_spi",
|
||||
WQ_MEM_RECLAIM | WQ_PERCPU, 0);
|
||||
if (!card->workqueue) {
|
||||
err = -ENOMEM;
|
||||
goto remove_card;
|
||||
|
|
|
|||
|
|
@ -708,7 +708,7 @@ EXPORT_SYMBOL_GPL(lbtf_bcn_sent);
|
|||
static int __init lbtf_init_module(void)
|
||||
{
|
||||
lbtf_deb_enter(LBTF_DEB_MAIN);
|
||||
lbtf_wq = alloc_workqueue("libertastf", WQ_MEM_RECLAIM, 0);
|
||||
lbtf_wq = alloc_workqueue("libertastf", WQ_MEM_RECLAIM | WQ_PERCPU, 0);
|
||||
if (lbtf_wq == NULL) {
|
||||
printk(KERN_ERR "libertastf: couldn't create workqueue\n");
|
||||
return -ENOMEM;
|
||||
|
|
|
|||
Loading…
Reference in New Issue