[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH gnumach] kern: Use _nocheck variants of locks taken at splsch
From: |
Samuel Thibault |
Subject: |
Re: [PATCH gnumach] kern: Use _nocheck variants of locks taken at splsched() |
Date: |
Fri, 23 Feb 2024 14:05:04 +0100 |
User-agent: |
NeoMutt/20170609 (1.8.3) |
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.