aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2022-04-23 22:55:04 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2022-04-27 23:27:35 +0000
commit2e7595ef2f53f6debec3c3d89bb9e0cd10394ed3 (patch)
treec35d1eccd728a4519b86619aea348aa05ea94f3a
parent54a11adbd9c2b1fa9b42181ac883ed6ed2a6998c (diff)
downloadsrc-2e7595ef2f53f6debec3c3d89bb9e0cd10394ed3.tar.gz
src-2e7595ef2f53f6debec3c3d89bb9e0cd10394ed3.zip
Add stop_all_proc_block(9)
It allows to have more than one consumer of thread_signle(SIGNLE_ALLPROC) by serializing them. Reviewed by: markj Tested by: pho Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D35014
-rw-r--r--sys/kern/kern_proc.c19
-rw-r--r--sys/sys/proc.h2
2 files changed, 21 insertions, 0 deletions
diff --git a/sys/kern/kern_proc.c b/sys/kern/kern_proc.c
index d5aae09f2c4e..cd528d47830d 100644
--- a/sys/kern/kern_proc.c
+++ b/sys/kern/kern_proc.c
@@ -3396,6 +3396,21 @@ static SYSCTL_NODE(_kern_proc, KERN_PROC_VM_LAYOUT, vm_layout, CTLFLAG_RD |
CTLFLAG_ANYBODY | CTLFLAG_MPSAFE, sysctl_kern_proc_vm_layout,
"Process virtual address space layout info");
+static struct sx stop_all_proc_blocker;
+SX_SYSINIT(stop_all_proc_blocker, &stop_all_proc_blocker, "sapblk");
+
+void
+stop_all_proc_block(void)
+{
+ sx_xlock(&stop_all_proc_blocker);
+}
+
+void
+stop_all_proc_unblock(void)
+{
+ sx_xunlock(&stop_all_proc_blocker);
+}
+
int allproc_gen;
/*
@@ -3411,6 +3426,8 @@ stop_all_proc(void)
int r, gen;
bool restart, seen_stopped, seen_exiting, stopped_some;
+ stop_all_proc_block();
+
cp = curproc;
allproc_loop:
sx_xlock(&allproc_lock);
@@ -3502,6 +3519,8 @@ again:
goto again;
}
sx_xunlock(&allproc_lock);
+
+ stop_all_proc_unblock();
}
/* #define TOTAL_STOP_DEBUG 1 */
diff --git a/sys/sys/proc.h b/sys/sys/proc.h
index 2556fd574d84..223714724aca 100644
--- a/sys/sys/proc.h
+++ b/sys/sys/proc.h
@@ -1232,6 +1232,8 @@ void thread_unlink(struct thread *td);
void thread_unsuspend(struct proc *p);
void thread_wait(struct proc *p);
+void stop_all_proc_block(void);
+void stop_all_proc_unblock(void);
void stop_all_proc(void);
void resume_all_proc(void);