On Sat, Oct 2, 2021 at 8:57 AM Martin Pieuchot <[email protected]> wrote:

> When a thread running on a CPU schedules itself out, it does the following
> (pseudo_code):
>
>         SCHED_LOCK()
>         curproc->p_stat = SSLEEP;
>         // some more operations
>         mi_switch()
>
> The problem with this is that any instrumentation between setting `p_stat'
> and cpu_switchto() is incorrect because 'curproc' is still being executed
> and is not yet sleeping.  Its `p_stat' should be SONPROC and not SSLEEP.
>
...

> To fix this we should set `p_stat' as late a possible, diff below does that
> just before calling cpu_switchto().
>
...

> --- kern/kern_sig.c     28 Sep 2021 10:00:18 -0000      1.283
> +++ kern/kern_sig.c     2 Oct 2021 17:00:52 -0000
> @@ -1347,7 +1347,6 @@ proc_stop(struct proc *p, int sw)
>         SCHED_ASSERT_LOCKED();
>  #endif
>
> -       p->p_stat = SSTOP;
>         atomic_clearbits_int(&pr->ps_flags, PS_WAITED);
>         atomic_setbits_int(&pr->ps_flags, PS_STOPPED);
>         atomic_setbits_int(&p->p_flag, P_SUSPSIG);
> @@ -1357,7 +1356,7 @@ proc_stop(struct proc *p, int sw)
>          */
>         softintr_schedule(proc_stop_si);
>         if (sw)
> -               mi_switch();
> +               mi_switch(SSTOP);
>

This pair of chunks is wrong, as then the proc_stop(p, 0) call in
ptsignal() doesn't change the process from SSLEEP to SSTOP.  Sending a stop
signal to a blocked process needs to change its state.


Philip Guenther

Reply via email to