|
@@ -115,8 +115,10 @@ bool irq_work_needs_cpu(void)
|
|
|
|
|
|
raised = &__get_cpu_var(raised_list);
|
|
raised = &__get_cpu_var(raised_list);
|
|
lazy = &__get_cpu_var(lazy_list);
|
|
lazy = &__get_cpu_var(lazy_list);
|
|
- if (llist_empty(raised) && llist_empty(lazy))
|
|
|
|
- return false;
|
|
|
|
|
|
+
|
|
|
|
+ if (llist_empty(raised) || arch_irq_work_has_interrupt())
|
|
|
|
+ if (llist_empty(lazy))
|
|
|
|
+ return false;
|
|
|
|
|
|
/* All work should have been flushed before going offline */
|
|
/* All work should have been flushed before going offline */
|
|
WARN_ON_ONCE(cpu_is_offline(smp_processor_id()));
|
|
WARN_ON_ONCE(cpu_is_offline(smp_processor_id()));
|
|
@@ -171,6 +173,15 @@ void irq_work_run(void)
|
|
}
|
|
}
|
|
EXPORT_SYMBOL_GPL(irq_work_run);
|
|
EXPORT_SYMBOL_GPL(irq_work_run);
|
|
|
|
|
|
|
|
+void irq_work_tick(void)
|
|
|
|
+{
|
|
|
|
+ struct llist_head *raised = &__get_cpu_var(raised_list);
|
|
|
|
+
|
|
|
|
+ if (!llist_empty(raised) && !arch_irq_work_has_interrupt())
|
|
|
|
+ irq_work_run_list(raised);
|
|
|
|
+ irq_work_run_list(&__get_cpu_var(lazy_list));
|
|
|
|
+}
|
|
|
|
+
|
|
/*
|
|
/*
|
|
* Synchronize against the irq_work @entry, ensures the entry is not
|
|
* Synchronize against the irq_work @entry, ensures the entry is not
|
|
* currently in use.
|
|
* currently in use.
|