Tue Dec 17 18:16:05 2019 UTC ()
ksem_sysinit(): more lossage.


(ad)
diff -r1.57 -r1.58 src/sys/kern/uipc_sem.c

cvs diff -r1.57 -r1.58 src/sys/kern/uipc_sem.c (expand / switch to unified diff)

--- src/sys/kern/uipc_sem.c 2019/12/17 18:10:36 1.57
+++ src/sys/kern/uipc_sem.c 2019/12/17 18:16:05 1.58
@@ -1,14 +1,14 @@ @@ -1,14 +1,14 @@
1/* $NetBSD: uipc_sem.c,v 1.57 2019/12/17 18:10:36 ad Exp $ */ 1/* $NetBSD: uipc_sem.c,v 1.58 2019/12/17 18:16:05 ad Exp $ */
2 2
3/*- 3/*-
4 * Copyright (c) 2011, 2019 The NetBSD Foundation, Inc. 4 * Copyright (c) 2011, 2019 The NetBSD Foundation, Inc.
5 * All rights reserved. 5 * All rights reserved.
6 * 6 *
7 * This code is derived from software contributed to The NetBSD Foundation 7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Mindaugas Rasiukevicius and Jason R. Thorpe. 8 * by Mindaugas Rasiukevicius and Jason R. Thorpe.
9 * 9 *
10 * Redistribution and use in source and binary forms, with or without 10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions 11 * modification, are permitted provided that the following conditions
12 * are met: 12 * are met:
13 * 1. Redistributions of source code must retain the above copyright 13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer. 14 * notice, this list of conditions and the following disclaimer.
@@ -50,27 +50,27 @@ @@ -50,27 +50,27 @@
50 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 50 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
51 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 51 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
52 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 52 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
53 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 53 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
54 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 54 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
55 * SUCH DAMAGE. 55 * SUCH DAMAGE.
56 */ 56 */
57 57
58/* 58/*
59 * Implementation of POSIX semaphore. 59 * Implementation of POSIX semaphore.
60 */ 60 */
61 61
62#include <sys/cdefs.h> 62#include <sys/cdefs.h>
63__KERNEL_RCSID(0, "$NetBSD: uipc_sem.c,v 1.57 2019/12/17 18:10:36 ad Exp $"); 63__KERNEL_RCSID(0, "$NetBSD: uipc_sem.c,v 1.58 2019/12/17 18:16:05 ad Exp $");
64 64
65#include <sys/param.h> 65#include <sys/param.h>
66#include <sys/kernel.h> 66#include <sys/kernel.h>
67 67
68#include <sys/atomic.h> 68#include <sys/atomic.h>
69#include <sys/proc.h> 69#include <sys/proc.h>
70#include <sys/lwp.h> 70#include <sys/lwp.h>
71#include <sys/ksem.h> 71#include <sys/ksem.h>
72#include <sys/syscall.h> 72#include <sys/syscall.h>
73#include <sys/stat.h> 73#include <sys/stat.h>
74#include <sys/kmem.h> 74#include <sys/kmem.h>
75#include <sys/fcntl.h> 75#include <sys/fcntl.h>
76#include <sys/file.h> 76#include <sys/file.h>
@@ -194,57 +194,57 @@ ksem_sysinit(void) @@ -194,57 +194,57 @@ ksem_sysinit(void)
194 int error; 194 int error;
195 const struct sysctlnode *rnode; 195 const struct sysctlnode *rnode;
196 196
197 mutex_init(&ksem_lock, MUTEX_DEFAULT, IPL_NONE); 197 mutex_init(&ksem_lock, MUTEX_DEFAULT, IPL_NONE);
198 LIST_INIT(&ksem_head); 198 LIST_INIT(&ksem_head);
199 nsems_total = 0; 199 nsems_total = 0;
200 nsems = 0; 200 nsems = 0;
201 201
202 rw_init(&ksem_pshared_lock); 202 rw_init(&ksem_pshared_lock);
203 ksem_pshared_hashtab = hashinit(KSEM_PSHARED_HASHSIZE, HASH_LIST, 203 ksem_pshared_hashtab = hashinit(KSEM_PSHARED_HASHSIZE, HASH_LIST,
204 true, &ksem_pshared_hashmask); 204 true, &ksem_pshared_hashmask);
205 KASSERT(ksem_pshared_hashtab != NULL); 205 KASSERT(ksem_pshared_hashtab != NULL);
206 206
207 error = syscall_establish(NULL, ksem_syscalls); 
208 if (error) { 
209 (void)ksem_sysfini(false); 
210 } 
211 
212 ksem_listener = kauth_listen_scope(KAUTH_SCOPE_SYSTEM, 207 ksem_listener = kauth_listen_scope(KAUTH_SCOPE_SYSTEM,
213 ksem_listener_cb, NULL); 208 ksem_listener_cb, NULL);
214 209
215 /* Define module-specific sysctl tree */ 210 /* Define module-specific sysctl tree */
216 211
217 ksem_clog = NULL; 212 ksem_clog = NULL;
218 213
219 sysctl_createv(&ksem_clog, 0, NULL, &rnode, 214 sysctl_createv(&ksem_clog, 0, NULL, &rnode,
220 CTLFLAG_PERMANENT, 215 CTLFLAG_PERMANENT,
221 CTLTYPE_NODE, "posix", 216 CTLTYPE_NODE, "posix",
222 SYSCTL_DESCR("POSIX options"), 217 SYSCTL_DESCR("POSIX options"),
223 NULL, 0, NULL, 0, 218 NULL, 0, NULL, 0,
224 CTL_KERN, CTL_CREATE, CTL_EOL); 219 CTL_KERN, CTL_CREATE, CTL_EOL);
225 sysctl_createv(&ksem_clog, 0, &rnode, NULL, 220 sysctl_createv(&ksem_clog, 0, &rnode, NULL,
226 CTLFLAG_PERMANENT | CTLFLAG_READWRITE, 221 CTLFLAG_PERMANENT | CTLFLAG_READWRITE,
227 CTLTYPE_INT, "semmax", 222 CTLTYPE_INT, "semmax",
228 SYSCTL_DESCR("Maximal number of semaphores"), 223 SYSCTL_DESCR("Maximal number of semaphores"),
229 NULL, 0, &ksem_max, 0, 224 NULL, 0, &ksem_max, 0,
230 CTL_CREATE, CTL_EOL); 225 CTL_CREATE, CTL_EOL);
231 sysctl_createv(&ksem_clog, 0, &rnode, NULL, 226 sysctl_createv(&ksem_clog, 0, &rnode, NULL,
232 CTLFLAG_PERMANENT | CTLFLAG_READONLY, 227 CTLFLAG_PERMANENT | CTLFLAG_READONLY,
233 CTLTYPE_INT, "semcnt", 228 CTLTYPE_INT, "semcnt",
234 SYSCTL_DESCR("Current number of semaphores"), 229 SYSCTL_DESCR("Current number of semaphores"),
235 NULL, 0, &nsems, 0, 230 NULL, 0, &nsems, 0,
236 CTL_CREATE, CTL_EOL); 231 CTL_CREATE, CTL_EOL);
237 232
 233 error = syscall_establish(NULL, ksem_syscalls);
 234 if (error) {
 235 (void)ksem_sysfini(false);
 236 }
 237
238 return error; 238 return error;
239} 239}
240 240
241static int 241static int
242ksem_sysfini(bool interface) 242ksem_sysfini(bool interface)
243{ 243{
244 int error; 244 int error;
245 245
246 if (interface) { 246 if (interface) {
247 error = syscall_disestablish(NULL, ksem_syscalls); 247 error = syscall_disestablish(NULL, ksem_syscalls);
248 if (error != 0) { 248 if (error != 0) {
249 return error; 249 return error;
250 } 250 }