Date: Fri, 24 Jun 2022 19:36:57 GMT From: Konstantin Belousov <kib@FreeBSD.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org Subject: git: ed770595b084 - stable/13 - thread_single: wait for P_STOPPED_SINGLE to pass Message-ID: <202206241936.25OJav40084211@gitrepo.freebsd.org>
next in thread | raw e-mail | index | archive | help
The branch stable/13 has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=ed770595b08464f1422c86a3801d2d208a32e388 commit ed770595b08464f1422c86a3801d2d208a32e388 Author: Konstantin Belousov <kib@FreeBSD.org> AuthorDate: 2022-05-03 19:48:50 +0000 Commit: Konstantin Belousov <kib@FreeBSD.org> CommitDate: 2022-06-24 14:45:45 +0000 thread_single: wait for P_STOPPED_SINGLE to pass (cherry picked from commit d7a9e6e74067f70eeec74dcd64a9bcc851503a6e) --- sys/kern/kern_thread.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/sys/kern/kern_thread.c b/sys/kern/kern_thread.c index c56465835b3d..5e32a8be8f4e 100644 --- a/sys/kern/kern_thread.c +++ b/sys/kern/kern_thread.c @@ -1195,10 +1195,18 @@ thread_single(struct proc *p, int mode) mtx_assert(&Giant, MA_NOTOWNED); PROC_LOCK_ASSERT(p, MA_OWNED); - if ((p->p_flag & P_HADTHREADS) == 0 && mode != SINGLE_ALLPROC) + /* + * Is someone already single threading? + * Or may be singlethreading is not needed at all. + */ + if (mode == SINGLE_ALLPROC) { + while ((p->p_flag & P_STOPPED_SINGLE) != 0) { + if ((p->p_flag2 & P2_WEXIT) != 0) + return (1); + msleep(&p->p_flag, &p->p_mtx, PCATCH, "thrsgl", 0); + } + } else if ((p->p_flag & P_HADTHREADS) == 0) return (0); - - /* Is someone already single threading? */ if (p->p_singlethread != NULL && p->p_singlethread != td) return (1); @@ -1657,6 +1665,7 @@ thread_single_end(struct proc *p, int mode) PROC_SUNLOCK(p); if (wakeup_swapper) kick_proc0(); + wakeup(&p->p_flag); } /*
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202206241936.25OJav40084211>