sync with OpenBSD -current

This commit is contained in:
purplerain 2024-07-24 20:05:56 +00:00
parent e0e35f76e8
commit acf2ed1690
Signed by: purplerain
GPG key ID: F42C07F07E2E35B7
32 changed files with 354 additions and 212 deletions

View file

@ -1,4 +1,4 @@
/* $OpenBSD: kern_exit.c,v 1.225 2024/07/22 08:18:53 claudio Exp $ */
/* $OpenBSD: kern_exit.c,v 1.227 2024/07/24 15:30:17 claudio Exp $ */
/* $NetBSD: kern_exit.c,v 1.39 1996/04/22 01:38:25 christos Exp $ */
/*
@ -458,8 +458,6 @@ reaper(void *arg)
WITNESS_THREAD_EXIT(p);
KERNEL_LOCK();
/*
* Free the VM resources we're still holding on to.
* We must do this from a valid thread because doing
@ -470,13 +468,16 @@ reaper(void *arg)
if (p->p_flag & P_THREAD) {
/* Just a thread */
KERNEL_LOCK();
proc_free(p);
KERNEL_UNLOCK();
} else {
struct process *pr = p->p_p;
/* Release the rest of the process's vmspace */
uvm_exit(pr);
KERNEL_LOCK();
if ((pr->ps_flags & PS_NOZOMBIE) == 0) {
/* Process is now a true zombie. */
atomic_setbits_int(&pr->ps_flags, PS_ZOMBIE);
@ -493,9 +494,8 @@ reaper(void *arg)
/* No one will wait for us, just zap it. */
process_zap(pr);
}
KERNEL_UNLOCK();
}
KERNEL_UNLOCK();
}
}
@ -550,10 +550,9 @@ loop:
return (0);
}
if ((options & WTRAPPED) &&
pr->ps_flags & PS_TRACED &&
(pr->ps_flags & PS_TRACED) &&
(pr->ps_flags & PS_WAITED) == 0 && pr->ps_single &&
pr->ps_single->p_stat == SSTOP &&
(pr->ps_single->p_flag & P_SUSPSINGLE) == 0) {
pr->ps_single->p_stat == SSTOP) {
if (single_thread_wait(pr, 0))
goto loop;
@ -578,8 +577,8 @@ loop:
if (p->p_stat == SSTOP &&
(pr->ps_flags & PS_WAITED) == 0 &&
(p->p_flag & P_SUSPSINGLE) == 0 &&
(pr->ps_flags & PS_TRACED ||
options & WUNTRACED)) {
((pr->ps_flags & PS_TRACED) ||
(options & WUNTRACED))) {
if ((options & WNOWAIT) == 0)
atomic_setbits_int(&pr->ps_flags, PS_WAITED);

View file

@ -1,4 +1,4 @@
/* $OpenBSD: kern_sig.c,v 1.333 2024/07/22 09:43:47 claudio Exp $ */
/* $OpenBSD: kern_sig.c,v 1.334 2024/07/24 15:31:08 claudio Exp $ */
/* $NetBSD: kern_sig.c,v 1.54 1996/04/22 01:38:32 christos Exp $ */
/*
@ -2164,6 +2164,7 @@ single_thread_set(struct proc *p, int flags)
panic("single_thread_mode = %d", mode);
#endif
}
KASSERT((p->p_flag & P_SUSPSINGLE) == 0);
pr->ps_single = p;
pr->ps_singlecnt = pr->ps_threadcnt;
@ -2233,6 +2234,7 @@ single_thread_wait(struct process *pr, int recheck)
if (!recheck)
break;
}
KASSERT((pr->ps_single->p_flag & P_SUSPSINGLE) == 0);
mtx_leave(&pr->ps_mtx);
return wait;

View file

@ -1,4 +1,4 @@
/* $OpenBSD: kern_synch.c,v 1.205 2024/06/03 12:48:25 claudio Exp $ */
/* $OpenBSD: kern_synch.c,v 1.206 2024/07/23 08:38:02 claudio Exp $ */
/* $NetBSD: kern_synch.c,v 1.37 1996/04/22 01:38:37 christos Exp $ */
/*
@ -62,7 +62,7 @@
#include <sys/ktrace.h>
#endif
int sleep_signal_check(void);
int sleep_signal_check(struct proc *);
int thrsleep(struct proc *, struct sys___thrsleep_args *);
int thrsleep_unlock(void *);
@ -385,7 +385,7 @@ sleep_finish(int timo, int do_sleep)
* we must be ready for sleep when sleep_signal_check() is
* called.
*/
if ((error = sleep_signal_check()) != 0) {
if ((error = sleep_signal_check(p)) != 0) {
catch = 0;
do_sleep = 0;
}
@ -438,7 +438,7 @@ sleep_finish(int timo, int do_sleep)
/* Check if thread was woken up because of a unwind or signal */
if (catch != 0)
error = sleep_signal_check();
error = sleep_signal_check(p);
/* Signal errors are higher priority than timeouts. */
if (error == 0 && error1 != 0)
@ -451,9 +451,8 @@ sleep_finish(int timo, int do_sleep)
* Check and handle signals and suspensions around a sleep cycle.
*/
int
sleep_signal_check(void)
sleep_signal_check(struct proc *p)
{
struct proc *p = curproc;
struct sigctx ctx;
int err, sig;

View file

@ -1,4 +1,4 @@
/* $OpenBSD: subr_log.c,v 1.78 2023/09/22 20:03:05 mvs Exp $ */
/* $OpenBSD: subr_log.c,v 1.79 2024/07/24 13:37:05 claudio Exp $ */
/* $NetBSD: subr_log.c,v 1.11 1996/03/30 22:24:44 christos Exp $ */
/*
@ -73,10 +73,11 @@
/*
* Locking:
* L log_mtx
* Q log_kq_mtx
*/
struct logsoftc {
int sc_state; /* [L] see above for possibilities */
struct klist sc_klist; /* process waiting on kevent call */
struct klist sc_klist; /* [Q] process waiting on kevent call */
struct sigio_ref sc_sigio; /* async I/O registration */
int sc_need_wakeup; /* if set, wake up waiters */
struct timeout sc_tick; /* wakeup poll timeout */
@ -97,6 +98,8 @@ struct rwlock syslogf_rwlock = RWLOCK_INITIALIZER("syslogf");
*/
struct mutex log_mtx =
MUTEX_INITIALIZER_FLAGS(IPL_HIGH, "logmtx", MTX_NOWITNESS);
struct mutex log_kq_mtx =
MUTEX_INITIALIZER_FLAGS(IPL_HIGH, "logkqmtx", MTX_NOWITNESS);
void filt_logrdetach(struct knote *kn);
int filt_logread(struct knote *kn, long hint);
@ -208,7 +211,7 @@ logopen(dev_t dev, int flags, int mode, struct proc *p)
if (log_open)
return (EBUSY);
log_open = 1;
klist_init_mutex(&logsoftc.sc_klist, &log_mtx);
klist_init_mutex(&logsoftc.sc_klist, &log_kq_mtx);
sigio_init(&logsoftc.sc_sigio);
timeout_set(&logsoftc.sc_tick, logtick, NULL);
timeout_add_msec(&logsoftc.sc_tick, LOG_TICK);
@ -336,7 +339,9 @@ filt_logread(struct knote *kn, long hint)
{
struct msgbuf *mbp = kn->kn_hook;
mtx_enter(&log_mtx);
kn->kn_data = msgbuf_getlen(mbp);
mtx_leave(&log_mtx);
return (kn->kn_data != 0);
}
@ -345,9 +350,9 @@ filt_logmodify(struct kevent *kev, struct knote *kn)
{
int active;
mtx_enter(&log_mtx);
mtx_enter(&log_kq_mtx);
active = knote_modify(kev, kn);
mtx_leave(&log_mtx);
mtx_leave(&log_kq_mtx);
return (active);
}
@ -357,9 +362,9 @@ filt_logprocess(struct knote *kn, struct kevent *kev)
{
int active;
mtx_enter(&log_mtx);
mtx_enter(&log_kq_mtx);
active = knote_process(kn, kev);
mtx_leave(&log_mtx);
mtx_leave(&log_kq_mtx);
return (active);
}
@ -404,9 +409,10 @@ logtick(void *arg)
state = logsoftc.sc_state;
if (logsoftc.sc_state & LOG_RDWAIT)
logsoftc.sc_state &= ~LOG_RDWAIT;
knote_locked(&logsoftc.sc_klist, 0);
mtx_leave(&log_mtx);
knote(&logsoftc.sc_klist, 0);
if (state & LOG_ASYNC)
pgsigio(&logsoftc.sc_sigio, SIGIO, 0);
if (state & LOG_RDWAIT)