mirror of
https://github.com/torvalds/linux
synced 2024-10-15 15:59:15 +00:00
workqueue, irq_work: Build fix for !CONFIG_IRQ_WORK
2f34d7337d
("workqueue: Fix queue_work_on() with BH workqueues") added irq_work usage to workqueue; however, it turns out irq_work is actually optional and the change breaks build on configuration which doesn't have CONFIG_IRQ_WORK enabled. Fix build by making workqueue use irq_work only when CONFIG_SMP and enabling CONFIG_IRQ_WORK when CONFIG_SMP is set. It's reasonable to argue that it may be better to just always enable it. However, this still saves a small bit of memory for tiny UP configs and also the least amount of change, so, for now, let's keep it conditional. Verified to do the right thing for x86_64 allnoconfig and defconfig, and aarch64 allnoconfig, allnoconfig + prink disable (SMP but nothing selects IRQ_WORK) and a modified aarch64 Kconfig where !SMP and nothing selects IRQ_WORK. v2: `depends on SMP` leads to Kconfig warnings when CONFIG_IRQ_WORK is selected by something else when !CONFIG_SMP. Use `def_bool y if SMP` instead. Signed-off-by: Tejun Heo <tj@kernel.org> Reported-by: Naresh Kamboju <naresh.kamboju@linaro.org> Tested-by: Anders Roxell <anders.roxell@linaro.org> Fixes:2f34d7337d
("workqueue: Fix queue_work_on() with BH workqueues") Cc: Stephen Rothwell <sfr@canb.auug.org.au>
This commit is contained in:
parent
2f34d7337d
commit
fd0a68a233
|
@ -106,7 +106,7 @@ config CONSTRUCTORS
|
|||
bool
|
||||
|
||||
config IRQ_WORK
|
||||
bool
|
||||
def_bool y if SMP
|
||||
|
||||
config BUILDTIME_TABLE_SORT
|
||||
bool
|
||||
|
|
|
@ -1209,6 +1209,20 @@ static struct irq_work *bh_pool_irq_work(struct worker_pool *pool)
|
|||
return &per_cpu(bh_pool_irq_works, pool->cpu)[high];
|
||||
}
|
||||
|
||||
static void kick_bh_pool(struct worker_pool *pool)
|
||||
{
|
||||
#ifdef CONFIG_SMP
|
||||
if (unlikely(pool->cpu != smp_processor_id())) {
|
||||
irq_work_queue_on(bh_pool_irq_work(pool), pool->cpu);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
if (pool->attrs->nice == HIGHPRI_NICE_LEVEL)
|
||||
raise_softirq_irqoff(HI_SOFTIRQ);
|
||||
else
|
||||
raise_softirq_irqoff(TASKLET_SOFTIRQ);
|
||||
}
|
||||
|
||||
/**
|
||||
* kick_pool - wake up an idle worker if necessary
|
||||
* @pool: pool to kick
|
||||
|
@ -1227,15 +1241,7 @@ static bool kick_pool(struct worker_pool *pool)
|
|||
return false;
|
||||
|
||||
if (pool->flags & POOL_BH) {
|
||||
if (likely(pool->cpu == smp_processor_id())) {
|
||||
if (pool->attrs->nice == HIGHPRI_NICE_LEVEL)
|
||||
raise_softirq_irqoff(HI_SOFTIRQ);
|
||||
else
|
||||
raise_softirq_irqoff(TASKLET_SOFTIRQ);
|
||||
} else {
|
||||
irq_work_queue_on(bh_pool_irq_work(pool), pool->cpu);
|
||||
}
|
||||
|
||||
kick_bh_pool(pool);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue