On 04/03/21(Thu) 10:36, Claudio Jeker wrote: > 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.
The comment documents what sibling threads are supposed to do once the current one has called single_thread_set() with a given SINGLE_* option. Sibling threads will continue to execute until the next parking point where single_thread_check() are. Parking points are divided in two categories. In the "deep" ones unwinding is preferred for UNWIND and EXIT, in the others only context switching occurs. Every single_thread_set() call is in itself a parking point to prevent races. The only "deap" parking point is the one in sys_execve() for obvious reasons. So maybe we should rename SINGLE_UNWIND into SINGLE_EXEC, would that be clearer? If we go this road we might want to rename SINGLE_SUSPEND to SINGLE_STOP to better describe the reason for parking sibling threads.