summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/kern/kern_sig.c33
-rw-r--r--sys/kern/sys_generic.c7
-rw-r--r--sys/kern/uipc_syscalls.c7
3 files changed, 24 insertions, 23 deletions
diff --git a/sys/kern/kern_sig.c b/sys/kern/kern_sig.c
index f37e2c774b9..e8e45c9517b 100644
--- a/sys/kern/kern_sig.c
+++ b/sys/kern/kern_sig.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kern_sig.c,v 1.346 2024/11/05 06:03:19 jsg Exp $ */
+/* $OpenBSD: kern_sig.c,v 1.347 2024/11/05 09:14:19 claudio Exp $ */
/* $NetBSD: kern_sig.c,v 1.54 1996/04/22 01:38:32 christos Exp $ */
/*
@@ -124,6 +124,8 @@ void postsig_done(struct proc *, int, sigset_t, int);
void postsig(struct proc *, int, struct sigctx *);
int cansignal(struct proc *, struct process *, int);
+void ptsignal_locked(struct proc *, int, enum signal_type);
+
struct pool sigacts_pool; /* memory pool for sigacts structures */
void sigio_del(struct sigiolst *);
@@ -877,9 +879,7 @@ trapsignal(struct proc *p, int signum, u_long trapno, int code,
sigexit(p, signum);
/* NOTREACHED */
}
- KERNEL_LOCK();
ptsignal(p, signum, STHREAD);
- KERNEL_UNLOCK();
}
}
@@ -905,11 +905,14 @@ psignal(struct proc *p, int signum)
void
prsignal(struct process *pr, int signum)
{
+ mtx_enter(&pr->ps_mtx);
/* Ignore signal if the target process is exiting */
if (pr->ps_flags & PS_EXITING) {
+ mtx_leave(&pr->ps_mtx);
return;
}
- ptsignal(TAILQ_FIRST(&pr->ps_threads), signum, SPROCESS);
+ ptsignal_locked(TAILQ_FIRST(&pr->ps_threads), signum, SPROCESS);
+ mtx_leave(&pr->ps_mtx);
}
/*
@@ -920,6 +923,16 @@ prsignal(struct process *pr, int signum)
void
ptsignal(struct proc *p, int signum, enum signal_type type)
{
+ struct process *pr = p->p_p;
+
+ mtx_enter(&pr->ps_mtx);
+ ptsignal_locked(p, signum, type);
+ mtx_leave(&pr->ps_mtx);
+}
+
+void
+ptsignal_locked(struct proc *p, int signum, enum signal_type type)
+{
int prop;
sig_t action, altaction = SIG_DFL;
sigset_t mask, sigmask;
@@ -928,7 +941,7 @@ ptsignal(struct proc *p, int signum, enum signal_type type)
struct proc *q;
int wakeparent = 0;
- KERNEL_ASSERT_LOCKED();
+ MUTEX_ASSERT_LOCKED(&pr->ps_mtx);
#ifdef DIAGNOSTIC
if ((u_int)signum >= NSIG || signum == 0)
@@ -998,7 +1011,7 @@ ptsignal(struct proc *p, int signum, enum signal_type type)
}
if (type != SPROPAGATED)
- knote(&pr->ps_klist, NOTE_SIGNAL | signum);
+ knote_locked(&pr->ps_klist, NOTE_SIGNAL | signum);
prop = sigprop[signum];
@@ -1017,10 +1030,8 @@ ptsignal(struct proc *p, int signum, enum signal_type type)
* and if it is set to SIG_IGN,
* action will be SIG_DFL here.)
*/
- mtx_enter(&pr->ps_mtx);
sigignore = pr->ps_sigacts->ps_sigignore;
sigcatch = pr->ps_sigacts->ps_sigcatch;
- mtx_leave(&pr->ps_mtx);
if (sigignore & mask)
return;
@@ -1061,7 +1072,7 @@ ptsignal(struct proc *p, int signum, enum signal_type type)
if (prop & (SA_CONT | SA_STOP) && type != SPROPAGATED)
TAILQ_FOREACH(q, &pr->ps_threads, p_thr_link)
if (q != p)
- ptsignal(q, signum, SPROPAGATED);
+ ptsignal_locked(q, signum, SPROPAGATED);
SCHED_LOCK();
@@ -2020,15 +2031,11 @@ userret(struct proc *p)
/* send SIGPROF or SIGVTALRM if their timers interrupted this thread */
if (p->p_flag & P_PROFPEND) {
atomic_clearbits_int(&p->p_flag, P_PROFPEND);
- KERNEL_LOCK();
psignal(p, SIGPROF);
- KERNEL_UNLOCK();
}
if (p->p_flag & P_ALRMPEND) {
atomic_clearbits_int(&p->p_flag, P_ALRMPEND);
- KERNEL_LOCK();
psignal(p, SIGVTALRM);
- KERNEL_UNLOCK();
}
if (SIGPENDING(p) != 0) {
diff --git a/sys/kern/sys_generic.c b/sys/kern/sys_generic.c
index 935962c3eba..72014d5faaf 100644
--- a/sys/kern/sys_generic.c
+++ b/sys/kern/sys_generic.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sys_generic.c,v 1.158 2024/08/12 19:32:05 anton Exp $ */
+/* $OpenBSD: sys_generic.c,v 1.159 2024/11/05 09:14:19 claudio Exp $ */
/* $NetBSD: sys_generic.c,v 1.24 1996/03/29 00:25:32 cgd Exp $ */
/*
@@ -382,11 +382,8 @@ dofilewritev(struct proc *p, int fd, struct uio *uio, int flags,
if (uio->uio_resid != cnt && (error == ERESTART ||
error == EINTR || error == EWOULDBLOCK))
error = 0;
- if (error == EPIPE) {
- KERNEL_LOCK();
+ if (error == EPIPE)
ptsignal(p, SIGPIPE, STHREAD);
- KERNEL_UNLOCK();
- }
}
cnt -= uio->uio_resid;
diff --git a/sys/kern/uipc_syscalls.c b/sys/kern/uipc_syscalls.c
index 1ad1b7941d6..6d8b5ff4da9 100644
--- a/sys/kern/uipc_syscalls.c
+++ b/sys/kern/uipc_syscalls.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: uipc_syscalls.c,v 1.219 2024/04/25 17:32:53 bluhm Exp $ */
+/* $OpenBSD: uipc_syscalls.c,v 1.220 2024/11/05 09:14:19 claudio Exp $ */
/* $NetBSD: uipc_syscalls.c,v 1.19 1996/02/09 19:00:48 christos Exp $ */
/*
@@ -788,11 +788,8 @@ sendit(struct proc *p, int s, struct msghdr *mp, int flags, register_t *retsize)
if (auio.uio_resid != len && (error == ERESTART ||
error == EINTR || error == EWOULDBLOCK))
error = 0;
- if (error == EPIPE && (flags & MSG_NOSIGNAL) == 0) {
- KERNEL_LOCK();
+ if (error == EPIPE && (flags & MSG_NOSIGNAL) == 0)
ptsignal(p, SIGPIPE, STHREAD);
- KERNEL_UNLOCK();
- }
}
if (error == 0) {
*retsize = len - auio.uio_resid;