| @@ -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 | |
241 | static int | | 241 | static int |
242 | ksem_sysfini(bool interface) | | 242 | ksem_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 | } |