summaryrefslogtreecommitdiffstats
path: root/freebsd/sys/kern/kern_event.c
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2018-08-09 14:02:09 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2018-09-21 10:29:38 +0200
commitbb80d9df8bac71eedee1a6787ca63aef972a7e48 (patch)
tree1b5cb9443c5ead5706c35afb618abbbd1592315e /freebsd/sys/kern/kern_event.c
parentUpdate to FreeBSD head 2017-10-01 (diff)
downloadrtems-libbsd-bb80d9df8bac71eedee1a6787ca63aef972a7e48.tar.bz2
Update to FreeBSD head 2017-12-01
Git mirror commit e724f51f811a4b2bd29447f8b85ab5c2f9b88266. Update #3472.
Diffstat (limited to 'freebsd/sys/kern/kern_event.c')
-rw-r--r--freebsd/sys/kern/kern_event.c86
1 files changed, 25 insertions, 61 deletions
diff --git a/freebsd/sys/kern/kern_event.c b/freebsd/sys/kern/kern_event.c
index 2428182c..905ef23c 100644
--- a/freebsd/sys/kern/kern_event.c
+++ b/freebsd/sys/kern/kern_event.c
@@ -1,6 +1,8 @@
#include <machine/rtems-bsd-kernel-space.h>
/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
* Copyright (c) 1999,2000,2001 Jonathan Lemon <jlemon@FreeBSD.org>
* Copyright 2004 John-Mark Gurney <jmg@FreeBSD.org>
* Copyright (c) 2009 Apple, Inc.
@@ -35,6 +37,10 @@ __FBSDID("$FreeBSD$");
#include <rtems/bsd/local/opt_ktrace.h>
#include <rtems/bsd/local/opt_kqueue.h>
+#ifdef COMPAT_FREEBSD11
+#define _WANT_FREEBSD11_KEVENT
+#endif
+
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/capsicum.h>
@@ -123,7 +129,7 @@ static void kqueue_fo_release(int filt);
struct g_kevent_args;
static int kern_kevent_generic(struct thread *td,
struct g_kevent_args *uap,
- struct kevent_copyops *k_ops);
+ struct kevent_copyops *k_ops, const char *struct_name);
#ifndef __rtems__
static fo_rdwr_t kqueue_read;
@@ -444,16 +450,15 @@ filt_procattach(struct knote *kn)
bool exiting, immediate;
exiting = immediate = false;
- p = pfind(kn->kn_id);
- if (p == NULL && (kn->kn_sfflags & NOTE_EXIT)) {
- p = zpfind(kn->kn_id);
- exiting = true;
- } else if (p != NULL && (p->p_flag & P_WEXIT)) {
- exiting = true;
- }
-
+ if (kn->kn_sfflags & NOTE_EXIT)
+ p = pfind_any(kn->kn_id);
+ else
+ p = pfind(kn->kn_id);
if (p == NULL)
return (ESRCH);
+ if (p->p_flag & P_WEXIT)
+ exiting = true;
+
if ((error = p_cansee(curthread, p))) {
PROC_UNLOCK(p);
return (error);
@@ -987,17 +992,6 @@ kqueue(void)
}
#endif /* __rtems__ */
-#ifdef KTRACE
-static size_t
-kev_iovlen(int n, u_int kgio, size_t kevent_size)
-{
-
- if (n < 0 || n >= kgio / kevent_size)
- return (kgio);
- return (n * kevent_size);
-}
-#endif
-
struct g_kevent_args {
int fd;
void *changelist;
@@ -1034,22 +1028,18 @@ sys_kevent(struct thread *td, struct kevent_args *uap)
.timeout = uap->timeout,
};
- return (kern_kevent_generic(td, &gk_args, &k_ops));
+ return (kern_kevent_generic(td, &gk_args, &k_ops, "kevent"));
}
static int
kern_kevent_generic(struct thread *td, struct g_kevent_args *uap,
- struct kevent_copyops *k_ops)
+ struct kevent_copyops *k_ops, const char *struct_name)
{
struct timespec ts, *tsp;
- int error;
#ifdef KTRACE
- struct uio ktruio;
- struct iovec ktriov;
- struct uio *ktruioin = NULL;
- struct uio *ktruioout = NULL;
- u_int kgio;
+ struct kevent *eventlist = uap->eventlist;
#endif
+ int error;
if (uap->timeout != NULL) {
error = copyin(uap->timeout, &ts, sizeof(ts));
@@ -1060,35 +1050,18 @@ kern_kevent_generic(struct thread *td, struct g_kevent_args *uap,
tsp = NULL;
#ifdef KTRACE
- if (KTRPOINT(td, KTR_GENIO)) {
- kgio = ktr_geniosize;
- ktriov.iov_base = uap->changelist;
- ktriov.iov_len = kev_iovlen(uap->nchanges, kgio,
- k_ops->kevent_size);
- ktruio = (struct uio){ .uio_iov = &ktriov, .uio_iovcnt = 1,
- .uio_segflg = UIO_USERSPACE, .uio_rw = UIO_READ,
- .uio_td = td };
- ktruioin = cloneuio(&ktruio);
- ktriov.iov_base = uap->eventlist;
- ktriov.iov_len = kev_iovlen(uap->nevents, kgio,
- k_ops->kevent_size);
- ktriov.iov_len = uap->nevents * k_ops->kevent_size;
- ktruioout = cloneuio(&ktruio);
- }
+ if (KTRPOINT(td, KTR_STRUCT_ARRAY))
+ ktrstructarray(struct_name, UIO_USERSPACE, uap->changelist,
+ uap->nchanges, k_ops->kevent_size);
#endif
error = kern_kevent(td, uap->fd, uap->nchanges, uap->nevents,
k_ops, tsp);
#ifdef KTRACE
- if (ktruioin != NULL) {
- ktruioin->uio_resid = kev_iovlen(uap->nchanges, kgio,
- k_ops->kevent_size);
- ktrgenio(uap->fd, UIO_WRITE, ktruioin, 0);
- ktruioout->uio_resid = kev_iovlen(td->td_retval[0], kgio,
- k_ops->kevent_size);
- ktrgenio(uap->fd, UIO_READ, ktruioout, error);
- }
+ if (error == 0 && KTRPOINT(td, KTR_STRUCT_ARRAY))
+ ktrstructarray(struct_name, UIO_USERSPACE, eventlist,
+ td->td_retval[0], k_ops->kevent_size);
#endif
return (error);
@@ -1163,15 +1136,6 @@ kevent_copyin(void *arg, struct kevent *kevp, int count)
}
#ifdef COMPAT_FREEBSD11
-struct kevent_freebsd11 {
- __uintptr_t ident; /* identifier for this event */
- short filter; /* filter for event */
- unsigned short flags;
- unsigned int fflags;
- __intptr_t data;
- void *udata; /* opaque user data identifier */
-};
-
static int
kevent11_copyout(void *arg, struct kevent *kevp, int count)
{
@@ -1246,7 +1210,7 @@ freebsd11_kevent(struct thread *td, struct freebsd11_kevent_args *uap)
.timeout = uap->timeout,
};
- return (kern_kevent_generic(td, &gk_args, &k_ops));
+ return (kern_kevent_generic(td, &gk_args, &k_ops, "kevent_freebsd11"));
}
#endif