Fixed and applied, thanks! Damien Zammit, le ven. 23 févr. 2024 08:14:10 +0000, a ecrit: > Fixes assertion errors when LDEBUG is compiled in. > --- > kern/machine.c | 6 ++++-- > kern/sched_prim.c | 38 ++++++++++++++++++++++++-------------- > 2 files changed, 28 insertions(+), 16 deletions(-) > > diff --git a/kern/machine.c b/kern/machine.c > index f757d146..a350fad4 100644 > --- a/kern/machine.c > +++ b/kern/machine.c > @@ -176,7 +176,8 @@ processor_request_action( > * get at processor state. > */ > pset = processor->processor_set; > - simple_lock(&pset->idle_lock); > + assert_splsched(); > + simple_lock_nocheck(&pset->idle_lock); > > /* > * If the processor is dispatching, let it finish - it will set its > @@ -228,7 +229,8 @@ processor_request_action( > panic("processor_request_action: bad state"); > } > simple_unlock(&action_lock); > - simple_unlock(&pset->idle_lock); > + assert_splsched(); > + simple_unlock_nocheck(&pset->idle_lock); > > thread_wakeup((event_t)&action_queue); > } > diff --git a/kern/sched_prim.c b/kern/sched_prim.c > index 24f342fb..f7a20729 100644 > --- a/kern/sched_prim.c > +++ b/kern/sched_prim.c > @@ -141,9 +141,19 @@ queue_head_t wait_queue[NUMQUEUES]; > assert_splsched(); \ > simple_unlock_nocheck(wl); \ > } while (0) > +#define pset_idle_lock() do { \ > + assert_splsched(); \ > + simple_lock_nocheck(&pset->idle_lock); \ > +} while (0) > +#define pset_idle_unlock() do { \ > + assert_splsched(); \ > + simple_unlock_nocheck(&pset->idle_lock); \ > +} while (0) > #else > #define waitq_lock(wl) simple_lock_nocheck(wl) > #define waitq_unlock(wl) simple_unlock_nocheck(wl) > +#define pset_idle_lock() simple_lock_nocheck(&pset->idle_lock) > +#define pset_idle_unlock() simple_unlock_nocheck(&pset->idle_lock) > #endif > > > @@ -1269,7 +1279,7 @@ void thread_setrun( > processor = th->last_processor; > if (processor->state == PROCESSOR_IDLE) { > processor_lock(processor); > - simple_lock(&pset->idle_lock); > + pset_idle_lock(); > if ((processor->state == PROCESSOR_IDLE) > #if MACH_HOST > && (processor->processor_set == pset) > @@ -1280,19 +1290,19 @@ void thread_setrun( > pset->idle_count--; > processor->next_thread = th; > processor->state = PROCESSOR_DISPATCHING; > - simple_unlock(&pset->idle_lock); > + pset_idle_unlock(); > processor_unlock(processor); > if (processor != current_processor()) > cause_ast_check(processor); > return; > } > - simple_unlock(&pset->idle_lock); > + pset_idle_unlock(); > processor_unlock(processor); > } > #endif /* HW_FOOTPRINT */ > > if (pset->idle_count > 0) { > - simple_lock(&pset->idle_lock); > + pset_idle_lock(); > if (pset->idle_count > 0) { > processor = (processor_t) queue_first(&pset->idle_queue); > queue_remove(&(pset->idle_queue), processor, processor_t, > @@ -1300,12 +1310,12 @@ void thread_setrun( > pset->idle_count--; > processor->next_thread = th; > processor->state = PROCESSOR_DISPATCHING; > - simple_unlock(&pset->idle_lock); > + pset_idle_unlock(); > if (processor != current_processor()) > cause_ast_check(processor); > return; > } > - simple_unlock(&pset->idle_lock); > + pset_idle_unlock(); > } > rq = &(pset->runq); > run_queue_enqueue(rq,th); > @@ -1332,20 +1342,20 @@ void thread_setrun( > if (processor->state == PROCESSOR_IDLE) { > processor_lock(processor); > pset = processor->processor_set; > - simple_lock(&pset->idle_lock); > + pset_idle_lock(); > if (processor->state == PROCESSOR_IDLE) { > queue_remove(&pset->idle_queue, processor, > processor_t, processor_queue); > pset->idle_count--; > processor->next_thread = th; > processor->state = PROCESSOR_DISPATCHING; > - simple_unlock(&pset->idle_lock); > + pset_idle_unlock(); > processor_unlock(processor); > if (processor != current_processor()) > cause_ast_check(processor); > return; > } > - simple_unlock(&pset->idle_lock); > + pset_idle_unlock(); > processor_unlock(processor); > } > rq = &(processor->runq); > @@ -1593,7 +1603,7 @@ thread_t choose_pset_thread( > * was running. If it was in an assignment or shutdown, > * leave it alone. Return its idle thread. > */ > - simple_lock(&pset->idle_lock); > + pset_idle_lock(); > if (myprocessor->state == PROCESSOR_RUNNING) { > myprocessor->state = PROCESSOR_IDLE; > /* > @@ -1611,7 +1621,7 @@ thread_t choose_pset_thread( > > pset->idle_count++; > } > - simple_unlock(&pset->idle_lock); > + pset_idle_unlock(); > > return myprocessor->idle_thread; > } > @@ -1736,12 +1746,12 @@ retry: > processor_set_t pset; > > pset = myprocessor->processor_set; > - simple_lock(&pset->idle_lock); > + pset_idle_lock(); > if (myprocessor->state != PROCESSOR_IDLE) { > /* > * Something happened, try again. > */ > - simple_unlock(&pset->idle_lock); > + pset_idle_unlock(); > goto retry; > } > /* > @@ -1753,7 +1763,7 @@ retry: > queue_remove(&pset->idle_queue, myprocessor, > processor_t, processor_queue); > myprocessor->state = PROCESSOR_RUNNING; > - simple_unlock(&pset->idle_lock); > + pset_idle_unlock(); > counter(c_idle_thread_block++); > thread_block(idle_thread_continue); > } > -- > 2.43.0 > > >
-- Samuel --- Pour une évaluation indépendante, transparente et rigoureuse ! Je soutiens la Commission d'Évaluation de l'Inria.