On Thu, Mar 04, 2021 at 10:28:50AM +0100, Martin Pieuchot wrote:
> SINGLE_PTRACE has almost the same semantic as SINGLE_SUSPEND. The
> difference is that there's no need to wait for other threads to be
> parked.
>
> Diff below changes single_thread_set() to be explicit when waiting is
> required. This allows us to get rid of SINGLE_PTRACE now and soon to
> use SINGLE_SUSPEND around proc_stop(), even when the thread is not being
> traced.
>
> ok?
>
> @@ -2000,14 +2000,12 @@ single_thread_check(struct proc *p, int
> * where the other threads should stop:
> * - SINGLE_SUSPEND: stop wherever they are, will later either be told to
> exit
> * (by setting to SINGLE_EXIT) or be released (via single_thread_clear())
> - * - SINGLE_PTRACE: stop wherever they are, will wait for them to stop
> - * later (via single_thread_wait()) and released as with SINGLE_SUSPEND
> * - SINGLE_UNWIND: just unwind to kernel boundary, will be told to exit
> * or released as with SINGLE_SUSPEND
> * - SINGLE_EXIT: unwind to kernel boundary and exit
> */
> int
> -single_thread_set(struct proc *p, enum single_thread_mode mode, int deep)
> +single_thread_set(struct proc *p, enum single_thread_mode mode, int wait)
> {
> struct process *pr = p->p_p;
> struct proc *q;
> @@ -2016,7 +2014,7 @@ single_thread_set(struct proc *p, enum s
> KASSERT(curproc == p);
>
> SCHED_LOCK(s);
> - error = single_thread_check_locked(p, deep, s);
> + error = single_thread_check_locked(p, (mode == SINGLE_UNWIND), s);
Either the comment above or the code itself are not correct.
SINGLE_EXIT is also supposed to unwind according to comment.
--
:wq Claudio