smp, irq_work: Continue smp_call_function*() and irq_work*() integration
Instead of relying on BUG_ON() to ensure the various data structures line up, use a bunch of horrible unions to make it all automatic. Much of the union magic is to ensure irq_work and smp_call_function do not (yet) see the members of their respective data structures change name. Suggested-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Signed-off-by: Ingo Molnar <mingo@kernel.org> Reviewed-by: Frederic Weisbecker <frederic@kernel.org> Link: https://lkml.kernel.org/r/20200622100825.844455025@infradead.org
This commit is contained in:

committed by
Borislav Petkov

parent
739f70b476
commit
8c4890d1c3
@@ -2293,7 +2293,7 @@ void sched_ttwu_pending(void *arg)
|
||||
rq_lock_irqsave(rq, &rf);
|
||||
update_rq_clock(rq);
|
||||
|
||||
llist_for_each_entry_safe(p, t, llist, wake_entry) {
|
||||
llist_for_each_entry_safe(p, t, llist, wake_entry.llist) {
|
||||
if (WARN_ON_ONCE(p->on_cpu))
|
||||
smp_cond_load_acquire(&p->on_cpu, !VAL);
|
||||
|
||||
@@ -2329,7 +2329,7 @@ static void __ttwu_queue_wakelist(struct task_struct *p, int cpu, int wake_flags
|
||||
p->sched_remote_wakeup = !!(wake_flags & WF_MIGRATED);
|
||||
|
||||
WRITE_ONCE(rq->ttwu_pending, 1);
|
||||
__smp_call_single_queue(cpu, &p->wake_entry);
|
||||
__smp_call_single_queue(cpu, &p->wake_entry.llist);
|
||||
}
|
||||
|
||||
void wake_up_if_idle(int cpu)
|
||||
@@ -2786,7 +2786,7 @@ static void __sched_fork(unsigned long clone_flags, struct task_struct *p)
|
||||
#endif
|
||||
init_numa_balancing(clone_flags, p);
|
||||
#ifdef CONFIG_SMP
|
||||
p->wake_entry_type = CSD_TYPE_TTWU;
|
||||
p->wake_entry.u_flags = CSD_TYPE_TTWU;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user