Ich bin auf der Suche Scheduler-Code in Linux:Wann ist preempt_count() & PREEMPT_ACTIVE == 0?
if (prev->state && !(preempt_count() & PREEMPT_ACTIVE)) {
if (unlikely(signal_pending_state(prev->state, prev))) {
prev->state = TASK_RUNNING;
} else {
deactivate_task(rq, prev, DEQUEUE_SLEEP);
prev->on_rq = 0;
Wie ich verstehe, wenn die prev
Aufgabe uninterruptable ist, wird dieser Code die Aufgabe deaktivieren (und von Runqueue entfernen) versehen
preempt_count() & PREEMPT_ACTIVE == 0
Kann jemand erklären mir, was ist preempt_count
in thread_info
für und wann wird diese Bedingung erfüllt oder nicht?
preempt_counts obere Bits werden für Dinge wie IRQ-Zählungen verwendet, eines der Bits wird verwendet, um zu signalisieren, ob PREEMPT aktiv ist, was die Leitung prüft. –
Aber ich dachte, schedule() konnte nicht im IRQ-Handler aufgerufen werden, da der Zeitplan schlafen kann. (Du bist nur durch Interrupt vorweggenommen? Sonst würdest du das richtig terminieren?) –