kernel - Count only non-spurious events in main kevent loop
[dragonfly.git] / sys / kern / kern_event.c
1 /*-
2  * Copyright (c) 1999,2000,2001 Jonathan Lemon <jlemon@FreeBSD.org>
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24  * SUCH DAMAGE.
25  *
26  * $FreeBSD: src/sys/kern/kern_event.c,v 1.2.2.10 2004/04/04 07:03:14 cperciva Exp $
27  * $DragonFly: src/sys/kern/kern_event.c,v 1.33 2007/02/03 17:05:57 corecode Exp $
28  */
29
30 #include <sys/param.h>
31 #include <sys/systm.h>
32 #include <sys/kernel.h>
33 #include <sys/proc.h>
34 #include <sys/malloc.h> 
35 #include <sys/unistd.h>
36 #include <sys/file.h>
37 #include <sys/lock.h>
38 #include <sys/fcntl.h>
39 #include <sys/select.h>
40 #include <sys/queue.h>
41 #include <sys/event.h>
42 #include <sys/eventvar.h>
43 #include <sys/protosw.h>
44 #include <sys/socket.h>
45 #include <sys/socketvar.h>
46 #include <sys/stat.h>
47 #include <sys/sysctl.h>
48 #include <sys/sysproto.h>
49 #include <sys/uio.h>
50 #include <sys/signalvar.h>
51 #include <sys/filio.h>
52 #include <sys/ktr.h>
53
54 #include <sys/thread2.h>
55 #include <sys/file2.h>
56 #include <sys/mplock2.h>
57
58 #include <vm/vm_zone.h>
59
60 MALLOC_DEFINE(M_KQUEUE, "kqueue", "memory for kqueue system");
61
62 struct kevent_copyin_args {
63         struct kevent_args      *ka;
64         int                     pchanges;
65 };
66
67 static int      kqueue_sleep(struct kqueue *kq, struct timespec *tsp);
68 static int      kqueue_scan(struct kqueue *kq, struct kevent *kevp, int count,
69                     struct knote *marker);
70 static int      kqueue_read(struct file *fp, struct uio *uio,
71                     struct ucred *cred, int flags);
72 static int      kqueue_write(struct file *fp, struct uio *uio,
73                     struct ucred *cred, int flags);
74 static int      kqueue_ioctl(struct file *fp, u_long com, caddr_t data,
75                     struct ucred *cred, struct sysmsg *msg);
76 static int      kqueue_kqfilter(struct file *fp, struct knote *kn);
77 static int      kqueue_stat(struct file *fp, struct stat *st,
78                     struct ucred *cred);
79 static int      kqueue_close(struct file *fp);
80
81 /*
82  * MPSAFE
83  */
84 static struct fileops kqueueops = {
85         .fo_read = kqueue_read,
86         .fo_write = kqueue_write,
87         .fo_ioctl = kqueue_ioctl,
88         .fo_kqfilter = kqueue_kqfilter,
89         .fo_stat = kqueue_stat,
90         .fo_close = kqueue_close,
91         .fo_shutdown = nofo_shutdown
92 };
93
94 static void     knote_attach(struct knote *kn);
95 static void     knote_drop(struct knote *kn);
96 static void     knote_enqueue(struct knote *kn);
97 static void     knote_dequeue(struct knote *kn);
98 static void     knote_init(void);
99 static struct   knote *knote_alloc(void);
100 static void     knote_free(struct knote *kn);
101
102 static void     filt_kqdetach(struct knote *kn);
103 static int      filt_kqueue(struct knote *kn, long hint);
104 static int      filt_procattach(struct knote *kn);
105 static void     filt_procdetach(struct knote *kn);
106 static int      filt_proc(struct knote *kn, long hint);
107 static int      filt_fileattach(struct knote *kn);
108 static void     filt_timerexpire(void *knx);
109 static int      filt_timerattach(struct knote *kn);
110 static void     filt_timerdetach(struct knote *kn);
111 static int      filt_timer(struct knote *kn, long hint);
112
113 static struct filterops file_filtops =
114         { 1, filt_fileattach, NULL, NULL };
115 static struct filterops kqread_filtops =
116         { 1, NULL, filt_kqdetach, filt_kqueue };
117 static struct filterops proc_filtops =
118         { 0, filt_procattach, filt_procdetach, filt_proc };
119 static struct filterops timer_filtops =
120         { 0, filt_timerattach, filt_timerdetach, filt_timer };
121
122 static vm_zone_t        knote_zone;
123 static int              kq_ncallouts = 0;
124 static int              kq_calloutmax = (4 * 1024);
125 SYSCTL_INT(_kern, OID_AUTO, kq_calloutmax, CTLFLAG_RW,
126     &kq_calloutmax, 0, "Maximum number of callouts allocated for kqueue");
127
128 #define KNOTE_ACTIVATE(kn) do {                                         \
129         kn->kn_status |= KN_ACTIVE;                                     \
130         if ((kn->kn_status & (KN_QUEUED | KN_DISABLED)) == 0)           \
131                 knote_enqueue(kn);                                      \
132 } while(0)
133
134 #define KN_HASHSIZE             64              /* XXX should be tunable */
135 #define KN_HASH(val, mask)      (((val) ^ (val >> 8)) & (mask))
136
137 extern struct filterops aio_filtops;
138 extern struct filterops sig_filtops;
139
140 /*
141  * Table for for all system-defined filters.
142  */
143 static struct filterops *sysfilt_ops[] = {
144         &file_filtops,                  /* EVFILT_READ */
145         &file_filtops,                  /* EVFILT_WRITE */
146         &aio_filtops,                   /* EVFILT_AIO */
147         &file_filtops,                  /* EVFILT_VNODE */
148         &proc_filtops,                  /* EVFILT_PROC */
149         &sig_filtops,                   /* EVFILT_SIGNAL */
150         &timer_filtops,                 /* EVFILT_TIMER */
151         &file_filtops,                  /* EVFILT_EXCEPT */
152 };
153
154 static int
155 filt_fileattach(struct knote *kn)
156 {
157         return (fo_kqfilter(kn->kn_fp, kn));
158 }
159
160 /*
161  * MPALMOSTSAFE - acquires mplock
162  */
163 static int
164 kqueue_kqfilter(struct file *fp, struct knote *kn)
165 {
166         struct kqueue *kq = (struct kqueue *)kn->kn_fp->f_data;
167
168         get_mplock();
169         if (kn->kn_filter != EVFILT_READ) {
170                 rel_mplock();
171                 return (EOPNOTSUPP);
172         }
173
174         kn->kn_fop = &kqread_filtops;
175         SLIST_INSERT_HEAD(&kq->kq_sel.si_note, kn, kn_selnext);
176         rel_mplock();
177         return (0);
178 }
179
180 static void
181 filt_kqdetach(struct knote *kn)
182 {
183         struct kqueue *kq = (struct kqueue *)kn->kn_fp->f_data;
184
185         SLIST_REMOVE(&kq->kq_sel.si_note, kn, knote, kn_selnext);
186 }
187
188 /*ARGSUSED*/
189 static int
190 filt_kqueue(struct knote *kn, long hint)
191 {
192         struct kqueue *kq = (struct kqueue *)kn->kn_fp->f_data;
193
194         kn->kn_data = kq->kq_count;
195         return (kn->kn_data > 0);
196 }
197
198 static int
199 filt_procattach(struct knote *kn)
200 {
201         struct proc *p;
202         int immediate;
203
204         immediate = 0;
205         lwkt_gettoken(&proc_token);
206         p = pfind(kn->kn_id);
207         if (p == NULL && (kn->kn_sfflags & NOTE_EXIT)) {
208                 p = zpfind(kn->kn_id);
209                 immediate = 1;
210         }
211         if (p == NULL) {
212                 lwkt_reltoken(&proc_token);
213                 return (ESRCH);
214         }
215         if (!PRISON_CHECK(curthread->td_ucred, p->p_ucred)) {
216                 lwkt_reltoken(&proc_token);
217                 return (EACCES);
218         }
219
220         kn->kn_ptr.p_proc = p;
221         kn->kn_flags |= EV_CLEAR;               /* automatically set */
222
223         /*
224          * internal flag indicating registration done by kernel
225          */
226         if (kn->kn_flags & EV_FLAG1) {
227                 kn->kn_data = kn->kn_sdata;             /* ppid */
228                 kn->kn_fflags = NOTE_CHILD;
229                 kn->kn_flags &= ~EV_FLAG1;
230         }
231
232         /* XXX lock the proc here while adding to the list? */
233         SLIST_INSERT_HEAD(&p->p_klist, kn, kn_selnext);
234
235         /*
236          * Immediately activate any exit notes if the target process is a
237          * zombie.  This is necessary to handle the case where the target
238          * process, e.g. a child, dies before the kevent is negistered.
239          */
240         if (immediate && filt_proc(kn, NOTE_EXIT))
241                 KNOTE_ACTIVATE(kn);
242         lwkt_reltoken(&proc_token);
243
244         return (0);
245 }
246
247 /*
248  * The knote may be attached to a different process, which may exit,
249  * leaving nothing for the knote to be attached to.  So when the process
250  * exits, the knote is marked as DETACHED and also flagged as ONESHOT so
251  * it will be deleted when read out.  However, as part of the knote deletion,
252  * this routine is called, so a check is needed to avoid actually performing
253  * a detach, because the original process does not exist any more.
254  */
255 static void
256 filt_procdetach(struct knote *kn)
257 {
258         struct proc *p;
259
260         if (kn->kn_status & KN_DETACHED)
261                 return;
262         /* XXX locking?  this might modify another process. */
263         p = kn->kn_ptr.p_proc;
264         SLIST_REMOVE(&p->p_klist, kn, knote, kn_selnext);
265 }
266
267 static int
268 filt_proc(struct knote *kn, long hint)
269 {
270         u_int event;
271
272         /*
273          * mask off extra data
274          */
275         event = (u_int)hint & NOTE_PCTRLMASK;
276
277         /*
278          * if the user is interested in this event, record it.
279          */
280         if (kn->kn_sfflags & event)
281                 kn->kn_fflags |= event;
282
283         /*
284          * Process is gone, so flag the event as finished.  Detach the
285          * knote from the process now because the process will be poof,
286          * gone later on.
287          */
288         if (event == NOTE_EXIT) {
289                 struct proc *p = kn->kn_ptr.p_proc;
290                 if ((kn->kn_status & KN_DETACHED) == 0) {
291                         SLIST_REMOVE(&p->p_klist, kn, knote, kn_selnext);
292                         kn->kn_status |= KN_DETACHED;
293                         kn->kn_data = p->p_xstat;
294                         kn->kn_ptr.p_proc = NULL;
295                 }
296                 kn->kn_flags |= (EV_EOF | EV_ONESHOT); 
297                 return (1);
298         }
299
300         /*
301          * process forked, and user wants to track the new process,
302          * so attach a new knote to it, and immediately report an
303          * event with the parent's pid.
304          */
305         if ((event == NOTE_FORK) && (kn->kn_sfflags & NOTE_TRACK)) {
306                 struct kevent kev;
307                 int error;
308
309                 /*
310                  * register knote with new process.
311                  */
312                 kev.ident = hint & NOTE_PDATAMASK;      /* pid */
313                 kev.filter = kn->kn_filter;
314                 kev.flags = kn->kn_flags | EV_ADD | EV_ENABLE | EV_FLAG1;
315                 kev.fflags = kn->kn_sfflags;
316                 kev.data = kn->kn_id;                   /* parent */
317                 kev.udata = kn->kn_kevent.udata;        /* preserve udata */
318                 error = kqueue_register(kn->kn_kq, &kev);
319                 if (error)
320                         kn->kn_fflags |= NOTE_TRACKERR;
321         }
322
323         return (kn->kn_fflags != 0);
324 }
325
326 static void
327 filt_timerexpire(void *knx)
328 {
329         struct knote *kn = knx;
330         struct callout *calloutp;
331         struct timeval tv;
332         int tticks;
333
334         kn->kn_data++;
335         KNOTE_ACTIVATE(kn);
336
337         if ((kn->kn_flags & EV_ONESHOT) == 0) {
338                 tv.tv_sec = kn->kn_sdata / 1000;
339                 tv.tv_usec = (kn->kn_sdata % 1000) * 1000;
340                 tticks = tvtohz_high(&tv);
341                 calloutp = (struct callout *)kn->kn_hook;
342                 callout_reset(calloutp, tticks, filt_timerexpire, kn);
343         }
344 }
345
346 /*
347  * data contains amount of time to sleep, in milliseconds
348  */ 
349 static int
350 filt_timerattach(struct knote *kn)
351 {
352         struct callout *calloutp;
353         struct timeval tv;
354         int tticks;
355
356         if (kq_ncallouts >= kq_calloutmax)
357                 return (ENOMEM);
358         kq_ncallouts++;
359
360         tv.tv_sec = kn->kn_sdata / 1000;
361         tv.tv_usec = (kn->kn_sdata % 1000) * 1000;
362         tticks = tvtohz_high(&tv);
363
364         kn->kn_flags |= EV_CLEAR;               /* automatically set */
365         MALLOC(calloutp, struct callout *, sizeof(*calloutp),
366             M_KQUEUE, M_WAITOK);
367         callout_init(calloutp);
368         kn->kn_hook = (caddr_t)calloutp;
369         callout_reset(calloutp, tticks, filt_timerexpire, kn);
370
371         return (0);
372 }
373
374 static void
375 filt_timerdetach(struct knote *kn)
376 {
377         struct callout *calloutp;
378
379         calloutp = (struct callout *)kn->kn_hook;
380         callout_stop(calloutp);
381         FREE(calloutp, M_KQUEUE);
382         kq_ncallouts--;
383 }
384
385 static int
386 filt_timer(struct knote *kn, long hint)
387 {
388
389         return (kn->kn_data != 0);
390 }
391
392 /*
393  * Initialize a kqueue.
394  *
395  * NOTE: The lwp/proc code initializes a kqueue for select/poll ops.
396  *
397  * MPSAFE
398  */
399 void
400 kqueue_init(struct kqueue *kq, struct filedesc *fdp)
401 {
402         TAILQ_INIT(&kq->kq_knpend);
403         TAILQ_INIT(&kq->kq_knlist);
404         kq->kq_count = 0;
405         kq->kq_fdp = fdp;
406         SLIST_INIT(&kq->kq_sel.si_note);
407 }
408
409 /*
410  * Terminate a kqueue.  Freeing the actual kq itself is left up to the
411  * caller (it might be embedded in a lwp so we don't do it here).
412  */
413 void
414 kqueue_terminate(struct kqueue *kq)
415 {
416         struct knote *kn;
417         struct klist *list;
418         int hv;
419
420         while ((kn = TAILQ_FIRST(&kq->kq_knlist)) != NULL) {
421                 kn->kn_fop->f_detach(kn);
422                 if (kn->kn_fop->f_isfd) {
423                         list = &kn->kn_fp->f_klist;
424                         SLIST_REMOVE(list, kn, knote, kn_link);
425                         fdrop(kn->kn_fp);
426                         kn->kn_fp = NULL;
427                 } else {
428                         hv = KN_HASH(kn->kn_id, kq->kq_knhashmask);
429                         list = &kq->kq_knhash[hv];
430                         SLIST_REMOVE(list, kn, knote, kn_link);
431                 }
432                 TAILQ_REMOVE(&kq->kq_knlist, kn, kn_kqlink);
433                 if (kn->kn_status & KN_QUEUED)
434                         knote_dequeue(kn);
435                 knote_free(kn);
436         }
437
438         if (kq->kq_knhash) {
439                 kfree(kq->kq_knhash, M_KQUEUE);
440                 kq->kq_knhash = NULL;
441                 kq->kq_knhashmask = 0;
442         }
443 }
444
445 /*
446  * MPSAFE
447  */
448 int
449 sys_kqueue(struct kqueue_args *uap)
450 {
451         struct thread *td = curthread;
452         struct kqueue *kq;
453         struct file *fp;
454         int fd, error;
455
456         error = falloc(td->td_lwp, &fp, &fd);
457         if (error)
458                 return (error);
459         fp->f_flag = FREAD | FWRITE;
460         fp->f_type = DTYPE_KQUEUE;
461         fp->f_ops = &kqueueops;
462
463         kq = kmalloc(sizeof(struct kqueue), M_KQUEUE, M_WAITOK | M_ZERO);
464         kqueue_init(kq, td->td_proc->p_fd);
465         fp->f_data = kq;
466
467         fsetfd(kq->kq_fdp, fp, fd);
468         uap->sysmsg_result = fd;
469         fdrop(fp);
470         return (error);
471 }
472
473 /*
474  * Copy 'count' items into the destination list pointed to by uap->eventlist.
475  */
476 static int
477 kevent_copyout(void *arg, struct kevent *kevp, int count, int *res)
478 {
479         struct kevent_copyin_args *kap;
480         int error;
481
482         kap = (struct kevent_copyin_args *)arg;
483
484         error = copyout(kevp, kap->ka->eventlist, count * sizeof(*kevp));
485         if (error == 0) {
486                 kap->ka->eventlist += count;
487                 *res += count;
488         } else {
489                 *res = -1;
490         }
491
492         return (error);
493 }
494
495 /*
496  * Copy at most 'max' items from the list pointed to by kap->changelist,
497  * return number of items in 'events'.
498  */
499 static int
500 kevent_copyin(void *arg, struct kevent *kevp, int max, int *events)
501 {
502         struct kevent_copyin_args *kap;
503         int error, count;
504
505         kap = (struct kevent_copyin_args *)arg;
506
507         count = min(kap->ka->nchanges - kap->pchanges, max);
508         error = copyin(kap->ka->changelist, kevp, count * sizeof *kevp);
509         if (error == 0) {
510                 kap->ka->changelist += count;
511                 kap->pchanges += count;
512                 *events = count;
513         }
514
515         return (error);
516 }
517
518 /*
519  * MPALMOSTSAFE
520  */
521 int
522 kern_kevent(struct kqueue *kq, int nevents, int *res, void *uap,
523             k_copyin_fn kevent_copyinfn, k_copyout_fn kevent_copyoutfn,
524             struct timespec *tsp_in)
525 {
526         struct kevent *kevp;
527         struct timespec *tsp;
528         int i, n, total, error, nerrors = 0;
529         int lres;
530         struct kevent kev[KQ_NEVENTS];
531         struct knote marker;
532
533         tsp = tsp_in;
534         *res = 0;
535
536         get_mplock();
537         for ( ;; ) {
538                 n = 0;
539                 error = kevent_copyinfn(uap, kev, KQ_NEVENTS, &n);
540                 if (error)
541                         goto done;
542                 if (n == 0)
543                         break;
544                 for (i = 0; i < n; i++) {
545                         kevp = &kev[i];
546                         kevp->flags &= ~EV_SYSFLAGS;
547                         error = kqueue_register(kq, kevp);
548
549                         /*
550                          * If a registration returns an error we
551                          * immediately post the error.  The kevent()
552                          * call itself will fail with the error if
553                          * no space is available for posting.
554                          *
555                          * Such errors normally bypass the timeout/blocking
556                          * code.  However, if the copyoutfn function refuses
557                          * to post the error (see sys_poll()), then we
558                          * ignore it too.
559                          */
560                         if (error) {
561                                 if (nevents != 0) {
562                                         kevp->flags = EV_ERROR;
563                                         kevp->data = error;
564                                         lres = *res;
565                                         kevent_copyoutfn(uap, kevp, 1, res);
566                                         if (lres != *res) {
567                                                 nevents--;
568                                                 nerrors++;
569                                         }
570                                 } else {
571                                         goto done;
572                                 }
573                         }
574                 }
575         }
576         if (nerrors) {
577                 error = 0;
578                 goto done;
579         }
580
581         /*
582          * Acquire/wait for events - setup timeout
583          */
584         if (tsp != NULL) {
585                 struct timespec ats;
586
587                 if (tsp->tv_sec || tsp->tv_nsec) {
588                         nanouptime(&ats);
589                         timespecadd(tsp, &ats);         /* tsp = target time */
590                 }
591         }
592
593         /*
594          * Loop as required.
595          *
596          * Collect as many events as we can. Sleeping on successive
597          * loops is disabled if copyoutfn has incremented (*res).
598          *
599          * The loop stops if an error occurs, all events have been
600          * scanned (the marker has been reached), or fewer than the
601          * maximum number of events is found.
602          *
603          * The copyoutfn function does not have to increment (*res) in
604          * order for the loop to continue.
605          *
606          * NOTE: doselect() usually passes 0x7FFFFFFF for nevents.
607          */
608         total = 0;
609         error = 0;
610         marker.kn_filter = EVFILT_MARKER;
611         crit_enter();
612         TAILQ_INSERT_TAIL(&kq->kq_knpend, &marker, kn_tqe);
613         crit_exit();
614         while ((n = nevents - total) > 0) {
615                 if (n > KQ_NEVENTS)
616                         n = KQ_NEVENTS;
617
618                 /*
619                  * If no events are pending sleep until timeout (if any)
620                  * or an event occurs.
621                  *
622                  * After the sleep completes the marker is moved to the
623                  * end of the list, making any received events available
624                  * to our scan.
625                  */
626                 if (kq->kq_count == 0 && *res == 0) {
627                         error = kqueue_sleep(kq, tsp);
628
629                         if (error)
630                                 break;
631                         crit_enter();
632                         TAILQ_REMOVE(&kq->kq_knpend, &marker, kn_tqe);
633                         TAILQ_INSERT_TAIL(&kq->kq_knpend, &marker, kn_tqe);
634                         crit_exit();
635                 }
636
637                 /*
638                  * Process all received events
639                  * Account for all non-spurious events in our total
640                  */
641                 i = kqueue_scan(kq, kev, n, &marker);
642                 if (i) {
643                         lres = *res;
644                         error = kevent_copyoutfn(uap, kev, i, res);
645                         total += *res - lres;
646                         if (error)
647                                 break;
648                 }
649
650                 /*
651                  * Normally when fewer events are returned than requested
652                  * we can stop.  However, if only spurious events were
653                  * collected the copyout will not bump (*res) and we have
654                  * to continue.
655                  */
656                 if (i < n && *res)
657                         break;
658
659                 /*
660                  * Deal with an edge case where spurious events can cause
661                  * a loop to occur without moving the marker.  This can
662                  * prevent kqueue_scan() from picking up new events which
663                  * race us.  We must be sure to move the marker for this
664                  * case.
665                  *
666                  * NOTE: We do not want to move the marker if events
667                  *       were scanned because normal kqueue operations
668                  *       may reactivate events.  Moving the marker in
669                  *       that case could result in duplicates for the
670                  *       same event.
671                  */
672                 if (i == 0) {
673                         crit_enter();
674                         TAILQ_REMOVE(&kq->kq_knpend, &marker, kn_tqe);
675                         TAILQ_INSERT_TAIL(&kq->kq_knpend, &marker, kn_tqe);
676                         crit_exit();
677                 }
678         }
679         crit_enter();
680         TAILQ_REMOVE(&kq->kq_knpend, &marker, kn_tqe);
681         crit_exit();
682
683         /* Timeouts do not return EWOULDBLOCK. */
684         if (error == EWOULDBLOCK)
685                 error = 0;
686
687 done:
688         rel_mplock();
689         return (error);
690 }
691
692 /*
693  * MPALMOSTSAFE
694  */
695 int
696 sys_kevent(struct kevent_args *uap)
697 {
698         struct thread *td = curthread;
699         struct proc *p = td->td_proc;
700         struct timespec ts, *tsp;
701         struct kqueue *kq;
702         struct file *fp = NULL;
703         struct kevent_copyin_args *kap, ka;
704         int error;
705
706         if (uap->timeout) {
707                 error = copyin(uap->timeout, &ts, sizeof(ts));
708                 if (error)
709                         return (error);
710                 tsp = &ts;
711         } else {
712                 tsp = NULL;
713         }
714
715         fp = holdfp(p->p_fd, uap->fd, -1);
716         if (fp == NULL)
717                 return (EBADF);
718         if (fp->f_type != DTYPE_KQUEUE) {
719                 fdrop(fp);
720                 return (EBADF);
721         }
722
723         kq = (struct kqueue *)fp->f_data;
724
725         kap = &ka;
726         kap->ka = uap;
727         kap->pchanges = 0;
728
729         error = kern_kevent(kq, uap->nevents, &uap->sysmsg_result, kap,
730                             kevent_copyin, kevent_copyout, tsp);
731
732         fdrop(fp);
733
734         return (error);
735 }
736
737 int
738 kqueue_register(struct kqueue *kq, struct kevent *kev)
739 {
740         struct filedesc *fdp = kq->kq_fdp;
741         struct filterops *fops;
742         struct file *fp = NULL;
743         struct knote *kn = NULL;
744         int error = 0;
745
746         if (kev->filter < 0) {
747                 if (kev->filter + EVFILT_SYSCOUNT < 0)
748                         return (EINVAL);
749                 fops = sysfilt_ops[~kev->filter];       /* to 0-base index */
750         } else {
751                 /*
752                  * XXX
753                  * filter attach routine is responsible for insuring that
754                  * the identifier can be attached to it.
755                  */
756                 kprintf("unknown filter: %d\n", kev->filter);
757                 return (EINVAL);
758         }
759
760         if (fops->f_isfd) {
761                 /* validate descriptor */
762                 fp = holdfp(fdp, kev->ident, -1);
763                 if (fp == NULL)
764                         return (EBADF);
765
766                 SLIST_FOREACH(kn, &fp->f_klist, kn_link) {
767                         if (kn->kn_kq == kq &&
768                             kn->kn_filter == kev->filter &&
769                             kn->kn_id == kev->ident) {
770                                 break;
771                         }
772                 }
773         } else {
774                 if (kq->kq_knhashmask) {
775                         struct klist *list;
776                         
777                         list = &kq->kq_knhash[
778                             KN_HASH((u_long)kev->ident, kq->kq_knhashmask)];
779                         SLIST_FOREACH(kn, list, kn_link) {
780                                 if (kn->kn_id == kev->ident &&
781                                     kn->kn_filter == kev->filter)
782                                         break;
783                         }
784                 }
785         }
786
787         if (kn == NULL && ((kev->flags & EV_ADD) == 0)) {
788                 error = ENOENT;
789                 goto done;
790         }
791
792         /*
793          * kn now contains the matching knote, or NULL if no match
794          */
795         if (kev->flags & EV_ADD) {
796                 if (kn == NULL) {
797                         kn = knote_alloc();
798                         if (kn == NULL) {
799                                 error = ENOMEM;
800                                 goto done;
801                         }
802                         kn->kn_fp = fp;
803                         kn->kn_kq = kq;
804                         kn->kn_fop = fops;
805
806                         /*
807                          * apply reference count to knote structure, and
808                          * do not release it at the end of this routine.
809                          */
810                         fp = NULL;
811
812                         kn->kn_sfflags = kev->fflags;
813                         kn->kn_sdata = kev->data;
814                         kev->fflags = 0;
815                         kev->data = 0;
816                         kn->kn_kevent = *kev;
817
818                         knote_attach(kn);
819                         if ((error = fops->f_attach(kn)) != 0) {
820                                 knote_drop(kn);
821                                 goto done;
822                         }
823                 } else {
824                         /*
825                          * The user may change some filter values after the
826                          * initial EV_ADD, but doing so will not reset any 
827                          * filter which have already been triggered.
828                          */
829                         kn->kn_sfflags = kev->fflags;
830                         kn->kn_sdata = kev->data;
831                         kn->kn_kevent.udata = kev->udata;
832                 }
833
834                 crit_enter();
835                 if (kn->kn_fop->f_event(kn, 0))
836                         KNOTE_ACTIVATE(kn);
837                 crit_exit();
838         } else if (kev->flags & EV_DELETE) {
839                 kn->kn_fop->f_detach(kn);
840                 knote_drop(kn);
841                 goto done;
842         }
843
844         if ((kev->flags & EV_DISABLE) &&
845             ((kn->kn_status & KN_DISABLED) == 0)) {
846                 crit_enter();
847                 kn->kn_status |= KN_DISABLED;
848                 crit_exit();
849         }
850
851         if ((kev->flags & EV_ENABLE) && (kn->kn_status & KN_DISABLED)) {
852                 crit_enter();
853                 kn->kn_status &= ~KN_DISABLED;
854                 if ((kn->kn_status & KN_ACTIVE) &&
855                     ((kn->kn_status & KN_QUEUED) == 0))
856                         knote_enqueue(kn);
857                 crit_exit();
858         }
859
860 done:
861         if (fp != NULL)
862                 fdrop(fp);
863         return (error);
864 }
865
866 /*
867  * Block as necessary until the target time is reached.
868  * If tsp is NULL we block indefinitely.  If tsp->ts_secs/nsecs are both
869  * 0 we do not block at all.
870  */
871 static int
872 kqueue_sleep(struct kqueue *kq, struct timespec *tsp)
873 {
874         int error = 0;
875
876         crit_enter();
877         if (tsp == NULL) {
878                 kq->kq_state |= KQ_SLEEP;
879                 error = tsleep(kq, PCATCH, "kqread", 0);
880         } else if (tsp->tv_sec == 0 && tsp->tv_nsec == 0) {
881                 error = EWOULDBLOCK;
882         } else {
883                 struct timespec ats;
884                 struct timespec atx = *tsp;
885                 int timeout;
886
887                 nanouptime(&ats);
888                 timespecsub(&atx, &ats);
889                 if (ats.tv_sec < 0) {
890                         error = EWOULDBLOCK;
891                 } else {
892                         timeout = atx.tv_sec > 24 * 60 * 60 ?
893                                 24 * 60 * 60 * hz : tstohz_high(&atx);
894                         kq->kq_state |= KQ_SLEEP;
895                         error = tsleep(kq, PCATCH, "kqread", timeout);
896                 }
897         }
898         crit_exit();
899
900         /* don't restart after signals... */
901         if (error == ERESTART)
902                 return (EINTR);
903
904         return (error);
905 }
906
907 /*
908  * Scan the kqueue, return the number of active events placed in kevp up
909  * to count.
910  *
911  * Continuous mode events may get recycled, do not continue scanning past
912  * marker unless no events have been collected.
913  */
914 static int
915 kqueue_scan(struct kqueue *kq, struct kevent *kevp, int count,
916             struct knote *marker)
917 {
918         struct knote *kn, local_marker;
919         int total;
920
921         total = 0;
922         local_marker.kn_filter = EVFILT_MARKER;
923         crit_enter();
924
925         /*
926          * Collect events.
927          */
928         TAILQ_INSERT_HEAD(&kq->kq_knpend, &local_marker, kn_tqe);
929         while (count) {
930                 kn = TAILQ_NEXT(&local_marker, kn_tqe);
931                 if (kn->kn_filter == EVFILT_MARKER) {
932                         /* Marker reached, we are done */
933                         if (kn == marker)
934                                 break;
935
936                         /* Move local marker past some other threads marker */
937                         kn = TAILQ_NEXT(kn, kn_tqe);
938                         TAILQ_REMOVE(&kq->kq_knpend, &local_marker, kn_tqe);
939                         TAILQ_INSERT_BEFORE(kn, &local_marker, kn_tqe);
940                         continue;
941                 }
942
943                 TAILQ_REMOVE(&kq->kq_knpend, kn, kn_tqe);
944                 if (kn->kn_status & KN_DISABLED) {
945                         kn->kn_status &= ~KN_QUEUED;
946                         kq->kq_count--;
947                         continue;
948                 }
949                 if ((kn->kn_flags & EV_ONESHOT) == 0 &&
950                     kn->kn_fop->f_event(kn, 0) == 0) {
951                         kn->kn_status &= ~(KN_QUEUED | KN_ACTIVE);
952                         kq->kq_count--;
953                         continue;
954                 }
955                 *kevp++ = kn->kn_kevent;
956                 ++total;
957                 --count;
958
959                 /*
960                  * Post-event action on the note
961                  */
962                 if (kn->kn_flags & EV_ONESHOT) {
963                         kn->kn_status &= ~KN_QUEUED;
964                         kq->kq_count--;
965                         crit_exit();
966                         kn->kn_fop->f_detach(kn);
967                         knote_drop(kn);
968                         crit_enter();
969                 } else if (kn->kn_flags & EV_CLEAR) {
970                         kn->kn_data = 0;
971                         kn->kn_fflags = 0;
972                         kn->kn_status &= ~(KN_QUEUED | KN_ACTIVE);
973                         kq->kq_count--;
974                 } else {
975                         TAILQ_INSERT_TAIL(&kq->kq_knpend, kn, kn_tqe);
976                 }
977         }
978         TAILQ_REMOVE(&kq->kq_knpend, &local_marker, kn_tqe);
979
980         crit_exit();
981         return (total);
982 }
983
984 /*
985  * XXX
986  * This could be expanded to call kqueue_scan, if desired.
987  *
988  * MPSAFE
989  */
990 static int
991 kqueue_read(struct file *fp, struct uio *uio, struct ucred *cred, int flags)
992 {
993         return (ENXIO);
994 }
995
996 /*
997  * MPSAFE
998  */
999 static int
1000 kqueue_write(struct file *fp, struct uio *uio, struct ucred *cred, int flags)
1001 {
1002         return (ENXIO);
1003 }
1004
1005 /*
1006  * MPALMOSTSAFE
1007  */
1008 static int
1009 kqueue_ioctl(struct file *fp, u_long com, caddr_t data,
1010              struct ucred *cred, struct sysmsg *msg)
1011 {
1012         struct kqueue *kq;
1013         int error;
1014
1015         get_mplock();
1016         kq = (struct kqueue *)fp->f_data;
1017
1018         switch(com) {
1019         case FIOASYNC:
1020                 if (*(int *)data)
1021                         kq->kq_state |= KQ_ASYNC;
1022                 else
1023                         kq->kq_state &= ~KQ_ASYNC;
1024                 error = 0;
1025                 break;
1026         case FIOSETOWN:
1027                 error = fsetown(*(int *)data, &kq->kq_sigio);
1028                 break;
1029         default:
1030                 error = ENOTTY;
1031                 break;
1032         }
1033         rel_mplock();
1034         return (error);
1035 }
1036
1037 /*
1038  * MPSAFE
1039  */
1040 static int
1041 kqueue_stat(struct file *fp, struct stat *st, struct ucred *cred)
1042 {
1043         struct kqueue *kq = (struct kqueue *)fp->f_data;
1044
1045         bzero((void *)st, sizeof(*st));
1046         st->st_size = kq->kq_count;
1047         st->st_blksize = sizeof(struct kevent);
1048         st->st_mode = S_IFIFO;
1049         return (0);
1050 }
1051
1052 /*
1053  * MPALMOSTSAFE - acquires mplock
1054  */
1055 static int
1056 kqueue_close(struct file *fp)
1057 {
1058         struct kqueue *kq = (struct kqueue *)fp->f_data;
1059
1060         get_mplock();
1061
1062         kqueue_terminate(kq);
1063
1064         fp->f_data = NULL;
1065         funsetown(kq->kq_sigio);
1066         rel_mplock();
1067
1068         kfree(kq, M_KQUEUE);
1069         return (0);
1070 }
1071
1072 void
1073 kqueue_wakeup(struct kqueue *kq)
1074 {
1075         if (kq->kq_state & KQ_SLEEP) {
1076                 kq->kq_state &= ~KQ_SLEEP;
1077                 wakeup(kq);
1078         }
1079         KNOTE(&kq->kq_sel.si_note, 0);
1080 }
1081
1082 /*
1083  * walk down a list of knotes, activating them if their event has triggered.
1084  */
1085 void
1086 knote(struct klist *list, long hint)
1087 {
1088         struct knote *kn;
1089
1090         SLIST_FOREACH(kn, list, kn_selnext)
1091                 if (kn->kn_fop->f_event(kn, hint))
1092                         KNOTE_ACTIVATE(kn);
1093 }
1094
1095 /*
1096  * remove all knotes from a specified klist
1097  */
1098 void
1099 knote_remove(struct klist *list)
1100 {
1101         struct knote *kn;
1102
1103         while ((kn = SLIST_FIRST(list)) != NULL) {
1104                 kn->kn_fop->f_detach(kn);
1105                 knote_drop(kn);
1106         }
1107 }
1108
1109 /*
1110  * remove all knotes referencing a specified fd
1111  */
1112 void
1113 knote_fdclose(struct file *fp, struct filedesc *fdp, int fd)
1114 {
1115         struct knote *kn;
1116
1117 restart:
1118         SLIST_FOREACH(kn, &fp->f_klist, kn_link) {
1119                 if (kn->kn_kq->kq_fdp == fdp && kn->kn_id == fd) {
1120                         kn->kn_fop->f_detach(kn);
1121                         knote_drop(kn);
1122                         goto restart;
1123                 }
1124         }
1125 }
1126
1127 static void
1128 knote_attach(struct knote *kn)
1129 {
1130         struct klist *list;
1131         struct kqueue *kq = kn->kn_kq;
1132
1133         if (kn->kn_fop->f_isfd) {
1134                 KKASSERT(kn->kn_fp);
1135                 list = &kn->kn_fp->f_klist;
1136         } else {
1137                 if (kq->kq_knhashmask == 0)
1138                         kq->kq_knhash = hashinit(KN_HASHSIZE, M_KQUEUE,
1139                                                  &kq->kq_knhashmask);
1140                 list = &kq->kq_knhash[KN_HASH(kn->kn_id, kq->kq_knhashmask)];
1141         }
1142         SLIST_INSERT_HEAD(list, kn, kn_link);
1143         TAILQ_INSERT_HEAD(&kq->kq_knlist, kn, kn_kqlink);
1144         kn->kn_status = 0;
1145 }
1146
1147 /*
1148  * should be called outside of a critical section, since we don't want to
1149  * hold a critical section while calling fdrop and free.
1150  */
1151 static void
1152 knote_drop(struct knote *kn)
1153 {
1154         struct kqueue *kq;
1155         struct klist *list;
1156
1157         kq = kn->kn_kq;
1158
1159         if (kn->kn_fop->f_isfd)
1160                 list = &kn->kn_fp->f_klist;
1161         else
1162                 list = &kq->kq_knhash[KN_HASH(kn->kn_id, kq->kq_knhashmask)];
1163
1164         SLIST_REMOVE(list, kn, knote, kn_link);
1165         TAILQ_REMOVE(&kq->kq_knlist, kn, kn_kqlink);
1166         if (kn->kn_status & KN_QUEUED)
1167                 knote_dequeue(kn);
1168         if (kn->kn_fop->f_isfd)
1169                 fdrop(kn->kn_fp);
1170         knote_free(kn);
1171 }
1172
1173
1174 static void
1175 knote_enqueue(struct knote *kn)
1176 {
1177         struct kqueue *kq = kn->kn_kq;
1178
1179         crit_enter();
1180         KASSERT((kn->kn_status & KN_QUEUED) == 0, ("knote already queued"));
1181
1182         TAILQ_INSERT_TAIL(&kq->kq_knpend, kn, kn_tqe);
1183         kn->kn_status |= KN_QUEUED;
1184         ++kq->kq_count;
1185
1186         /*
1187          * Send SIGIO on request (typically set up as a mailbox signal)
1188          */
1189         if (kq->kq_sigio && (kq->kq_state & KQ_ASYNC) && kq->kq_count == 1)
1190                 pgsigio(kq->kq_sigio, SIGIO, 0);
1191         crit_exit();
1192         kqueue_wakeup(kq);
1193 }
1194
1195 static void
1196 knote_dequeue(struct knote *kn)
1197 {
1198         struct kqueue *kq = kn->kn_kq;
1199
1200         KASSERT(kn->kn_status & KN_QUEUED, ("knote not queued"));
1201         crit_enter();
1202
1203         TAILQ_REMOVE(&kq->kq_knpend, kn, kn_tqe);
1204         kn->kn_status &= ~KN_QUEUED;
1205         kq->kq_count--;
1206         crit_exit();
1207 }
1208
1209 static void
1210 knote_init(void)
1211 {
1212         knote_zone = zinit("KNOTE", sizeof(struct knote), 0, 0, 1);
1213 }
1214 SYSINIT(knote, SI_SUB_PSEUDO, SI_ORDER_ANY, knote_init, NULL)
1215
1216 static struct knote *
1217 knote_alloc(void)
1218 {
1219         return ((struct knote *)zalloc(knote_zone));
1220 }
1221
1222 static void
1223 knote_free(struct knote *kn)
1224 {
1225         zfree(knote_zone, kn);
1226 }