sync with OpenBSD -current
This commit is contained in:
parent
e0e35f76e8
commit
acf2ed1690
32 changed files with 354 additions and 212 deletions
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue