if (notify == TWA_NMI_CURRENT) { if (WARN_ON_ONCE(task != current)) return -EINVAL; if (!IS_ENABLED(CONFIG_IRQ_WORK)) return -EINVAL;
} else {
kasan_record_aux_stack(work);
}
head = READ_ONCE(task->task_works); do { if (unlikely(head == &work_exited)) return -ESRCH;
work->next = head;
} while (!try_cmpxchg(&task->task_works, &head, work));
switch (notify) { case TWA_NONE: break; case TWA_RESUME:
set_notify_resume(task); break; case TWA_SIGNAL:
set_notify_signal(task); break; case TWA_SIGNAL_NO_IPI:
__set_notify_signal(task); break; #ifdef CONFIG_IRQ_WORK case TWA_NMI_CURRENT:
irq_work_queue(this_cpu_ptr(&irq_work_NMI_resume)); break; #endif default:
WARN_ON_ONCE(1); break;
}
for (;;) { /* *work->func()candotask_work_add(),donotset *work_exitedunlessthelistisempty.
*/
work = READ_ONCE(task->task_works); do {
head = NULL; if (!work) { if (task->flags & PF_EXITING)
head = &work_exited; else break;
}
} while (!try_cmpxchg(&task->task_works, &work, head));
if (!work) break; /* *Synchronizewithtask_work_cancel_match().Itcannotremove *thefirstentry==work,cmpxchg(task_works)mustfail. *Butitcanremoveanotherentryfromthe->nextlist.
*/
raw_spin_lock_irq(&task->pi_lock);
raw_spin_unlock_irq(&task->pi_lock);
do {
next = work->next;
work->func(work);
work = next;
cond_resched();
} while (work);
}
}
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.13 Sekunden
(vorverarbeitet am 2026-09-29)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.