summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortedu <tedu@openbsd.org>2010-06-29 00:28:14 +0000
committertedu <tedu@openbsd.org>2010-06-29 00:28:14 +0000
commit351c20c593075aab5a3342f59ad7ce1e96b7b1ad (patch)
tree6b9506388289e1163b5f5d4dfbb65903555678a4
parentClean up iterface stats handling: (diff)
downloadwireguard-openbsd-351c20c593075aab5a3342f59ad7ce1e96b7b1ad.tar.xz
wireguard-openbsd-351c20c593075aab5a3342f59ad7ce1e96b7b1ad.zip
Eliminate RTHREADS kernel option in favor of a sysctl. The actual status
(not done) hasn't changed, but now it's less work to test things. ok art deraadt
-rw-r--r--sys/kern/exec_elf.c6
-rw-r--r--sys/kern/kern_exit.c9
-rw-r--r--sys/kern/kern_fork.c22
-rw-r--r--sys/kern/kern_prot.c6
-rw-r--r--sys/kern/kern_sig.c27
-rw-r--r--sys/kern/kern_synch.c9
-rw-r--r--sys/kern/kern_sysctl.c7
-rw-r--r--sys/kern/syscalls.master10
-rw-r--r--sys/sys/sysctl.h6
-rw-r--r--sys/sys/systm.h4
10 files changed, 38 insertions, 68 deletions
diff --git a/sys/kern/exec_elf.c b/sys/kern/exec_elf.c
index 882bbd12f4b..7c827e07d60 100644
--- a/sys/kern/exec_elf.c
+++ b/sys/kern/exec_elf.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: exec_elf.c,v 1.73 2010/05/02 11:15:29 kettenis Exp $ */
+/* $OpenBSD: exec_elf.c,v 1.74 2010/06/29 00:28:14 tedu Exp $ */
/*
* Copyright (c) 1996 Per Fogelstrom
@@ -1137,9 +1137,7 @@ ELFNAMEEND(coredump_notes)(struct proc *p, void *iocookie, size_t *sizep)
struct uio uio;
struct elfcore_procinfo cpi;
Elf_Note nhdr;
-#ifdef RTHREADS
struct proc *q;
-#endif
size_t size, notesize;
int error;
@@ -1260,7 +1258,6 @@ ELFNAMEEND(coredump_notes)(struct proc *p, void *iocookie, size_t *sizep)
return (error);
size += notesize;
-#ifdef RTHREADS
/*
* Now, for each thread, write the register info and any other
* per-thread notes. Since we're dumping core, we don't bother
@@ -1274,7 +1271,6 @@ ELFNAMEEND(coredump_notes)(struct proc *p, void *iocookie, size_t *sizep)
return (error);
size += notesize;
}
-#endif
*sizep = size;
#endif
diff --git a/sys/kern/kern_exit.c b/sys/kern/kern_exit.c
index 19e4d30d70f..7cd416720b4 100644
--- a/sys/kern/kern_exit.c
+++ b/sys/kern/kern_exit.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kern_exit.c,v 1.92 2010/05/26 15:16:57 oga Exp $ */
+/* $OpenBSD: kern_exit.c,v 1.93 2010/06/29 00:28:14 tedu Exp $ */
/* $NetBSD: kern_exit.c,v 1.39 1996/04/22 01:38:25 christos Exp $ */
/*
@@ -90,7 +90,6 @@ sys_exit(struct proc *p, void *v, register_t *retval)
return (0);
}
-#ifdef RTHREADS
int
sys_threxit(struct proc *p, void *v, register_t *retval)
{
@@ -98,6 +97,9 @@ sys_threxit(struct proc *p, void *v, register_t *retval)
syscallarg(pid_t *) notdead;
} */ *uap = v;
+ if (!rthreads_enabled)
+ return (EINVAL);
+
if (SCARG(uap, notdead) != NULL) {
pid_t zero = 0;
if (copyout(&zero, SCARG(uap, notdead), sizeof(zero))) {
@@ -108,7 +110,6 @@ sys_threxit(struct proc *p, void *v, register_t *retval)
return (0);
}
-#endif
/*
* Exit: deallocate address space and other resources, change proc state
@@ -126,7 +127,6 @@ exit1(struct proc *p, int rv, int flags)
/* unlink ourselves from the active threads */
TAILQ_REMOVE(&p->p_p->ps_threads, p, p_thr_link);
-#ifdef RTHREADS
if (TAILQ_EMPTY(&p->p_p->ps_threads))
wakeup(&p->p_p->ps_threads);
/*
@@ -159,7 +159,6 @@ exit1(struct proc *p, int rv, int flags)
while (!TAILQ_EMPTY(&p->p_p->ps_threads))
tsleep(&p->p_p->ps_threads, PUSER, "thrdeath", 0);
}
-#endif
if (p->p_flag & P_PROFIL)
stopprofclock(p);
diff --git a/sys/kern/kern_fork.c b/sys/kern/kern_fork.c
index 6721ea107d0..f24d5509cf9 100644
--- a/sys/kern/kern_fork.c
+++ b/sys/kern/kern_fork.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kern_fork.c,v 1.112 2010/06/27 03:26:39 guenther Exp $ */
+/* $OpenBSD: kern_fork.c,v 1.113 2010/06/29 00:28:14 tedu Exp $ */
/* $NetBSD: kern_fork.c,v 1.29 1996/02/09 18:59:34 christos Exp $ */
/*
@@ -192,13 +192,11 @@ fork1(struct proc *p1, int exitsig, int flags, void *stack, size_t stacksize,
/* sanity check some flag combinations */
if (flags & FORK_THREAD)
{
-#ifdef RTHREADS
+ if (!rthreads_enabled)
+ return (ENOTSUP);
if ((flags & (FORK_SIGHAND | FORK_NOZOMBIE)) !=
(FORK_SIGHAND | FORK_NOZOMBIE))
return (EINVAL);
-#else
- return (ENOTSUP);
-#endif
}
if (flags & FORK_SIGHAND && (flags & FORK_SHAREVM) == 0)
return (EINVAL);
@@ -248,7 +246,6 @@ fork1(struct proc *p1, int exitsig, int flags, void *stack, size_t stacksize,
p2->p_exitsig = exitsig;
p2->p_flag = 0;
-#ifdef RTHREADS
if (flags & FORK_THREAD) {
atomic_setbits_int(&p2->p_flag, P_THREAD);
p2->p_p = p1->p_p;
@@ -257,9 +254,6 @@ fork1(struct proc *p1, int exitsig, int flags, void *stack, size_t stacksize,
} else {
process_new(p2, p1);
}
-#else
- process_new(p2, p1);
-#endif
/*
* Make a proc table entry for the new process.
@@ -287,12 +281,9 @@ fork1(struct proc *p1, int exitsig, int flags, void *stack, size_t stacksize,
atomic_setbits_int(&p2->p_flag, p1->p_flag & (P_SUGID | P_SUGIDEXEC));
if (flags & FORK_PTRACE)
atomic_setbits_int(&p2->p_flag, p1->p_flag & P_TRACED);
-#ifdef RTHREADS
if (flags & FORK_THREAD) {
/* nothing */
- } else
-#endif
- {
+ } else {
p2->p_p->ps_cred = pool_get(&pcred_pool, PR_WAITOK);
bcopy(p1->p_p->ps_cred, p2->p_p->ps_cred, sizeof(*p2->p_p->ps_cred));
p2->p_p->ps_cred->p_refcnt = 1;
@@ -317,12 +308,9 @@ fork1(struct proc *p1, int exitsig, int flags, void *stack, size_t stacksize,
* (If PL_SHAREMOD is clear, the structure is shared
* copy-on-write.)
*/
-#ifdef RTHREADS
if (flags & FORK_THREAD) {
/* nothing */
- } else
-#endif
- {
+ } else {
if (p1->p_p->ps_limit->p_lflags & PL_SHAREMOD)
p2->p_p->ps_limit = limcopy(p1->p_p->ps_limit);
else {
diff --git a/sys/kern/kern_prot.c b/sys/kern/kern_prot.c
index 4bc25db975b..d15cf2d0447 100644
--- a/sys/kern/kern_prot.c
+++ b/sys/kern/kern_prot.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kern_prot.c,v 1.42 2010/06/28 23:00:30 guenther Exp $ */
+/* $OpenBSD: kern_prot.c,v 1.43 2010/06/29 00:28:14 tedu Exp $ */
/* $NetBSD: kern_prot.c,v 1.33 1996/02/09 18:59:42 christos Exp $ */
/*
@@ -67,16 +67,16 @@ sys_getpid(struct proc *p, void *v, register_t *retval)
return (0);
}
-#ifdef RTHREADS
/* ARGSUSED */
int
sys_getthrid(struct proc *p, void *v, register_t *retval)
{
+ if (!rthreads_enabled)
+ return (ENOTSUP);
*retval = p->p_pid + (p->p_flag & P_THREAD ? 0 : THREAD_PID_OFFSET);
return (0);
}
-#endif
/* ARGSUSED */
int
diff --git a/sys/kern/kern_sig.c b/sys/kern/kern_sig.c
index 17fca944c86..c7a5f2623c9 100644
--- a/sys/kern/kern_sig.c
+++ b/sys/kern/kern_sig.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kern_sig.c,v 1.109 2010/06/28 23:00:30 guenther Exp $ */
+/* $OpenBSD: kern_sig.c,v 1.110 2010/06/29 00:28:14 tedu Exp $ */
/* $NetBSD: kern_sig.c,v 1.54 1996/04/22 01:38:32 christos Exp $ */
/*
@@ -97,12 +97,10 @@ cansignal(struct proc *p, struct pcred *pc, struct proc *q, int signum)
if (p == q)
return (1); /* process can always signal itself */
-#ifdef RTHREADS
/* a thread can only be signalled from within the same process */
if (q->p_flag & P_THREAD) {
return (p->p_p == q->p_p);
}
-#endif
if (signum == SIGCONT && q->p_session == p->p_session)
return (1); /* SIGCONT in session */
@@ -578,7 +576,6 @@ sys_kill(struct proc *cp, void *v, register_t *retval)
if (SCARG(uap, pid) > 0) {
enum signal_type type = SPROCESS;
-#ifdef RTHREADS
if (SCARG(uap, pid) > THREAD_PID_OFFSET) {
if ((p = pfind(SCARG(uap, pid)
- THREAD_PID_OFFSET)) == NULL)
@@ -586,15 +583,11 @@ sys_kill(struct proc *cp, void *v, register_t *retval)
if (p->p_flag & P_THREAD)
return (ESRCH);
type = STHREAD;
- } else
-#endif
- {
+ } else {
if ((p = pfind(SCARG(uap, pid))) == NULL)
return (ESRCH);
-#ifdef RTHREADS
if (p->p_flag & P_THREAD)
type = STHREAD;
-#endif
}
/* kill single process */
@@ -800,9 +793,7 @@ ptsignal(struct proc *p, int signum, enum signal_type type)
int s, prop;
sig_t action;
int mask;
-#ifdef RTHREADS
struct proc *q;
-#endif
int wakeparent = 0;
#ifdef DIAGNOSTIC
@@ -816,7 +807,6 @@ ptsignal(struct proc *p, int signum, enum signal_type type)
mask = sigmask(signum);
-#ifdef RTHREADS
if (type == SPROCESS) {
TAILQ_FOREACH(q, &p->p_p->ps_threads, p_thr_link) {
/* ignore exiting threads */
@@ -830,7 +820,6 @@ ptsignal(struct proc *p, int signum, enum signal_type type)
}
}
}
-#endif
if (type != SPROPAGATED)
KNOTE(&p->p_p->ps_klist, NOTE_SIGNAL | signum);
@@ -842,15 +831,12 @@ ptsignal(struct proc *p, int signum, enum signal_type type)
*/
if (p->p_flag & P_TRACED)
action = SIG_DFL;
-#ifdef RTHREADS
else if (p->p_sigdivert & mask) {
p->p_sigwait = signum;
atomic_clearbits_int(&p->p_sigdivert, ~0);
action = SIG_CATCH;
wakeup(&p->p_sigdivert);
- }
-#endif
- else {
+ } else {
/*
* If the signal is being ignored,
* then we forget about it immediately.
@@ -892,7 +878,6 @@ ptsignal(struct proc *p, int signum, enum signal_type type)
atomic_setbits_int(&p->p_siglist, mask);
-#ifdef RTHREADS
/*
* XXX delay processing of SA_STOP signals unless action == SIG_DFL?
*/
@@ -902,7 +887,6 @@ ptsignal(struct proc *p, int signum, enum signal_type type)
ptsignal(q, signum, SPROPAGATED);
}
}
-#endif
/*
* Defer further processing for signals which are held,
@@ -1550,7 +1534,6 @@ sys_nosys(struct proc *p, void *v, register_t *retval)
return (ENOSYS);
}
-#ifdef RTHREADS
int
sys_thrsigdivert(struct proc *p, void *v, register_t *retval)
{
@@ -1564,6 +1547,9 @@ sys_thrsigdivert(struct proc *p, void *v, register_t *retval)
long long to_ticks = 0;
int error;
+ if (!rthreads_enabled)
+ return (ENOTSUP);
+
m = NULL;
mask = SCARG(uap, sigmask) &~ sigcantmask;
@@ -1618,7 +1604,6 @@ sys_thrsigdivert(struct proc *p, void *v, register_t *retval)
}
return (error);
}
-#endif
void
initsiginfo(siginfo_t *si, int sig, u_long code, int type, union sigval val)
diff --git a/sys/kern/kern_synch.c b/sys/kern/kern_synch.c
index 6a9b1f57b03..7fdd5e72d2d 100644
--- a/sys/kern/kern_synch.c
+++ b/sys/kern/kern_synch.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kern_synch.c,v 1.94 2010/06/10 17:54:12 deraadt Exp $ */
+/* $OpenBSD: kern_synch.c,v 1.95 2010/06/29 00:28:14 tedu Exp $ */
/* $NetBSD: kern_synch.c,v 1.37 1996/04/22 01:38:37 christos Exp $ */
/*
@@ -402,8 +402,6 @@ sys_sched_yield(struct proc *p, void *v, register_t *retval)
return (0);
}
-#ifdef RTHREADS
-
int
sys_thrsleep(struct proc *p, void *v, register_t *revtal)
{
@@ -419,6 +417,8 @@ sys_thrsleep(struct proc *p, void *v, register_t *revtal)
long long to_ticks = 0;
int error;
+ if (!rthreads_enabled)
+ return (ENOTSUP);
if (SCARG(uap, tp) != NULL) {
struct timespec now, ats;
@@ -468,6 +468,8 @@ sys_thrwakeup(struct proc *p, void *v, register_t *retval)
struct proc *q;
int found = 0;
+ if (!rthreads_enabled)
+ return (ENOTSUP);
TAILQ_FOREACH(q, &p->p_p->ps_threads, p_thr_link) {
if (q->p_thrslpid == ident) {
wakeup_one(&q->p_thrslpid);
@@ -481,4 +483,3 @@ sys_thrwakeup(struct proc *p, void *v, register_t *retval)
return (0);
}
-#endif
diff --git a/sys/kern/kern_sysctl.c b/sys/kern/kern_sysctl.c
index 4306a15f999..125e8334668 100644
--- a/sys/kern/kern_sysctl.c
+++ b/sys/kern/kern_sysctl.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kern_sysctl.c,v 1.184 2010/06/19 14:44:44 thib Exp $ */
+/* $OpenBSD: kern_sysctl.c,v 1.185 2010/06/29 00:28:14 tedu Exp $ */
/* $NetBSD: kern_sysctl.c,v 1.17 1996/05/20 17:49:05 mrg Exp $ */
/*-
@@ -121,6 +121,8 @@ int (*cpu_cpuspeed)(int *);
void (*cpu_setperf)(int);
int perflevel = 100;
+int rthreads_enabled = 0;
+
/*
* Lock to avoid too many processes vslocking a large amount of memory
* at the same time.
@@ -557,6 +559,9 @@ kern_sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp,
case KERN_CPTIME2:
return (sysctl_cptime2(name + 1, namelen -1, oldp, oldlenp,
newp, newlen));
+ case KERN_RTHREADS:
+ return (sysctl_int(oldp, oldlenp, newp, newlen,
+ &rthreads_enabled));
case KERN_CACHEPCT: {
int opct, pgs;
opct = bufcachepercent;
diff --git a/sys/kern/syscalls.master b/sys/kern/syscalls.master
index 4430b4f2fca..b98cce3ccf5 100644
--- a/sys/kern/syscalls.master
+++ b/sys/kern/syscalls.master
@@ -1,4 +1,4 @@
-; $OpenBSD: syscalls.master,v 1.98 2010/01/18 19:09:39 schwarze Exp $
+; $OpenBSD: syscalls.master,v 1.99 2010/06/29 00:28:14 tedu Exp $
; $NetBSD: syscalls.master,v 1.32 1996/04/23 10:24:21 mycroft Exp $
; @(#)syscalls.master 8.2 (Berkeley) 1/13/94
@@ -595,7 +595,6 @@
297 UNIMPL
#endif
298 STD { int sys_sched_yield(void); }
-#ifdef RTHREADS
299 STD { pid_t sys_getthrid(void); }
300 STD { int sys_thrsleep(void *ident, clockid_t clock_id, \
const struct timespec *tp, void *lock); }
@@ -603,13 +602,6 @@
302 STD { void sys_threxit(pid_t *notdead); }
303 STD { int sys_thrsigdivert(sigset_t sigmask, \
siginfo_t *info, const struct timespec *timeout); }
-#else
-299 UNIMPL
-300 UNIMPL
-301 UNIMPL
-302 UNIMPL
-303 UNIMPL
-#endif
304 STD { int sys___getcwd(char *buf, size_t len); }
305 STD { int sys_adjfreq(const int64_t *freq, \
int64_t *oldfreq); }
diff --git a/sys/sys/sysctl.h b/sys/sys/sysctl.h
index 4a53b096621..14c23d18730 100644
--- a/sys/sys/sysctl.h
+++ b/sys/sys/sysctl.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: sysctl.h,v 1.103 2010/06/28 18:50:37 claudio Exp $ */
+/* $OpenBSD: sysctl.h,v 1.104 2010/06/29 00:28:14 tedu Exp $ */
/* $NetBSD: sysctl.h,v 1.16 1996/04/09 20:55:36 cgd Exp $ */
/*
@@ -188,7 +188,8 @@ struct ctlname {
#define KERN_CPTIME2 71 /* array: cp_time2 */
#define KERN_CACHEPCT 72 /* buffer cache % of physmem */
#define KERN_FILE2 73 /* struct: file entries */
-#define KERN_MAXID 74 /* number of valid kern ids */
+#define KERN_RTHREADS 74 /* kernel rthreads support enabled */
+#define KERN_MAXID 75 /* number of valid kern ids */
#define CTL_KERN_NAMES { \
{ 0, 0 }, \
@@ -265,6 +266,7 @@ struct ctlname {
{ "cp_time2", CTLTYPE_STRUCT }, \
{ "bufcachepercent", CTLTYPE_INT }, \
{ "file2", CTLTYPE_STRUCT }, \
+ { "rthreads", CTLTYPE_INT }, \
}
/*
diff --git a/sys/sys/systm.h b/sys/sys/systm.h
index 5b118286d60..c69ddd23b17 100644
--- a/sys/sys/systm.h
+++ b/sys/sys/systm.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: systm.h,v 1.79 2010/04/20 22:05:44 tedu Exp $ */
+/* $OpenBSD: systm.h,v 1.80 2010/06/29 00:28:14 tedu Exp $ */
/* $NetBSD: systm.h,v 1.50 1996/06/09 04:55:09 briggs Exp $ */
/*-
@@ -107,6 +107,8 @@ extern struct vnode *swapdev_vp;/* vnode equivalent to above */
struct proc;
#define curproc curcpu()->ci_curproc
+extern int rthreads_enabled;
+
typedef int sy_call_t(struct proc *, void *, register_t *);
extern struct sysent { /* system call table */