diff options
author | 2019-01-29 14:07:15 +0000 | |
---|---|---|
committer | 2019-01-29 14:07:15 +0000 | |
commit | 0f480091d8523948214daddaa14322b7d3ff38ab (patch) | |
tree | 2f8b450e109d4819ab39a9b106fc4575443ae041 | |
parent | Reuse copy_satopfaddr() when killing entries (diff) | |
download | wireguard-openbsd-0f480091d8523948214daddaa14322b7d3ff38ab.tar.xz wireguard-openbsd-0f480091d8523948214daddaa14322b7d3ff38ab.zip |
Add a dedicated sysctl(2) node for witness(4).
The new node contains the subsystem's main control variable,
kern.witness.watch. It is aliased by the old name, kern.witnesswatch.
The alias will be removed in the future.
OK anton@ mpi@
-rw-r--r-- | lib/libc/sys/sysctl.2 | 19 | ||||
-rw-r--r-- | sbin/sysctl/sysctl.c | 29 | ||||
-rw-r--r-- | share/man/man4/witness.4 | 6 | ||||
-rw-r--r-- | sys/kern/kern_sysctl.c | 6 | ||||
-rw-r--r-- | sys/kern/subr_witness.c | 23 | ||||
-rw-r--r-- | sys/sys/sysctl.h | 17 | ||||
-rw-r--r-- | sys/sys/witness.h | 3 |
7 files changed, 89 insertions, 14 deletions
diff --git a/lib/libc/sys/sysctl.2 b/lib/libc/sys/sysctl.2 index 733bb8c6f0b..084009dee79 100644 --- a/lib/libc/sys/sysctl.2 +++ b/lib/libc/sys/sysctl.2 @@ -1,4 +1,4 @@ -.\" $OpenBSD: sysctl.2,v 1.20 2019/01/22 00:04:26 ajacoutot Exp $ +.\" $OpenBSD: sysctl.2,v 1.21 2019/01/29 14:07:15 visa Exp $ .\" .\" Copyright (c) 1993 .\" The Regents of the University of California. All rights reserved. @@ -27,7 +27,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.Dd $Mdocdate: January 22 2019 $ +.Dd $Mdocdate: January 29 2019 $ .Dt SYSCTL 2 .Os .Sh NAME @@ -489,7 +489,7 @@ information. .It Dv KERN_TTYCOUNT Ta "integer" Ta "no" .It Dv KERN_VERSION Ta "string" Ta "no" .It Dv KERN_WATCHDOG Ta "node" Ta "not applicable" -.It Dv KERN_WITNESSWATCH Ta "integer" Ta "yes" +.It Dv KERN_WITNESS Ta "node" Ta "not applicable" .It Dv KERN_WXABORT Ta "integer" Ta "yes" .El .Bl -tag -width "123456" @@ -1102,7 +1102,17 @@ variable. The period of the watchdog timer in seconds. Set to 0 to disable the watchdog timer. .El -.It Dv KERN_WITNESSWATCH Pq Va kern.witnesswatch +.It Dv KERN_WITNESS Pq Va kern.witness +Control settings of +.Xr witness 4 . +.Bl -column "KERN_WITNESS_WATCH" "integer" "Changeable" -offset indent +.It Sy "Third level name" Ta Sy "Type" Ta Sy "Changeable" +.It Dv KERN_WITNESS_WATCH Ta "integer" Ta "yes" +.El +.Pp +The variables are as follows: +.Bl -tag -width "123456" +.It Dv KERN_WITNESS_WATCH Pq Va kern.witness.watch Control how .Xr witness 4 behaves on error. @@ -1124,6 +1134,7 @@ and a stack trace if possible. .It 3 The same as 2, but also drop into the kernel debugger. .El +.El .It Dv KERN_WXABORT Pq Va kern.wxabort Generate an abort, rather than returning an error, diff --git a/sbin/sysctl/sysctl.c b/sbin/sysctl/sysctl.c index 8bd235d9226..cd2be30f80e 100644 --- a/sbin/sysctl/sysctl.c +++ b/sbin/sysctl/sysctl.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sysctl.c,v 1.239 2018/12/10 13:35:54 landry Exp $ */ +/* $OpenBSD: sysctl.c,v 1.240 2019/01/29 14:07:15 visa Exp $ */ /* $NetBSD: sysctl.c,v 1.9 1995/09/30 07:12:50 thorpej Exp $ */ /* @@ -130,6 +130,7 @@ struct ctlname machdepname[] = CTL_MACHDEP_NAMES; #endif struct ctlname ddbname[] = CTL_DDB_NAMES; struct ctlname audioname[] = CTL_KERN_AUDIO_NAMES; +struct ctlname witnessname[] = CTL_KERN_WITNESS_NAMES; char names[BUFSIZ]; int lastused; @@ -214,6 +215,7 @@ void print_sensor(struct sensor *); int sysctl_chipset(char *, char **, int *, int, int *); #endif int sysctl_audio(char *, char **, int *, int, int *); +int sysctl_witness(char *, char **, int *, int, int *); void vfsinit(void); char *equ = "="; @@ -502,6 +504,11 @@ parse(char *string, int flags) if (len < 0) return; break; + case KERN_WITNESS: + len = sysctl_witness(string, &bufp, mib, flags, &type); + if (len < 0) + return; + break; } break; @@ -1717,6 +1724,7 @@ struct list shmlist = { shmname, KERN_SHMINFO_MAXID }; struct list watchdoglist = { watchdogname, KERN_WATCHDOG_MAXID }; struct list tclist = { tcname, KERN_TIMECOUNTER_MAXID }; struct list audiolist = { audioname, KERN_AUDIO_MAXID }; +struct list witnesslist = { witnessname, KERN_WITNESS_MAXID }; /* * handle vfs namei cache statistics @@ -2720,6 +2728,25 @@ sysctl_audio(char *string, char **bufpp, int mib[], int flags, int *typep) } /* + * Handle witness support + */ +int +sysctl_witness(char *string, char **bufpp, int mib[], int flags, int *typep) +{ + int indx; + + if (*bufpp == NULL) { + listall(string, &witnesslist); + return (-1); + } + if ((indx = findname(string, "third", bufpp, &witnesslist)) == -1) + return (-1); + mib[2] = indx; + *typep = witnesslist.list[indx].ctl_type; + return (3); +} + +/* * Scan a list of names searching for a particular name. */ int diff --git a/share/man/man4/witness.4 b/share/man/man4/witness.4 index 6869960cc55..bcdfe6699ee 100644 --- a/share/man/man4/witness.4 +++ b/share/man/man4/witness.4 @@ -1,4 +1,4 @@ -.\" $OpenBSD: witness.4,v 1.4 2018/05/16 14:58:48 visa Exp $ +.\" $OpenBSD: witness.4,v 1.5 2019/01/29 14:07:15 visa Exp $ .\" .\" Copyright (c) 2001 John H. Baldwin <jhb@FreeBSD.org> .\" All rights reserved. @@ -26,7 +26,7 @@ .\" .\" $FreeBSD: head/share/man/man4/witness.4 301719 2016-06-09 06:55:00Z trasz $ .\" -.Dd $Mdocdate: May 16 2018 $ +.Dd $Mdocdate: January 29 2019 $ .Dt WITNESS 4 .Os .Sh NAME @@ -55,7 +55,7 @@ If any of these checks fail, then the kernel will panic. The behaviour of .Nm is controlled by the -.Va kern.witnesswatch +.Va kern.witness.watch .Xr sysctl 8 variable. Valid values for it are: diff --git a/sys/kern/kern_sysctl.c b/sys/kern/kern_sysctl.c index 243f92657a9..93bbb5019b3 100644 --- a/sys/kern/kern_sysctl.c +++ b/sys/kern/kern_sysctl.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kern_sysctl.c,v 1.353 2019/01/19 01:53:44 cheloha Exp $ */ +/* $OpenBSD: kern_sysctl.c,v 1.354 2019/01/29 14:07:15 visa Exp $ */ /* $NetBSD: kern_sysctl.c,v 1.17 1996/05/20 17:49:05 mrg Exp $ */ /*- @@ -311,6 +311,7 @@ kern_sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp, case KERN_TIMECOUNTER: case KERN_CPTIME2: case KERN_FILE: + case KERN_WITNESS: case KERN_AUDIO: case KERN_CPUSTATS: break; @@ -655,6 +656,9 @@ kern_sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp, #ifdef WITNESS case KERN_WITNESSWATCH: return witness_sysctl_watch(oldp, oldlenp, newp, newlen); + case KERN_WITNESS: + return witness_sysctl(name + 1, namelen - 1, oldp, oldlenp, + newp, newlen); #endif #if NAUDIO > 0 case KERN_AUDIO: diff --git a/sys/kern/subr_witness.c b/sys/kern/subr_witness.c index d4b455eadd8..725a5cd0301 100644 --- a/sys/kern/subr_witness.c +++ b/sys/kern/subr_witness.c @@ -1,4 +1,4 @@ -/* $OpenBSD: subr_witness.c,v 1.26 2019/01/27 10:41:41 anton Exp $ */ +/* $OpenBSD: subr_witness.c,v 1.27 2019/01/29 14:07:15 visa Exp $ */ /*- * Copyright (c) 2008 Isilon Systems, Inc. @@ -2551,6 +2551,27 @@ witness_debugger(int dump) } int +witness_sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, + void *newp, size_t newlen) +{ + int error; + + if (namelen != 1) + return (ENOTDIR); + + switch (name[0]) { + case KERN_WITNESS_WATCH: + error = witness_sysctl_watch(oldp, oldlenp, newp, newlen); + break; + default: + error = EOPNOTSUPP; + break; + } + + return (error); +} + +int witness_sysctl_watch(void *oldp, size_t *oldlenp, void *newp, size_t newlen) { int error; diff --git a/sys/sys/sysctl.h b/sys/sys/sysctl.h index 14df56d0eb6..2a8ff365a74 100644 --- a/sys/sys/sysctl.h +++ b/sys/sys/sysctl.h @@ -1,4 +1,4 @@ -/* $OpenBSD: sysctl.h,v 1.181 2018/11/19 16:12:06 tedu Exp $ */ +/* $OpenBSD: sysctl.h,v 1.182 2019/01/29 14:07:15 visa Exp $ */ /* $NetBSD: sysctl.h,v 1.16 1996/04/09 20:55:36 cgd Exp $ */ /* @@ -160,7 +160,7 @@ struct ctlname { #define KERN_TTYCOUNT 57 /* int: number of tty devices */ #define KERN_NUMVNODES 58 /* int: number of vnodes in use */ #define KERN_MBSTAT 59 /* struct: mbuf statistics */ -/* was KERN_USERASYMCRYPTO 60 */ +#define KERN_WITNESS 60 /* node: witness */ #define KERN_SEMINFO 61 /* struct: SysV struct seminfo */ #define KERN_SHMINFO 62 /* struct: SysV struct shminfo */ #define KERN_INTRCNT 63 /* node: interrupt counters */ @@ -249,7 +249,7 @@ struct ctlname { { "ttycount", CTLTYPE_INT }, \ { "numvnodes", CTLTYPE_INT }, \ { "mbstat", CTLTYPE_STRUCT }, \ - { "gap", 0 }, \ + { "witness", CTLTYPE_NODE }, \ { "seminfo", CTLTYPE_STRUCT }, \ { "shminfo", CTLTYPE_STRUCT }, \ { "intrcnt", CTLTYPE_NODE }, \ @@ -317,6 +317,17 @@ struct ctlname { } /* + * KERN_WITNESS + */ +#define KERN_WITNESS_WATCH 1 /* int: operating mode */ +#define KERN_WITNESS_MAXID 2 + +#define CTL_KERN_WITNESS_NAMES { \ + { 0, 0 }, \ + { "watch", CTLTYPE_INT }, \ +} + +/* * KERN_PROC subtype ops return arrays of relatively fixed size * structures of process info. Use 8 byte alignment, and new * elements should only be added to the end of this structure so diff --git a/sys/sys/witness.h b/sys/sys/witness.h index 8ef6aef68e0..312bec0d47d 100644 --- a/sys/sys/witness.h +++ b/sys/sys/witness.h @@ -1,4 +1,4 @@ -/* $OpenBSD: witness.h,v 1.3 2018/06/08 15:38:15 guenther Exp $ */ +/* $OpenBSD: witness.h,v 1.4 2019/01/29 14:07:15 visa Exp $ */ /*- * Copyright (c) 1997 Berkeley Software Design, Inc. All rights reserved. @@ -89,6 +89,7 @@ void witness_norelease(struct lock_object *); void witness_releaseok(struct lock_object *); const char *witness_file(struct lock_object *); void witness_thread_exit(struct proc *); +int witness_sysctl(int *, u_int, void *, size_t *, void *, size_t); int witness_sysctl_watch(void *, size_t *, void *, size_t); #ifdef WITNESS |