kernel - Remove kevent subsystem from under mplock
authorSamuel J. Greear <sjg@thesjg.com>
Thu, 29 Jul 2010 12:06:13 +0000 (12:06 +0000)
committerSamuel J. Greear <sjg@thesjg.com>
Tue, 3 Aug 2010 17:44:29 +0000 (17:44 +0000)
* Create a global token for the kevent subsystem to operate under

* Push klist insertion and removal into knote_insert()/knote_remove()

* Rename struct selinfo to struct kqinfo

83 files changed:
sys/bus/cam/scsi/scsi_target.c
sys/bus/firewire/firewire.c
sys/bus/firewire/firewirereg.h
sys/bus/firewire/fwdev.c
sys/bus/usb/usb.c
sys/dev/drm/drmP.h
sys/dev/misc/cmx/cmx.c
sys/dev/misc/cmx/cmx_pccard.c
sys/dev/misc/cmx/cmxvar.h
sys/dev/misc/hotplug/hotplug.c
sys/dev/misc/kbd/kbd.c
sys/dev/misc/kbdmux/kbdmux.c
sys/dev/misc/mse/mse.c
sys/dev/misc/nmdm/nmdm.c
sys/dev/misc/psm/psm.c
sys/dev/misc/snp/snp.c
sys/dev/misc/spic/spic.c
sys/dev/misc/syscons/apm/apm_saver.c
sys/dev/misc/tw/tw.c
sys/dev/raid/aac/aac.c
sys/dev/raid/aac/aacvar.h
sys/dev/sound/pcm/buffer.c
sys/dev/sound/pcm/buffer.h
sys/dev/sound/pcm/channel.c
sys/dev/sound/pcm/dsp.c
sys/dev/usbmisc/ucom/ucom.c
sys/dev/usbmisc/ugen/ugen.c
sys/dev/usbmisc/uhid/uhid.c
sys/dev/usbmisc/ums/ums.c
sys/dev/video/bktr/bktr_audio.c
sys/dev/video/bktr/bktr_core.c
sys/dev/video/bktr/bktr_i2c.c
sys/dev/video/bktr/bktr_os.c
sys/dev/video/bktr/bktr_reg.h
sys/dev/video/bktr/bktr_tuner.c
sys/dev/video/cxm/cxm.c
sys/dev/video/cxm/cxm.h
sys/kern/kern_event.c
sys/kern/kern_sig.c
sys/kern/kern_udev.c
sys/kern/subr_bus.c
sys/kern/subr_log.c
sys/kern/sys_mqueue.c
sys/kern/sys_pipe.c
sys/kern/tty.c
sys/kern/tty_pty.c
sys/kern/uipc_msg.c
sys/kern/uipc_socket.c
sys/kern/uipc_socket2.c
sys/kern/uipc_syscalls.c
sys/kern/vfs_aio.c
sys/kern/vfs_subr.c
sys/net/bpf.c
sys/net/bpfdesc.h
sys/net/i4b/driver/i4b_rbch.c
sys/net/i4b/driver/i4b_tel.c
sys/net/i4b/layer4/i4b_i4bdrv.c
sys/net/tap/if_tap.c
sys/net/tap/if_tapvar.h
sys/net/tun/if_tun.c
sys/net/tun/if_tunvar.h
sys/netproto/smb/smb_dev.c
sys/netproto/smb/smb_dev.h
sys/platform/pc32/acpica5/acpi_machdep.c
sys/platform/pc32/apm/apm.c
sys/platform/pc32/apm/apm.h
sys/platform/pc32/isa/asc.c
sys/platform/pc64/acpica5/acpi_machdep.c
sys/platform/pc64/apm/apm.c
sys/platform/pc64/apm/apm.h
sys/platform/pc64/isa/asc.c
sys/sys/event.h
sys/sys/eventvar.h
sys/sys/mqueue.h
sys/sys/pipe.h
sys/sys/selinfo.h [deleted file]
sys/sys/socketvar.h
sys/sys/tty.h
sys/sys/vnode.h
sys/vfs/gnu/ext2fs/ext2_vnops.c
sys/vfs/hammer/hammer_vnops.c
sys/vfs/ufs/ufs_readwrite.c
sys/vfs/ufs/ufs_vnops.c

index 28f753e..5993da7 100644 (file)
@@ -88,7 +88,7 @@ struct targ_softc {
        struct cam_periph       *periph;
        struct cam_path         *path;
        targ_state               state;
-       struct selinfo           read_select;
+       struct kqinfo            read_kq;
        struct devstat           device_stats;
 };
 
@@ -344,9 +344,7 @@ targkqfilter(struct dev_kqfilter_args *ap)
                return (0);
        }
 
-       crit_enter();
-       SLIST_INSERT_HEAD(&softc->read_select.si_note, kn, kn_selnext);
-       crit_exit();
+       knote_insert(&softc->read_kq.ki_note, kn);
        return (0);
 }
 
@@ -356,9 +354,7 @@ targfiltdetach(struct knote *kn)
        struct  targ_softc *softc;
 
        softc = (struct targ_softc *)kn->kn_hook;
-       crit_enter();
-       SLIST_REMOVE(&softc->read_select.si_note, kn, knote, kn_selnext);
-       crit_exit();
+       knote_remove(&softc->read_kq.ki_note, kn);
 }
 
 /* Notify the user's kqueue when the user queue or abort queue gets a CCB */
@@ -1119,7 +1115,7 @@ notify_user(struct targ_softc *softc)
         * Notify users sleeping via poll(), kqueue(), and
         * blocking read().
         */
-       KNOTE(&softc->read_select.si_note, 0);
+       KNOTE(&softc->read_kq.ki_note, 0);
        wakeup(&softc->user_ccb_queue);
 }
 
index 5031a70..f1cb651 100644 (file)
@@ -1950,7 +1950,7 @@ fw_rcv(struct fw_rcv_buf *rb)
                STAILQ_INSERT_TAIL(&xferq->q, rb->xfer, link);
                crit_exit();
                sc = device_get_softc(rb->fc->bdev);
-               KNOTE(&xferq->rsel.si_note, 0);
+               KNOTE(&xferq->rkq.ki_note, 0);
                if (xferq->flag & FWXFERQ_WAKEUP) {
                        xferq->flag &= ~FWXFERQ_WAKEUP;
                        wakeup((caddr_t)xferq);
index 1dececc..6faa9c7 100644 (file)
@@ -44,8 +44,8 @@ typedef       struct thread fw_proc;
 typedef        struct proc fw_proc;
 #endif
 
-#include <sys/selinfo.h>
 #include <sys/uio.h>
+#include <sys/event.h>
 
 struct dev_ioctl_args;
 
@@ -205,7 +205,7 @@ struct fw_xferq {
        STAILQ_HEAD(, fw_bulkxfer) stfree;
        STAILQ_HEAD(, fw_bulkxfer) stdma;
        struct fw_bulkxfer *stproc;
-       struct selinfo rsel;
+       struct kqinfo rkq;
        caddr_t sc;
        void (*hand) (struct fw_xferq *);
 };
index 206f7c7..5acb9c3 100644 (file)
@@ -755,10 +755,8 @@ fw_kqfilter(struct dev_kqfilter_args *ap)
                return (0);
        }
 
-       crit_enter();
-       klist = &ir->rsel.si_note;
-       SLIST_INSERT_HEAD(klist, kn, kn_selnext);
-       crit_exit();
+       klist = &ir->rkq.ki_note;
+       knote_insert(klist, kn);
 
        return (0);
 }
@@ -767,12 +765,9 @@ static void
 fwfilt_detach(struct knote *kn)
 {
        struct fw_xferq *ir = (struct fw_xferq *)kn->kn_hook;
-       struct klist *klist;
+       struct klist *klist = &ir->rkq.ki_note;
 
-       crit_enter();
-       klist = &ir->rsel.si_note;
-       SLIST_REMOVE(klist, kn, knote, kn_selnext);
-       crit_exit();
+       knote_remove(klist, kn);
 }
 
 static int
index 1bf35da..04cd553 100644 (file)
@@ -70,7 +70,6 @@
 #include <sys/conf.h>
 #include <sys/device.h>
 #include <sys/event.h>
-#include <sys/select.h>
 #include <sys/vnode.h>
 #include <sys/signalvar.h>
 #include <sys/sysctl.h>
@@ -181,7 +180,7 @@ struct usb_event_q {
 static TAILQ_HEAD(, usb_event_q) usb_events =
        TAILQ_HEAD_INITIALIZER(usb_events);
 static int usb_nevents = 0;
-static struct selinfo usb_selevent;
+static struct kqinfo usb_kqevent;
 static struct proc *usb_async_proc;  /* process that wants USB SIGIO */
 static int usb_dev_open = 0;
 static void usb_add_event(int, struct usb_event *);
@@ -718,10 +717,8 @@ usbkqfilter(struct dev_kqfilter_args *ap)
                return (0);
        }
 
-       crit_enter();
-       klist = &usb_selevent.si_note;
-       SLIST_INSERT_HEAD(klist, kn, kn_selnext);
-       crit_exit();
+       klist = &usb_kqevent.ki_note;
+       knote_insert(klist, kn);
 
        return (0);
 }
@@ -731,10 +728,8 @@ usbfilt_detach(struct knote *kn)
 {
        struct klist *klist;
 
-       crit_enter();
-       klist = &usb_selevent.si_note;
-       SLIST_REMOVE(klist, kn, knote, kn_selnext);
-       crit_exit();
+       klist = &usb_kqevent.ki_note;
+       knote_remove(klist, kn);
 }
 
 static int
@@ -870,7 +865,7 @@ usb_add_event(int type, struct usb_event *uep)
        TAILQ_INSERT_TAIL(&usb_events, ueq, next);
        usb_nevents++;
        wakeup(&usb_events);
-       KNOTE(&usb_selevent.si_note, 0);
+       KNOTE(&usb_kqevent.ki_note, 0);
        if (usb_async_proc != NULL) {
                ksignal(usb_async_proc, SIGIO);
        }
index 59d1c45..3dcce54 100644 (file)
@@ -81,7 +81,6 @@ struct drm_file;
 #include <sys/spinlock2.h>
 #include <bus/pci/pcivar.h>
 #include <bus/pci/pcireg.h>
-#include <sys/selinfo.h>
 #include <sys/bus.h>
 
 #include "dev/drm/drm.h"
index 63c39dd..5f62dc0 100644 (file)
@@ -48,7 +48,6 @@
 #include <sys/conf.h>
 #include <sys/fcntl.h>
 #include <sys/uio.h>
-#include <sys/selinfo.h>
 #include <sys/types.h>
 #include <sys/lock.h>
 #include <sys/device.h>
@@ -281,7 +280,7 @@ cmx_detach(device_t dev)
                callout_stop(&sc->ch);
                sc->polling = 0;
                CMX_UNLOCK(sc);
-               KNOTE(&sc->sel.si_note, 0);
+               KNOTE(&sc->kq.ki_note, 0);
        } else {
                CMX_UNLOCK(sc);
        }
@@ -389,7 +388,7 @@ cmx_timeout_by_cmd(uint8_t cmd)
 /*
  * Periodical callout routine, polling the reader for data
  * availability.  If the reader signals data ready for reading,
- * wakes up the processes which are waiting in select()/poll().
+ * wakes up the processes which are waiting in select()/poll()/kevent().
  * Otherwise, reschedules itself with a delay of POLL_TICKS.
  */
 static void
@@ -404,7 +403,7 @@ cmx_tick(void *xsc)
                DEBUG_printf(sc->dev, "BSR=%b\n", bsr, BSRBITS);
                if (cmx_test(bsr, BSR_BULK_IN_FULL, 1)) {
                        sc->polling = 0;
-                       KNOTE(&sc->sel.si_note, 0);
+                       KNOTE(&sc->kq.ki_note, 0);
                } else {
                        callout_reset(&sc->ch, POLL_TICKS, cmx_tick, sc);
                }
@@ -462,7 +461,7 @@ cmx_close(struct dev_close_args *ap)
                callout_stop(&sc->ch);
                sc->polling = 0;
                CMX_UNLOCK(sc);
-               KNOTE(&sc->sel.si_note, 0);
+               KNOTE(&sc->kq.ki_note, 0);
                CMX_LOCK(sc);
        }
        sc->open = 0;
@@ -503,7 +502,7 @@ cmx_read(struct dev_read_args *ap)
                callout_stop(&sc->ch);
                sc->polling = 0;
                CMX_UNLOCK(sc);
-               KNOTE(&sc->sel.si_note, 0);
+               KNOTE(&sc->kq.ki_note, 0);
        } else {
                CMX_UNLOCK(sc);
        }
@@ -682,10 +681,8 @@ cmx_kqfilter(struct dev_kqfilter_args *ap)
                return (0);
        }
 
-       crit_enter();
-       klist = &sc->sel.si_note;
-       SLIST_INSERT_HEAD(klist, kn, kn_selnext);
-       crit_exit();
+       klist = &sc->kq.ki_note;
+       knote_insert(klist, kn);
 
        return (0);
 }
@@ -694,12 +691,9 @@ static void
 cmx_filter_detach(struct knote *kn)
 {
        struct cmx_softc *sc = (struct cmx_softc *)kn->kn_hook;
-       struct klist *klist;
+       struct klist *klist = &sc->kq.ki_note;
 
-       crit_enter();
-       klist = &sc->sel.si_note;
-       SLIST_REMOVE(klist, kn, knote, kn_selnext);
-       crit_exit();
+       knote_remove(klist, kn);
 }
 
 static int
index f2c9dec..6e5b332 100644 (file)
@@ -32,8 +32,8 @@
 #include <sys/systm.h>
 #include <sys/kernel.h>
 #include <sys/socket.h>
-#include <sys/selinfo.h>
 #include <sys/lock.h>
+#include <sys/event.h>
 
 #include <sys/module.h>
 #include <sys/bus.h>
index dc5234e..a97bb3e 100644 (file)
@@ -52,7 +52,7 @@ struct cmx_softc {
 
        struct lock mtx;                /* per-unit lock */
        struct callout ch;              /* callout handle */
-       struct selinfo sel;             /* select/poll queue handle */
+       struct kqinfo kq;               /* select/poll/kq queue handle */
 
        int open;                       /* is chardev open? */
        int polling;                    /* are we polling? */
index 2c7d64f..0417cef 100644 (file)
@@ -27,7 +27,6 @@
 #include <sys/sysctl.h>
 #include <sys/device.h>
 #include <sys/lock.h>
-#include <sys/selinfo.h>
 #include <sys/event.h>
 #include <sys/uio.h>
 #include <sys/thread.h>
@@ -68,7 +67,7 @@ static struct hotplug_softc
        int opened;
        int qcount;
        struct hpq queue;
-       struct selinfo sel;
+       struct kqinfo kq;
        void (*old_devfs_node_added)(struct hotplug_device *hpdev);
        void (*old_devfs_node_removed)(struct hotplug_device *hpdev);
 } hpsc;
@@ -125,10 +124,8 @@ hotplugkqfilter(struct dev_kqfilter_args *ap)
        }
 
        lockmgr(&hpsc.lock, LK_EXCLUSIVE);
-       crit_enter();
-       klist = &hpsc.sel.si_note;
-       SLIST_INSERT_HEAD(klist, kn, kn_selnext);
-       crit_exit();
+       klist = &hpsc.kq.ki_note;
+       knote_insert(klist, kn);
        lockmgr(&hpsc.lock, LK_RELEASE);
 
        return (0);
@@ -140,10 +137,8 @@ hotplugfiltdetach(struct knote *kn)
        struct klist *klist;
 
        lockmgr(&hpsc.lock, LK_EXCLUSIVE);
-       crit_enter();
-       klist = &hpsc.sel.si_note;
-       SLIST_REMOVE(klist, kn, knote, kn_selnext);
-       crit_exit();
+       klist = &hpsc.kq.ki_note;
+       knote_remove(klist, kn);
        lockmgr(&hpsc.lock, LK_RELEASE);
 }
 
@@ -221,7 +216,7 @@ hotplug_put_event(struct hotplug_event *he)
        hpsc.qcount++;
        wakeup(&hpsc);
        lockmgr(&hpsc.lock, LK_RELEASE);
-       KNOTE(&hpsc.sel.si_note, 0);
+       KNOTE(&hpsc.kq.ki_note, 0);
        return (0);
 }
 
index 3029768..0f51936 100644 (file)
@@ -62,7 +62,7 @@
 struct genkbd_softc {
        int             gkb_flags;      /* flag/status bits */
 #define KB_ASLEEP      (1 << 0)
-       struct selinfo  gkb_rsel;
+       struct kqinfo   gkb_rkq;
        char            gkb_q[KB_QSIZE];                /* input queue */
        unsigned int    gkb_q_start;
        unsigned int    gkb_q_length;
@@ -768,11 +768,9 @@ genkbdkqfilter(struct dev_kqfilter_args *ap)
                return (0);
        }
 
-       crit_enter();
        sc = dev->si_drv1;
-       klist = &sc->gkb_rsel.si_note;
-       SLIST_INSERT_HEAD(klist, kn, kn_selnext);
-       crit_exit();
+       klist = &sc->gkb_rkq.ki_note;
+       knote_insert(klist, kn);
 
        return (0);
 }
@@ -784,11 +782,9 @@ genkbdfiltdetach(struct knote *kn)
        genkbd_softc_t sc;
        struct klist *klist;
 
-       crit_enter();
        sc = dev->si_drv1;
-       klist = &sc->gkb_rsel.si_note;
-       SLIST_REMOVE(klist, kn, knote, kn_selnext);
-       crit_exit();
+       klist = &sc->gkb_rkq.ki_note;
+       knote_remove(klist, kn);
 }
 
 static int
@@ -836,7 +832,7 @@ genkbd_event(keyboard_t *kbd, int event, void *arg)
                        sc->gkb_flags &= ~KB_ASLEEP;
                        wakeup((caddr_t)sc);
                }
-               KNOTE(&sc->gkb_rsel.si_note, 0);
+               KNOTE(&sc->gkb_rkq.ki_note, 0);
                return 0;
        default:
                return EINVAL;
@@ -906,7 +902,7 @@ genkbd_event(keyboard_t *kbd, int event, void *arg)
                        sc->gkb_flags &= ~KB_ASLEEP;
                        wakeup((caddr_t)sc);
                }
-               KNOTE(&sc->gkb_rsel.si_note, 0);
+               KNOTE(&sc->gkb_rkq.ki_note, 0);
        }
 
        return 0;
index 754e4c7..4de39e3 100644 (file)
@@ -48,7 +48,7 @@
 #include <sys/poll.h>
 #include <sys/proc.h>
 #include <sys/queue.h>
-#include <sys/selinfo.h>
+#include <sys/event.h>
 #include <sys/systm.h>
 #include <sys/taskqueue.h>
 #include <sys/uio.h>
index 05d1033..2ed49ca 100644 (file)
@@ -52,7 +52,6 @@
 #include <sys/kernel.h>
 #include <sys/bus.h>
 #include <sys/event.h>
-#include <sys/selinfo.h>
 #include <sys/uio.h>
 #include <sys/rman.h>
 #include <sys/thread2.h>
@@ -73,7 +72,7 @@
 typedef struct mse_softc {
        int             sc_flags;
        int             sc_mousetype;
-       struct selinfo  sc_selp;
+       struct kqinfo   sc_kqp;
        struct resource *sc_port;
        struct resource *sc_intr;
        bus_space_tag_t sc_iot;
@@ -631,10 +630,8 @@ msekqfilter(struct dev_kqfilter_args *ap)
                return (0);
        }
 
-       crit_enter();
-       klist = &sc->sc_selp.si_note;
-       SLIST_INSERT_HEAD(klist, kn, kn_selnext);
-       crit_exit();
+       klist = &sc->sc_kqp.ki_note;
+       knote_insert(klist, kn);
 
        return (0);
 }
@@ -645,10 +642,8 @@ msefilter_detach(struct knote *kn)
        mse_softc_t *sc = (mse_softc_t *)kn->kn_hook;
        struct klist *klist;
 
-       crit_enter();
-       klist = &sc->sc_selp.si_note;
-       SLIST_REMOVE(klist, kn, knote, kn_selnext);
-       crit_exit();
+       klist = &sc->sc_kqp.ki_note;
+       knote_remove(klist, kn);
 }
 
 static int
@@ -757,7 +752,7 @@ mseintr(void *arg)
                        sc->sc_flags &= ~MSESC_WANT;
                        wakeup((caddr_t)sc);
                }
-               KNOTE(&sc->sc_selp.si_note, 0);
+               KNOTE(&sc->sc_kqp.ki_note, 0);
        }
 }
 
index 701b0fa..5774269 100644 (file)
@@ -442,11 +442,11 @@ wakeup_other(struct tty *tp, int flag)
        GETPARTS(tp, ourpart, otherpart);
        if (flag & FREAD) {
                wakeup(TSA_PTC_READ((&otherpart->nm_tty)));
-               KNOTE(&otherpart->nm_tty.t_rsel.si_note, 0);
+               KNOTE(&otherpart->nm_tty.t_rkq.ki_note, 0);
        }
        if (flag & FWRITE) {
                wakeup(TSA_PTC_WRITE((&otherpart->nm_tty)));
-               KNOTE(&otherpart->nm_tty.t_wsel.si_note, 0);
+               KNOTE(&otherpart->nm_tty.t_wkq.ki_note, 0);
        }
 }
 
index d502c83..1911c77 100644 (file)
@@ -75,7 +75,6 @@
 #include <sys/syslog.h>
 #include <sys/malloc.h>
 #include <sys/rman.h>
-#include <sys/selinfo.h>
 #include <sys/thread2.h>
 #include <sys/time.h>
 #include <sys/uio.h>
@@ -152,7 +151,7 @@ typedef struct ringbuf {
 /* driver control block */
 struct psm_softc {             /* Driver status information */
     int                  unit;
-    struct selinfo rsel;       /* Process selecting for Input */
+    struct kqinfo rkq;         /* Processes with registered kevents */
     unsigned char state;       /* Mouse driver state */
     int           config;      /* driver configuration flags */
     int           flags;       /* other flags */
@@ -1310,8 +1309,6 @@ psmopen(struct dev_open_args *ap)
 #endif
 
     /* Initialize state */
-    sc->rsel.si_flags = 0;
-    sc->rsel.si_pid = 0;
     sc->mode.level = sc->dflt_mode.level;
     sc->mode.protocol = sc->dflt_mode.protocol;
     sc->watchdog = FALSE;
@@ -2377,7 +2374,7 @@ psmintr(void *arg)
             sc->state &= ~PSM_ASLP;
             wakeup((caddr_t) sc);
        }
-       KNOTE(&sc->rsel.si_note, 0);
+       KNOTE(&sc->rkq.ki_note, 0);
     }
 }
 
@@ -2404,10 +2401,8 @@ psmkqfilter(struct dev_kqfilter_args *ap)
                return (0);
        }
 
-       crit_enter();
-       klist = &sc->rsel.si_note;
-       SLIST_INSERT_HEAD(klist, kn, kn_selnext);
-       crit_exit();
+       klist = &sc->rkq.ki_note;
+       knote_insert(klist, kn);
 
        return (0);
 }
@@ -2418,10 +2413,8 @@ psmfilter_detach(struct knote *kn)
        struct psm_softc *sc = (struct psm_softc *)kn->kn_hook;
        struct klist *klist;
 
-       crit_enter();
-       klist = &sc->rsel.si_note;
-       SLIST_REMOVE(klist, kn, knote, kn_selnext);
-       crit_exit();
+       klist = &sc->rkq.ki_note;
+       knote_remove(klist, kn);
 }
 
 static int
index 0e63fe6..3999707 100644 (file)
@@ -81,7 +81,7 @@ struct snoop {
        u_long                   snp_blen;      /* Used length. */
        caddr_t                  snp_buf;       /* Allocation pointer. */
        int                      snp_flags;     /* Flags. */
-       struct selinfo           snp_sel;       /* Select info. */
+       struct kqinfo            snp_kq;        /* Kqueue info. */
        int                      snp_olddisc;   /* Old line discipline. */
 };
 
@@ -365,7 +365,7 @@ snp_in(struct snoop *snp, char *buf, int n)
                snp->snp_flags &= ~SNOOP_RWAIT;
                wakeup((caddr_t)snp);
        }
-       KNOTE(&snp->snp_sel.si_note, 0);
+       KNOTE(&snp->snp_kq.ki_note, 0);
 
        return (n);
 }
@@ -437,7 +437,7 @@ snp_detach(struct snoop *snp)
        snp->snp_target = NULL;
 
 detach_notty:
-       KNOTE(&snp->snp_sel.si_note, 0);
+       KNOTE(&snp->snp_kq.ki_note, 0);
        if ((snp->snp_flags & SNOOP_OPEN) == 0) 
                kfree(snp, M_SNP);
 
@@ -589,10 +589,8 @@ snpkqfilter(struct dev_kqfilter_args *ap)
                return (0);
        }
 
-       crit_enter();
-       klist = &snp->snp_sel.si_note;
-       SLIST_INSERT_HEAD(klist, kn, kn_selnext);
-       crit_exit();
+       klist = &snp->snp_kq.ki_note;
+       knote_insert(klist, kn);
 
        return (0);
 }
@@ -603,10 +601,8 @@ snpfilter_detach(struct knote *kn)
        struct snoop *snp = (struct snoop *)kn->kn_hook;
        struct klist *klist;
 
-       crit_enter();
-       klist = &snp->snp_sel.si_note;
-       SLIST_REMOVE(klist, kn, knote, kn_selnext);
-       crit_exit();
+       klist = &snp->snp_kq.ki_note;
+       knote_insert(klist, kn);
 }
 
 static int
index 0d5d97b..370c554 100644 (file)
@@ -111,7 +111,7 @@ struct spic_softc {
        int sc_buttonlast;
        struct callout  sc_timeout_ch;
        device_t sc_dev;
-       struct selinfo sc_rsel;
+       struct kqinfo sc_rkq;
        u_char sc_buf[SCBUFLEN];
        int sc_count;
        int sc_model;
@@ -438,7 +438,7 @@ spictimeout(void *arg)
                        sc->sc_sleeping = 0;
                        wakeup((caddr_t) sc);
                }
-               KNOTE(&sc->sc_rsel.si_note, 0);
+               KNOTE(&sc->sc_rkq.ki_note, 0);
        }
        spic_call2(sc, 0x81, 0xff); /* Clear event */
 
@@ -544,10 +544,8 @@ spickqfilter(struct dev_kqfilter_args *ap)
                return (0);
        }
 
-       crit_enter();
-       klist = &sc->sc_rsel.si_note;
-       SLIST_INSERT_HEAD(klist, kn, kn_selnext);
-       crit_exit();
+       klist = &sc->sc_rkq.ki_note;
+       knote_insert(klist, kn);
 
        return (0);
 }
@@ -556,12 +554,9 @@ static void
 spicfilt_detach(struct knote *kn)
 {
        struct spic_softc *sc = (struct spic_softc *)kn->kn_hook;
-       struct klist *klist;
+       struct klist *klist = &sc->sc_rkq.ki_note;
 
-       crit_enter();
-       klist = &sc->sc_rsel.si_note;
-       SLIST_REMOVE(klist, kn, knote, kn_selnext);
-       crit_exit();
+       knote_remove(klist, kn);
 }
 
 static int
index bb24bd0..1c5c955 100644 (file)
 #include <sys/module.h>
 #include <sys/consio.h>
 #include <sys/fbio.h>
+#include <sys/event.h>
 
 #include <dev/video/fb/fbreg.h>
 #include <dev/video/fb/splashreg.h>
 #include "../syscons.h"
 
-#include <sys/selinfo.h>
 #include <machine/apm_bios.h>
 #include <machine/pc/bios.h>
 #include <machine_base/apm/apm.h>
index 2711092..201cc24 100644 (file)
 #include <sys/kernel.h>
 #include <sys/uio.h>
 #include <sys/syslog.h>
-#include <sys/selinfo.h>
 #include <sys/event.h>
 #include <sys/thread2.h>
 
@@ -245,7 +244,7 @@ static struct dev_ops tw_ops = {
 static struct tw_sc {
   u_int sc_port;               /* I/O Port */
   u_int sc_state;              /* Current software control state */
-  struct selinfo sc_selp;      /* Information for select() */
+  struct kqinfo sc_kqp;                /* Information for select()/poll()/kq() */
   u_char sc_xphase;            /* Current state of sync (for transmitter) */
   u_char sc_rphase;            /* Current state of sync (for receiver) */
   u_char sc_flags;             /* Flags for current reception */
@@ -556,10 +555,8 @@ twkqfilter(struct dev_kqfilter_args *ap)
     return (0);
   }
 
-  crit_enter();
-  klist = &sc->sc_selp.si_note;
-  SLIST_INSERT_HEAD(klist, kn, kn_selnext);
-  crit_exit();
+  klist = &sc->sc_kqp.ki_note;
+  knote_insert(klist, kn);
 
   return (0);
 }
@@ -570,10 +567,8 @@ twfilter_detach(struct knote *kn)
   struct tw_sc *sc = (struct tw_sc *)kn->kn_hook;
   struct klist *klist;
 
-  crit_enter();
-  klist = &sc->sc_selp.si_note;
-  SLIST_REMOVE(klist, kn, knote, kn_selnext);
-  crit_exit();
+  klist = &sc->sc_kqp.ki_note;
+  knote_remove(klist, kn);
 }
 
 static int
@@ -882,7 +877,7 @@ twputpkt(struct tw_sc *sc, u_char *p)
     sc->sc_state &= ~TWS_WANT;
     wakeup((caddr_t)(&sc->sc_buf));
   }
-  KNOTE(&sc->sc_selp.si_note, 0);
+  KNOTE(&sc->sc_kqp.ki_note, 0);
   return(0);
 }
 
index d40ed53..cfc8f0c 100644 (file)
@@ -3084,10 +3084,8 @@ aac_kqfilter(struct dev_kqfilter_args *ap)
                return (0);
        }
 
-       crit_enter();
-       klist = &sc->rcv_select.si_note;
-       SLIST_INSERT_HEAD(klist, kn, kn_selnext);
-       crit_exit();
+       klist = &sc->rcv_kq.ki_note;
+       knote_insert(klist, kn);
 
        return (0);
 }
@@ -3098,10 +3096,8 @@ aac_filter_detach(struct knote *kn)
        struct aac_softc *sc = (struct aac_softc *)kn->kn_hook;
        struct klist *klist;
 
-       crit_enter();
-       klist = &sc->rcv_select.si_note;
-       SLIST_REMOVE(klist, kn, knote, kn_selnext);
-       crit_exit();
+       klist = &sc->rcv_kq.ki_note;
+       knote_remove(klist, kn);
 }
 
 static int
@@ -3379,7 +3375,7 @@ aac_handle_aif(struct aac_softc *sc, struct aac_fib *fib)
                        wakeup(sc->aac_aifq);
                /* token may have been lost */
                /* Wakeup any poll()ers */
-               KNOTE(&sc->rcv_select.si_note, 0);
+               KNOTE(&sc->rcv_kq.ki_note, 0);
                /* token may have been lost */
        }
        AAC_LOCK_RELEASE(&sc->aac_aifq_lock);
index 8fffe8e..8995c3c 100644 (file)
@@ -34,7 +34,7 @@
 #include <sys/buf2.h>
 #include <sys/eventhandler.h>
 #include <sys/lock.h>
-#include <sys/selinfo.h>
+#include <sys/event.h>
 #include <sys/taskqueue.h>
 #include <sys/thread2.h>
 
@@ -373,7 +373,7 @@ struct aac_softc
        struct aac_aif_command  aac_aifq[AAC_AIFQ_LENGTH];
        int                     aac_aifq_head;
        int                     aac_aifq_tail;
-       struct selinfo          rcv_select;
+       struct kqinfo           rcv_kq;
        struct thread           *aifthread;
        int                     aifflags;
 #define AAC_AIFFLAGS_RUNNING   (1 << 0)
index 6f0f342..afae55f 100644 (file)
@@ -36,7 +36,7 @@ SND_DECLARE_FILE("$DragonFly: src/sys/dev/sound/pcm/buffer.c,v 1.11 2008/01/06 1
 /*
  * XXX
  *
- * sndbuf_seltask is a taskqueue callback routine, called from
+ * sndbuf_kqtask is a taskqueue callback routine, called from
  * taskqueue_swi, which runs under the MP lock.
  *
  * The only purpose is to be able to KNOTE() from a sound
@@ -44,12 +44,12 @@ SND_DECLARE_FILE("$DragonFly: src/sys/dev/sound/pcm/buffer.c,v 1.11 2008/01/06 1
  * can't call KNOTE() directly.
  */
 static void
-sndbuf_seltask(void *context, int pending)
+sndbuf_kqtask(void *context, int pending)
 {
        struct snd_dbuf *b = context;
-       struct selinfo *si = sndbuf_getsel(b);
+       struct kqinfo *ki = sndbuf_getkq(b);
 
-       KNOTE(&si->si_note, 0);
+       KNOTE(&ki->ki_note, 0);
 }
 
 struct snd_dbuf *
@@ -61,7 +61,7 @@ sndbuf_create(device_t dev, char *drv, char *desc, struct pcm_channel *channel)
        ksnprintf(b->name, SNDBUF_NAMELEN, "%s:%s", drv, desc);
        b->dev = dev;
        b->channel = channel;
-       TASK_INIT(&b->seltask, 0, sndbuf_seltask, b);
+       TASK_INIT(&b->kqtask, 0, sndbuf_kqtask, b);
 
        return b;
 }
@@ -408,10 +408,10 @@ sndbuf_setrun(struct snd_dbuf *b, int go)
        b->dl = go? b->blksz : 0;
 }
 
-struct selinfo *
-sndbuf_getsel(struct snd_dbuf *b)
+struct kqinfo *
+sndbuf_getkq(struct snd_dbuf *b)
 {
-       return &b->sel;
+       return &b->kq;
 }
 
 /************************************************************/
index dd0e624..fd052c3 100644 (file)
@@ -54,8 +54,8 @@ struct snd_dbuf {
        bus_dmamap_t dmamap;
        bus_dma_tag_t dmatag;
        bus_addr_t buf_addr;
-       struct selinfo sel;
-       struct task seltask;
+       struct kqinfo kq;
+       struct task kqtask;
        struct pcm_channel *channel;
        char name[SNDBUF_NAMELEN];
 };
@@ -93,7 +93,7 @@ unsigned int sndbuf_getblksz(struct snd_dbuf *b);
 void sndbuf_setblksz(struct snd_dbuf *b, unsigned int blksz);
 unsigned int sndbuf_runsz(struct snd_dbuf *b);
 void sndbuf_setrun(struct snd_dbuf *b, int go);
-struct selinfo *sndbuf_getsel(struct snd_dbuf *b);
+struct kqinfo *sndbuf_getkq(struct snd_dbuf *b);
 
 unsigned int sndbuf_getxrun(struct snd_dbuf *b);
 void sndbuf_setxrun(struct snd_dbuf *b, unsigned int cnt);
index 81d1758..45f5d8f 100644 (file)
@@ -141,7 +141,7 @@ chn_wakeup(struct pcm_channel *c)
        CHN_LOCKASSERT(c);
        if (SLIST_EMPTY(&c->children)) {
                /*if (SEL_WAITING(sndbuf_getsel(bs)) && chn_polltrigger(c))*/
-               if (sndbuf_getsel(bs)->si_pid && chn_polltrigger(c)) {
+               if (SLIST_FIRST(&sndbuf_getkq(bs)->ki_note) && chn_polltrigger(c)) {
                        /*
                         * XXX
                         *
@@ -152,10 +152,10 @@ chn_wakeup(struct pcm_channel *c)
                         * interrupt, which will run with the MP lock
                         * held.
                         *
-                        * buffer.c:sndbuf_seltask will then call
+                        * buffer.c:sndbuf_kqtask will then call
                         * KNOTE() from safer context.
                         */
-                       taskqueue_enqueue(taskqueue_swi, &bs->seltask);
+                       taskqueue_enqueue(taskqueue_swi, &bs->kqtask);
                }
        } else {
                SLIST_FOREACH(pce, &c->children, link) {
index 60da277..a56ae39 100644 (file)
@@ -1125,10 +1125,8 @@ dsp_kqfilter(struct dev_kqfilter_args *ap)
        }
 
        if (ap->a_result == 0) {
-               crit_enter();
-               klist = &sndbuf_getsel(bs)->si_note;
-               SLIST_INSERT_HEAD(klist, kn, kn_selnext);
-               crit_exit();
+               klist = &sndbuf_getkq(bs)->ki_note;
+               knote_insert(klist, kn);
        }
 
        relchns(i_dev, rdch, wrch, SD_F_PRIO_RD | SD_F_PRIO_WR);
@@ -1144,10 +1142,8 @@ dsp_filter_detach(struct knote *kn)
        struct klist *klist;
 
        CHN_LOCK(ch);
-       crit_enter();
-       klist = &sndbuf_getsel(bs)->si_note;
-       SLIST_REMOVE(klist, kn, knote, kn_selnext);
-       crit_exit();
+       klist = &sndbuf_getkq(bs)->ki_note;
+       knote_remove(klist, kn);
        CHN_UNLOCK(ch);
 }
 
index a710205..d3644d2 100644 (file)
@@ -77,7 +77,6 @@
 #include <sys/tty.h>
 #include <sys/clist.h>
 #include <sys/file.h>
-#include <sys/select.h>
 #include <sys/proc.h>
 #include <sys/priv.h>
 #include <sys/sysctl.h>
@@ -874,7 +873,7 @@ ucomstart(struct tty *tp)
                        CLR(tp->t_state, TS_SO_OLOWAT);
                        wakeup(TSA_OLOWAT(tp));
                }
-               KNOTE(&tp->t_wsel.si_note, 0);
+               KNOTE(&tp->t_wkq.ki_note, 0);
                if (tp->t_outq.c_cc == 0) {
                        if (ISSET(tp->t_state, TS_BUSY | TS_SO_OCOMPLETE) ==
                            TS_SO_OCOMPLETE && tp->t_outq.c_cc == 0) {
index e0a85f0..aa7e456 100644 (file)
@@ -61,7 +61,6 @@
 #include <sys/filio.h>
 #include <sys/tty.h>
 #include <sys/file.h>
-#include <sys/select.h>
 #include <sys/vnode.h>
 #include <sys/event.h>
 #include <sys/sysctl.h>
@@ -107,7 +106,7 @@ struct ugen_endpoint {
 #define UGEN_SHORT_OK  0x04    /* short xfers are OK */
        usbd_pipe_handle pipeh;
        struct clist q;
-       struct selinfo rsel;
+       struct kqinfo rkq;
        u_char *ibuf;           /* start of buffer (circular for isoc) */
        u_char *fill;           /* location for input (isoc) */
        u_char *limit;          /* end of circular buffer (isoc) */
@@ -914,7 +913,7 @@ ugen_detach(device_t self)
                        sce = &sc->sc_endpoints[i][dir];
                        if (sce && sce->pipeh)
                                usbd_abort_pipe(sce->pipeh);
-                       KNOTE(&sce->rsel.si_note, 0);
+                       KNOTE(&sce->rkq.ki_note, 0);
                }
        }
        crit_enter();
@@ -968,7 +967,7 @@ ugenintr(usbd_xfer_handle xfer, usbd_private_handle addr, usbd_status status)
                DPRINTFN(5, ("ugen_intr: waking %p\n", sce));
                wakeup(sce);
        }
-       KNOTE(&sce->rsel.si_note, 0);
+       KNOTE(&sce->rkq.ki_note, 0);
 }
 
 static void
@@ -1028,7 +1027,7 @@ ugen_isoc_rintr(usbd_xfer_handle xfer, usbd_private_handle addr,
                DPRINTFN(5, ("ugen_isoc_rintr: waking %p\n", sce));
                wakeup(sce);
        }
-       KNOTE(&sce->rsel.si_note, 0);
+       KNOTE(&sce->rkq.ki_note, 0);
 }
 
 static usbd_status
@@ -1470,10 +1469,8 @@ ugenkqfilter(struct dev_kqfilter_args *ap)
        }
 
        if (sce->edesc != NULL || sce->pipeh != NULL) {
-               crit_enter();
-               klist = &sce->rsel.si_note;
-               SLIST_INSERT_HEAD(klist, kn, kn_selnext);
-               crit_exit();
+               klist = &sce->rkq.ki_note;
+               knote_insert(klist, kn);
        }
 
        return (0);
@@ -1501,10 +1498,8 @@ ugen_filt_detach(struct knote *kn)
        }
 
        if (sce->edesc != NULL || sce->pipeh != NULL) {
-               crit_enter();
-               klist = &sce->rsel.si_note;
-               SLIST_REMOVE(klist, kn, knote, kn_selnext);
-               crit_exit();
+               klist = &sce->rkq.ki_note;
+               knote_remove(klist, kn);
        }
 }
 
index c48e7f7..579f3b7 100644 (file)
@@ -60,7 +60,6 @@
 #include <sys/bus.h>
 #include <sys/conf.h>
 #include <sys/tty.h>
-#include <sys/select.h>
 #include <sys/proc.h>
 #include <sys/vnode.h>
 #include <sys/event.h>
@@ -110,7 +109,7 @@ struct uhid_softc {
        int sc_repdesc_size;
 
        struct clist sc_q;
-       struct selinfo sc_rsel;
+       struct kqinfo sc_rkq;
        struct proc *sc_async;  /* process that wants SIGIO */
        u_char sc_state;        /* driver state */
 #define        UHID_OPEN       0x01    /* device is open */
@@ -333,7 +332,7 @@ uhid_intr(usbd_xfer_handle xfer, usbd_private_handle addr, usbd_status status)
                DPRINTFN(5, ("uhid_intr: waking %p\n", &sc->sc_q));
                wakeup(&sc->sc_q);
        }
-       KNOTE(&sc->sc_rsel.si_note, 0);
+       KNOTE(&sc->sc_rkq.ki_note, 0);
        if (sc->sc_async != NULL) {
                DPRINTFN(3, ("uhid_intr: sending SIGIO %p\n", sc->sc_async));
                ksignal(sc->sc_async, SIGIO);
@@ -705,10 +704,8 @@ uhidkqfilter(struct dev_kqfilter_args *ap)
                return (0);
        }
 
-       crit_enter();
-       klist = &sc->sc_rsel.si_note;
-       SLIST_INSERT_HEAD(klist, kn, kn_selnext);
-       crit_exit();
+       klist = &sc->sc_rkq.ki_note;
+       knote_insert(klist, kn);
 
        return (0);
 }
@@ -722,10 +719,8 @@ uhidfilt_detach(struct knote *kn)
 
        sc = devclass_get_softc(uhid_devclass, UHIDUNIT(dev));
 
-       crit_enter();
-       klist = &sc->sc_rsel.si_note;
-       SLIST_REMOVE(klist, kn, knote, kn_selnext);
-       crit_exit();
+       klist = &sc->sc_rkq.ki_note;
+       knote_remove(klist, kn);
 }
 
 static int
index 292b47d..c770597 100644 (file)
@@ -53,7 +53,6 @@
 #include <sys/conf.h>
 #include <sys/tty.h>
 #include <sys/file.h>
-#include <sys/select.h>
 #include <sys/vnode.h>
 #include <sys/event.h>
 #include <sys/sysctl.h>
@@ -119,7 +118,7 @@ struct ums_softc {
 
        int             state;
 #        define        UMS_ASLEEP      0x01    /* readFromDevice is waiting */
-       struct selinfo  rsel;           /* process waiting in select */
+       struct kqinfo   rkq;            /* process waiting in select/poll/kq */
 };
 
 #define MOUSE_FLAGS_MASK (HIO_CONST|HIO_RELATIVE)
@@ -381,7 +380,7 @@ ums_detach(device_t self)
                sc->state &= ~UMS_ASLEEP;
                wakeup(sc);
        }
-       KNOTE(&sc->rsel.si_note, 0);
+       KNOTE(&sc->rkq.ki_note, 0);
 
        dev_ops_remove_minor(&ums_ops, /*-1, */device_get_unit(self));
 
@@ -513,7 +512,7 @@ ums_add_to_queue(struct ums_softc *sc, int dx, int dy, int dz, int buttons)
                sc->state &= ~UMS_ASLEEP;
                wakeup(sc);
        }
-       KNOTE(&sc->rsel.si_note, 0);
+       KNOTE(&sc->rkq.ki_note, 0);
 }
 
 static int
@@ -690,10 +689,8 @@ ums_kqfilter(struct dev_kqfilter_args *ap)
                return (0);
        }
 
-       crit_enter();
-       klist = &sc->rsel.si_note;
-       SLIST_INSERT_HEAD(klist, kn, kn_selnext);
-       crit_exit();
+       klist = &sc->rkq.ki_note;
+       knote_insert(klist, kn);
 
        return (0);
 }
@@ -704,10 +701,8 @@ ums_filt_detach(struct knote *kn)
        struct ums_softc *sc = (struct ums_softc *)kn->kn_hook;
        struct klist *klist;
 
-       crit_enter();
-       klist = &sc->rsel.si_note;
-       SLIST_REMOVE(klist, kn, knote, kn_selnext);
-       crit_exit();
+       klist = &sc->rkq.ki_note;
+       knote_remove(klist, kn);
 }
 
 static int
index 451c59a..9f9a7dd 100644 (file)
@@ -54,7 +54,7 @@
 #include <sys/systm.h>
 #include <sys/kernel.h>
 #include <sys/bus.h>
-#include <sys/selinfo.h>
+#include <sys/event.h>
 
 #include <bus/pci/pcivar.h>
 
index ef94642..99535f0 100644 (file)
@@ -714,7 +714,7 @@ common_bktr_intr( void *arg )
                }
 
                /* Inform anyone who is polling */
-               KNOTE(&bktr->vbi_select.si_note, 0);
+               KNOTE(&bktr->vbi_kq.ki_note, 0);
 
        }
        UNLOCK_VBI(bktr);
index ad0af35..8d69717 100644 (file)
@@ -42,7 +42,6 @@
 #include <sys/module.h>
 #include <sys/bus.h>
 #include <sys/uio.h>
-#include <sys/selinfo.h>
 
 #include <bus/pci/pcivar.h>
 #include <bus/pci/pcireg.h>
index 9b7b290..35c1fa7 100644 (file)
 #include <sys/signalvar.h>
 #include <sys/malloc.h>
 #include <sys/mman.h>
-#include <sys/select.h>
 #include <sys/event.h>
 #include <sys/bus.h>
 #include <sys/rman.h>
 #include <sys/thread2.h>
-#include <sys/selinfo.h>
 
 #include <vm/vm.h>
 #include <vm/vm_kern.h>
@@ -752,10 +750,8 @@ bktr_kqfilter(struct dev_kqfilter_args *ap)
                return (0);
        }
 
-       crit_enter();
-       klist = &bktr->vbi_select.si_note;
-       SLIST_INSERT_HEAD(klist, kn, kn_selnext);
-       crit_exit();
+       klist = &bktr->vbi_kq.ki_note;
+       knote_insert(klist, kn);
 
        return (0);
 }
@@ -766,10 +762,8 @@ bktr_filter_detach(struct knote *kn)
        bktr_ptr_t bktr = (bktr_ptr_t)kn->kn_hook;
        struct klist *klist;
 
-       crit_enter();
-       klist = &bktr->vbi_select.si_note;
-       SLIST_REMOVE(klist, kn, knote, kn_selnext);
-       crit_exit();
+       klist = &bktr->vbi_kq.ki_note;
+       knote_insert(klist, kn);
 }
 
 static int
index c0037b5..18958b3 100644 (file)
@@ -476,7 +476,7 @@ struct bktr_softc {
     int         vbisize;        /* Number of bytes in the circular buffer */
     uint32_t   vbi_sequence_number;    /* sequence number for VBI */
     int                vbi_read_blocked;       /* user process blocked on read() from /dev/vbi */
-    struct selinfo vbi_select; /* Data used by select() on /dev/vbi */
+    struct kqinfo vbi_kq;      /* Data used by select()/poll()/kevent() on /dev/vbi */
     
 
     struct proc        *proc;          /* process to receive raised signal */
index 40e0621..640315a 100644 (file)
@@ -48,7 +48,7 @@
 #include <sys/systm.h>
 #include <sys/kernel.h>
 #include <sys/bus.h>
-#include <sys/selinfo.h>
+#include <sys/event.h>
 
 #include <bus/pci/pcivar.h>
 
index 354e516..c596452 100644 (file)
@@ -50,7 +50,6 @@
 #include <sys/signalvar.h>
 #include <sys/thread2.h>
 #include <sys/vnode.h>
-#include <sys/select.h>
 #include <sys/resource.h>
 #include <sys/bus.h>
 #include <sys/rman.h>
@@ -1370,7 +1369,7 @@ cxm_encoder_dma_done(struct cxm_softc *sc)
        wakeup(&sc->enc_pool.read);
 
        /* wakeup anyone polling for data */
-       KNOTE(&sc->enc_sel.si_note, 0);
+       KNOTE(&sc->enc_kq.ki_note, 0);
 }
 
 
@@ -2934,10 +2933,8 @@ cxm_kqfilter(struct dev_kqfilter_args *ap)
                return (0);
        }
 
-       crit_enter();
-       klist = &sc->enc_sel.si_note;
-       SLIST_INSERT_HEAD(klist, kn, kn_selnext);
-       crit_exit();
+       klist = &sc->enc_kq.ki_note;
+       knote_insert(klist, kn);
 
        return (0);
 }
@@ -2946,12 +2943,9 @@ static void
 cxm_filter_detach(struct knote *kn)
 {
        struct cxm_softc *sc = (struct cxm_softc *)kn->kn_hook;
-       struct klist *klist;
+       struct klist *klist = &sc->enc_kq.ki_note;
 
-       crit_enter();
-       klist = &sc->enc_sel.si_note;
-       SLIST_REMOVE(klist, kn, knote, kn_selnext);
-       crit_exit();
+       knote_remove(klist, kn);
 }
 
 static int
index 53293fa..3b6ac36 100644 (file)
@@ -36,7 +36,7 @@
  * Header file for the Conexant MPEG-2 Codec driver.
  */
 
-#include <sys/selinfo.h>
+#include <sys/event.h>
 
 #include <bus/pci/pcidevs.h>
 
@@ -230,7 +230,7 @@ struct cxm_softc {
        struct cxm_buffer_pool  enc_pool;
        struct cxm_sg_list enc_sg;
 
-       struct selinfo  enc_sel;
+       struct kqinfo   enc_kq;
 
        struct proc     *enc_proc;
        int             enc_signal;
index 088efe7..85d9ace 100644 (file)
@@ -36,7 +36,6 @@
 #include <sys/file.h>
 #include <sys/lock.h>
 #include <sys/fcntl.h>
-#include <sys/select.h>
 #include <sys/queue.h>
 #include <sys/event.h>
 #include <sys/eventvar.h>
@@ -46,6 +45,7 @@
 #include <sys/stat.h>
 #include <sys/sysctl.h>
 #include <sys/sysproto.h>
+#include <sys/thread.h>
 #include <sys/uio.h>
 #include <sys/signalvar.h>
 #include <sys/filio.h>
 
 #include <vm/vm_zone.h>
 
+/*
+ * Global token for kqueue subsystem
+ */
+struct lwkt_token kq_token = LWKT_TOKEN_UP_INITIALIZER;
+
 MALLOC_DEFINE(M_KQUEUE, "kqueue", "memory for kqueue system");
 
 struct kevent_copyin_args {
@@ -77,6 +82,7 @@ static int    kqueue_kqfilter(struct file *fp, struct knote *kn);
 static int     kqueue_stat(struct file *fp, struct stat *st,
                    struct ucred *cred);
 static int     kqueue_close(struct file *fp);
+static void    kqueue_wakeup(struct kqueue *kq);
 
 /*
  * MPSAFE
@@ -158,22 +164,18 @@ filt_fileattach(struct knote *kn)
 }
 
 /*
- * MPALMOSTSAFE - acquires mplock
+ * MPSAFE
  */
 static int
 kqueue_kqfilter(struct file *fp, struct knote *kn)
 {
        struct kqueue *kq = (struct kqueue *)kn->kn_fp->f_data;
 
-       get_mplock();
-       if (kn->kn_filter != EVFILT_READ) {
-               rel_mplock();
+       if (kn->kn_filter != EVFILT_READ)
                return (EOPNOTSUPP);
-       }
 
        kn->kn_fop = &kqread_filtops;
-       SLIST_INSERT_HEAD(&kq->kq_sel.si_note, kn, kn_selnext);
-       rel_mplock();
+       knote_insert(&kq->kq_kqinfo.ki_note, kn);
        return (0);
 }
 
@@ -182,7 +184,7 @@ filt_kqdetach(struct knote *kn)
 {
        struct kqueue *kq = (struct kqueue *)kn->kn_fp->f_data;
 
-       SLIST_REMOVE(&kq->kq_sel.si_note, kn, knote, kn_selnext);
+       knote_remove(&kq->kq_kqinfo.ki_note, kn);
 }
 
 /*ARGSUSED*/
@@ -229,8 +231,7 @@ filt_procattach(struct knote *kn)
                kn->kn_flags &= ~EV_FLAG1;
        }
 
-       /* XXX lock the proc here while adding to the list? */
-       SLIST_INSERT_HEAD(&p->p_klist, kn, kn_selnext);
+       knote_insert(&p->p_klist, kn);
 
        /*
         * Immediately activate any exit notes if the target process is a
@@ -259,9 +260,9 @@ filt_procdetach(struct knote *kn)
 
        if (kn->kn_status & KN_DETACHED)
                return;
-       /* XXX locking?  this might modify another process. */
+       /* XXX locking? take proc_token here? */
        p = kn->kn_ptr.p_proc;
-       SLIST_REMOVE(&p->p_klist, kn, knote, kn_selnext);
+       knote_remove(&p->p_klist, kn);
 }
 
 static int
@@ -288,7 +289,7 @@ filt_proc(struct knote *kn, long hint)
        if (event == NOTE_EXIT) {
                struct proc *p = kn->kn_ptr.p_proc;
                if ((kn->kn_status & KN_DETACHED) == 0) {
-                       SLIST_REMOVE(&p->p_klist, kn, knote, kn_selnext);
+                       knote_remove(&p->p_klist, kn);
                        kn->kn_status |= KN_DETACHED;
                        kn->kn_data = p->p_xstat;
                        kn->kn_ptr.p_proc = NULL;
@@ -403,7 +404,7 @@ kqueue_init(struct kqueue *kq, struct filedesc *fdp)
        TAILQ_INIT(&kq->kq_knlist);
        kq->kq_count = 0;
        kq->kq_fdp = fdp;
-       SLIST_INIT(&kq->kq_sel.si_note);
+       SLIST_INIT(&kq->kq_kqinfo.ki_note);
 }
 
 /*
@@ -516,7 +517,7 @@ kevent_copyin(void *arg, struct kevent *kevp, int max, int *events)
 }
 
 /*
- * MPALMOSTSAFE
+ * MPSAFE
  */
 int
 kern_kevent(struct kqueue *kq, int nevents, int *res, void *uap,
@@ -533,7 +534,7 @@ kern_kevent(struct kqueue *kq, int nevents, int *res, void *uap,
        tsp = tsp_in;
        *res = 0;
 
-       get_mplock();
+       lwkt_gettoken(&kq_token);
        for ( ;; ) {
                n = 0;
                error = kevent_copyinfn(uap, kev, KQ_NEVENTS, &n);
@@ -604,9 +605,7 @@ kern_kevent(struct kqueue *kq, int nevents, int *res, void *uap,
        total = 0;
        error = 0;
        marker.kn_filter = EVFILT_MARKER;
-       crit_enter();
        TAILQ_INSERT_TAIL(&kq->kq_knpend, &marker, kn_tqe);
-       crit_exit();
        while ((n = nevents - total) > 0) {
                if (n > KQ_NEVENTS)
                        n = KQ_NEVENTS;
@@ -621,13 +620,11 @@ kern_kevent(struct kqueue *kq, int nevents, int *res, void *uap,
                 */
                if (kq->kq_count == 0 && *res == 0) {
                        error = kqueue_sleep(kq, tsp);
-
                        if (error)
                                break;
-                       crit_enter();
+
                        TAILQ_REMOVE(&kq->kq_knpend, &marker, kn_tqe);
                        TAILQ_INSERT_TAIL(&kq->kq_knpend, &marker, kn_tqe);
-                       crit_exit();
                }
 
                /*
@@ -666,22 +663,18 @@ kern_kevent(struct kqueue *kq, int nevents, int *res, void *uap,
                 *       same event.
                 */
                if (i == 0) {
-                       crit_enter();
                        TAILQ_REMOVE(&kq->kq_knpend, &marker, kn_tqe);
                        TAILQ_INSERT_TAIL(&kq->kq_knpend, &marker, kn_tqe);
-                       crit_exit();
                }
        }
-       crit_enter();
        TAILQ_REMOVE(&kq->kq_knpend, &marker, kn_tqe);
-       crit_exit();
 
        /* Timeouts do not return EWOULDBLOCK. */
        if (error == EWOULDBLOCK)
                error = 0;
 
 done:
-       rel_mplock();
+       lwkt_reltoken(&kq_token);
        return (error);
 }
 
@@ -827,10 +820,8 @@ kqueue_register(struct kqueue *kq, struct kevent *kev)
                        kn->kn_kevent.udata = kev->udata;
                }
 
-               crit_enter();
                if (kn->kn_fop->f_event(kn, 0))
                        KNOTE_ACTIVATE(kn);
-               crit_exit();
        } else if (kev->flags & EV_DELETE) {
                kn->kn_fop->f_detach(kn);
                knote_drop(kn);
@@ -839,18 +830,14 @@ kqueue_register(struct kqueue *kq, struct kevent *kev)
 
        if ((kev->flags & EV_DISABLE) &&
            ((kn->kn_status & KN_DISABLED) == 0)) {
-               crit_enter();
                kn->kn_status |= KN_DISABLED;
-               crit_exit();
        }
 
        if ((kev->flags & EV_ENABLE) && (kn->kn_status & KN_DISABLED)) {
-               crit_enter();
                kn->kn_status &= ~KN_DISABLED;
                if ((kn->kn_status & KN_ACTIVE) &&
                    ((kn->kn_status & KN_QUEUED) == 0))
                        knote_enqueue(kn);
-               crit_exit();
        }
 
 done:
@@ -869,7 +856,6 @@ kqueue_sleep(struct kqueue *kq, struct timespec *tsp)
 {
        int error = 0;
 
-       crit_enter();
        if (tsp == NULL) {
                kq->kq_state |= KQ_SLEEP;
                error = tsleep(kq, PCATCH, "kqread", 0);
@@ -891,7 +877,6 @@ kqueue_sleep(struct kqueue *kq, struct timespec *tsp)
                        error = tsleep(kq, PCATCH, "kqread", timeout);
                }
        }
-       crit_exit();
 
        /* don't restart after signals... */
        if (error == ERESTART)
@@ -916,7 +901,6 @@ kqueue_scan(struct kqueue *kq, struct kevent *kevp, int count,
 
         total = 0;
        local_marker.kn_filter = EVFILT_MARKER;
-        crit_enter();
 
        /*
         * Collect events.
@@ -958,10 +942,8 @@ kqueue_scan(struct kqueue *kq, struct kevent *kevp, int count,
                if (kn->kn_flags & EV_ONESHOT) {
                        kn->kn_status &= ~KN_QUEUED;
                        kq->kq_count--;
-                       crit_exit();
                        kn->kn_fop->f_detach(kn);
                        knote_drop(kn);
-                       crit_enter();
                } else if (kn->kn_flags & EV_CLEAR) {
                        kn->kn_data = 0;
                        kn->kn_fflags = 0;
@@ -973,7 +955,6 @@ kqueue_scan(struct kqueue *kq, struct kevent *kevp, int count,
        }
        TAILQ_REMOVE(&kq->kq_knpend, &local_marker, kn_tqe);
 
-       crit_exit();
        return (total);
 }
 
@@ -1008,7 +989,7 @@ kqueue_ioctl(struct file *fp, u_long com, caddr_t data,
        struct kqueue *kq;
        int error;
 
-       get_mplock();
+       lwkt_gettoken(&kq_token);
        kq = (struct kqueue *)fp->f_data;
 
        switch(com) {
@@ -1026,7 +1007,7 @@ kqueue_ioctl(struct file *fp, u_long com, caddr_t data,
                error = ENOTTY;
                break;
        }
-       rel_mplock();
+       lwkt_reltoken(&kq_token);
        return (error);
 }
 
@@ -1046,33 +1027,33 @@ kqueue_stat(struct file *fp, struct stat *st, struct ucred *cred)
 }
 
 /*
- * MPALMOSTSAFE - acquires mplock
+ * MPSAFE
  */
 static int
 kqueue_close(struct file *fp)
 {
        struct kqueue *kq = (struct kqueue *)fp->f_data;
 
-       get_mplock();
+       lwkt_gettoken(&kq_token);
 
        kqueue_terminate(kq);
 
        fp->f_data = NULL;
        funsetown(kq->kq_sigio);
-       rel_mplock();
+       lwkt_reltoken(&kq_token);
 
        kfree(kq, M_KQUEUE);
        return (0);
 }
 
-void
+static void
 kqueue_wakeup(struct kqueue *kq)
 {
        if (kq->kq_state & KQ_SLEEP) {
                kq->kq_state &= ~KQ_SLEEP;
                wakeup(kq);
        }
-       KNOTE(&kq->kq_sel.si_note, 0);
+       KNOTE(&kq->kq_kqinfo.ki_note, 0);
 }
 
 /*
@@ -1083,23 +1064,49 @@ knote(struct klist *list, long hint)
 {
        struct knote *kn;
 
-       SLIST_FOREACH(kn, list, kn_selnext)
+       lwkt_gettoken(&kq_token);
+       SLIST_FOREACH(kn, list, kn_next)
                if (kn->kn_fop->f_event(kn, hint))
                        KNOTE_ACTIVATE(kn);
+       lwkt_reltoken(&kq_token);
+}
+
+/*
+ * insert knote at head of klist
+ *
+ * Requires: kq_token
+ */
+void
+knote_insert(struct klist *klist, struct knote *kn)
+{
+       SLIST_INSERT_HEAD(klist, kn, kn_next);
+}
+
+/*
+ * remove knote from a klist
+ *
+ * Requires: kq_token
+ */
+void
+knote_remove(struct klist *klist, struct knote *kn)
+{
+       SLIST_REMOVE(klist, kn, knote, kn_next);
 }
 
 /*
  * remove all knotes from a specified klist
  */
 void
-knote_remove(struct klist *list)
+knote_empty(struct klist *list)
 {
        struct knote *kn;
 
+       lwkt_gettoken(&kq_token);
        while ((kn = SLIST_FIRST(list)) != NULL) {
                kn->kn_fop->f_detach(kn);
                knote_drop(kn);
        }
+       lwkt_reltoken(&kq_token);
 }
 
 /*
@@ -1110,6 +1117,7 @@ knote_fdclose(struct file *fp, struct filedesc *fdp, int fd)
 {
        struct knote *kn;
 
+       lwkt_gettoken(&kq_token);
 restart:
        SLIST_FOREACH(kn, &fp->f_klist, kn_link) {
                if (kn->kn_kq->kq_fdp == fdp && kn->kn_id == fd) {
@@ -1118,6 +1126,7 @@ restart:
                        goto restart;
                }
        }
+       lwkt_reltoken(&kq_token);
 }
 
 static void
@@ -1140,10 +1149,6 @@ knote_attach(struct knote *kn)
        kn->kn_status = 0;
 }
 
-/*
- * should be called outside of a critical section, since we don't want to
- * hold a critical section while calling fdrop and free.
- */
 static void
 knote_drop(struct knote *kn)
 {
@@ -1172,7 +1177,6 @@ knote_enqueue(struct knote *kn)
 {
        struct kqueue *kq = kn->kn_kq;
 
-       crit_enter();
        KASSERT((kn->kn_status & KN_QUEUED) == 0, ("knote already queued"));
 
        TAILQ_INSERT_TAIL(&kq->kq_knpend, kn, kn_tqe);
@@ -1184,7 +1188,7 @@ knote_enqueue(struct knote *kn)
         */
        if (kq->kq_sigio && (kq->kq_state & KQ_ASYNC) && kq->kq_count == 1)
                pgsigio(kq->kq_sigio, SIGIO, 0);
-       crit_exit();
+
        kqueue_wakeup(kq);
 }
 
@@ -1194,12 +1198,10 @@ knote_dequeue(struct knote *kn)
        struct kqueue *kq = kn->kn_kq;
 
        KASSERT(kn->kn_status & KN_QUEUED, ("knote not queued"));
-       crit_enter();
 
        TAILQ_REMOVE(&kq->kq_knpend, kn, kn_tqe);
        kn->kn_status &= ~KN_QUEUED;
        kq->kq_count--;
-       crit_exit();
 }
 
 static void
index be4cfcb..eb69126 100644 (file)
@@ -2200,7 +2200,7 @@ filt_sigattach(struct knote *kn)
        kn->kn_flags |= EV_CLEAR;               /* automatically set */
 
        /* XXX lock the proc here while adding to the list? */
-       SLIST_INSERT_HEAD(&p->p_klist, kn, kn_selnext);
+       knote_insert(&p->p_klist, kn);
 
        return (0);
 }
@@ -2210,7 +2210,7 @@ filt_sigdetach(struct knote *kn)
 {
        struct proc *p = kn->kn_ptr.p_proc;
 
-       SLIST_REMOVE(&p->p_klist, kn, knote, kn_selnext);
+       knote_remove(&p->p_klist, kn);
 }
 
 /*
index 6422b45..e00b574 100644 (file)
@@ -94,7 +94,7 @@ struct udev_softc {
        int opened;
        int initiated;
 
-       struct selinfo sel;
+       struct kqinfo kq;
 
        int qlen;
        struct lock lock;
@@ -422,7 +422,7 @@ udev_event_insert(int ev_type, prop_dictionary_t dict)
        lockmgr(&udevctx.lock, LK_RELEASE);
 
        wakeup(&udevctx);
-       KNOTE(&udevctx.sel.si_note, 0);
+       KNOTE(&udevctx.kq.ki_note, 0);
 }
 
 static struct udev_event_kernel *
@@ -598,10 +598,8 @@ udev_dev_kqfilter(struct dev_kqfilter_args *ap)
                return (0);
        }
 
-       crit_enter();
-       klist = &udevctx.sel.si_note;
-       SLIST_INSERT_HEAD(klist, kn, kn_selnext);
-       crit_exit();
+       klist = &udevctx.kq.ki_note;
+       knote_insert(klist, kn);
 
         lockmgr(&udevctx.lock, LK_RELEASE);
 
@@ -614,10 +612,8 @@ udev_dev_filter_detach(struct knote *kn)
        struct klist *klist;
 
        lockmgr(&udevctx.lock, LK_EXCLUSIVE);
-       crit_enter();
-       klist = &udevctx.sel.si_note;
-       SLIST_REMOVE(klist, kn, knote, kn_selnext);
-       crit_exit();
+       klist = &udevctx.kq.ki_note;
+       knote_remove(klist, kn);
        lockmgr(&udevctx.lock, LK_RELEASE);
 }
 
index 24f8eca..efc5aa4 100644 (file)
@@ -43,7 +43,6 @@
 #include <sys/device.h>
 #include <sys/lock.h>
 #include <sys/conf.h>
-#include <sys/selinfo.h>
 #include <sys/uio.h>
 #include <sys/filio.h>
 #include <sys/event.h>
@@ -166,7 +165,7 @@ static struct dev_softc
        int     inuse;
        int     nonblock;
        struct lock lock;
-       struct selinfo sel;
+       struct kqinfo kq;
        struct devq devq;
        struct proc *async_proc;
 } devsoftc;
@@ -299,10 +298,8 @@ devkqfilter(struct dev_kqfilter_args *ap)
                return (0);
        }
 
-       crit_enter();
-       klist = &devsoftc.sel.si_note;
-       SLIST_INSERT_HEAD(klist, kn, kn_selnext);
-       crit_exit();
+       klist = &devsoftc.kq.ki_note;
+       knote_insert(klist, kn);
 
        lockmgr(&devsoftc.lock, LK_RELEASE);
 
@@ -315,10 +312,8 @@ dev_filter_detach(struct knote *kn)
        struct klist *klist;
 
        lockmgr(&devsoftc.lock, LK_EXCLUSIVE);
-       crit_enter();
-       klist = &devsoftc.sel.si_note;
-       SLIST_INSERT_HEAD(klist, kn, kn_selnext);
-       crit_exit();
+       klist = &devsoftc.kq.ki_note;
+       knote_remove(klist, kn);
        lockmgr(&devsoftc.lock, LK_RELEASE);
 }
 
@@ -367,7 +362,7 @@ devctl_queue_data(char *data)
        wakeup(&devsoftc);
        lockmgr(&devsoftc.lock, LK_RELEASE);
        get_mplock();   /* XXX */
-       KNOTE(&devsoftc.sel.si_note, 0);
+       KNOTE(&devsoftc.kq.ki_note, 0);
        rel_mplock();   /* XXX */
        p = devsoftc.async_proc;
        if (p != NULL)
index 479e6ba..bc89aec 100644 (file)
@@ -80,7 +80,7 @@ static struct dev_ops log_ops = {
 
 static struct logsoftc {
        int     sc_state;               /* see above for possibilities */
-       struct  selinfo sc_selp;        /* process waiting on select call */
+       struct  kqinfo  sc_kqp;         /* processes waiting on I/O */
        struct  sigio *sc_sigio;        /* information for async I/O */
        struct  callout sc_callout;     /* callout to wakeup syslog  */
 } logsoftc;
@@ -169,7 +169,7 @@ static int
 logkqfilter(struct dev_kqfilter_args *ap)
 {
        struct knote *kn = ap->a_kn;
-       struct klist *klist = &logsoftc.sc_selp.si_note;
+       struct klist *klist = &logsoftc.sc_kqp.ki_note;
 
        ap->a_result = 0;
        switch (kn->kn_filter) {
@@ -181,9 +181,7 @@ logkqfilter(struct dev_kqfilter_args *ap)
                return (0);
        }
 
-       crit_enter();
-       SLIST_INSERT_HEAD(klist, kn, kn_selnext);
-       crit_exit();
+       knote_insert(klist, kn);
 
        return (0);
 }
@@ -191,11 +189,9 @@ logkqfilter(struct dev_kqfilter_args *ap)
 static void
 logfiltdetach(struct knote *kn)
 {
-       struct klist *klist = &logsoftc.sc_selp.si_note;
+       struct klist *klist = &logsoftc.sc_kqp.ki_note;
 
-       crit_enter();
-       SLIST_REMOVE(klist, kn, knote, kn_selnext);
-       crit_exit();
+       knote_remove(klist, kn);
 }
 
 static int
@@ -223,7 +219,7 @@ logtimeout(void *arg)
                return;
        }
        msgbuftrigger = 0;
-       KNOTE(&logsoftc.sc_selp.si_note, 0);
+       KNOTE(&logsoftc.sc_kqp.ki_note, 0);
        if ((logsoftc.sc_state & LOG_ASYNC) && logsoftc.sc_sigio != NULL)
                pgsigio(logsoftc.sc_sigio, SIGIO, 0);
        if (logsoftc.sc_state & LOG_RDWAIT) {
index cef4d13..47d9a85 100644 (file)
@@ -57,7 +57,6 @@
 #include <sys/objcache.h>
 #include <sys/proc.h>
 #include <sys/queue.h>
-#include <sys/select.h>
 #include <sys/event.h>
 #include <sys/serialize.h>
 #include <sys/signal.h>
@@ -333,21 +332,19 @@ mq_kqfilter_fop(struct file *fp, struct knote *kn)
        case EVFILT_READ:
                kn->kn_fop = &mqfiltops_read;
                kn->kn_hook = (caddr_t)mq;
-               klist = &mq->mq_rsel.si_note;
+               klist = &mq->mq_rkq.ki_note;
                break;
        case EVFILT_WRITE:
                kn->kn_fop = &mqfiltops_write;
                kn->kn_hook = (caddr_t)mq;
-               klist = &mq->mq_wsel.si_note;
+               klist = &mq->mq_wkq.ki_note;
                break;
        default:
                lockmgr(&mq->mq_mtx, LK_RELEASE);
                return (EOPNOTSUPP);
        }
 
-       crit_enter();
-       SLIST_INSERT_HEAD(klist, kn, kn_selnext);
-       crit_exit();
+       knote_insert(klist, kn);
        lockmgr(&mq->mq_mtx, LK_RELEASE);
 
        return (0);
@@ -359,10 +356,8 @@ mqfilter_read_detach(struct knote *kn)
        struct mqueue *mq = (struct mqueue *)kn->kn_hook;
 
        lockmgr(&mq->mq_mtx, LK_EXCLUSIVE);
-       crit_enter();
-       struct klist *klist = &mq->mq_rsel.si_note;
-       SLIST_REMOVE(klist, kn, knote, kn_selnext);
-       crit_exit();
+       struct klist *klist = &mq->mq_rkq.ki_note;
+       knote_remove(klist, kn);
        lockmgr(&mq->mq_mtx, LK_RELEASE);
 }
 
@@ -372,10 +367,8 @@ mqfilter_write_detach(struct knote *kn)
        struct mqueue *mq = (struct mqueue *)kn->kn_hook;
 
        lockmgr(&mq->mq_mtx, LK_EXCLUSIVE);
-       crit_enter();
-       struct klist *klist = &mq->mq_rsel.si_note;
-       SLIST_REMOVE(klist, kn, knote, kn_selnext);
-       crit_exit();
+       struct klist *klist = &mq->mq_wkq.ki_note;
+       knote_remove(klist, kn);
        lockmgr(&mq->mq_mtx, LK_RELEASE);
 }
 
@@ -739,9 +732,7 @@ mq_receive1(struct lwp *l, mqd_t mqdes, void *msg_ptr, size_t msg_len,
        wakeup_one(&mq->mq_recv_cv);
 
        /* Ready for sending now */
-       get_mplock();
-       KNOTE(&mq->mq_wsel.si_note, 0);
-       rel_mplock();
+       KNOTE(&mq->mq_wkq.ki_note, 0);
 error:
        lockmgr(&mq->mq_mtx, LK_RELEASE);
        fdrop(fp);
@@ -930,9 +921,7 @@ mq_send1(struct lwp *l, mqd_t mqdes, const char *msg_ptr, size_t msg_len,
        wakeup_one(&mq->mq_send_cv);
 
        /* Ready for receiving now */
-       get_mplock();
-       KNOTE(&mq->mq_rsel.si_note, 0);
-       rel_mplock();
+       KNOTE(&mq->mq_rkq.ki_note, 0);
 error:
        lockmgr(&mq->mq_mtx, LK_RELEASE);
        fdrop(fp);
@@ -1155,10 +1144,8 @@ sys_mq_unlink(struct mq_unlink_args *uap)
        wakeup(&mq->mq_send_cv);
        wakeup(&mq->mq_recv_cv);
 
-       get_mplock();
-       KNOTE(&mq->mq_rsel.si_note, 0);
-       KNOTE(&mq->mq_wsel.si_note, 0);
-       rel_mplock();
+       KNOTE(&mq->mq_rkq.ki_note, 0);
+       KNOTE(&mq->mq_wkq.ki_note, 0);
 
        refcnt = mq->mq_refcnt;
        if (refcnt == 0)
index a26d1d5..3a1e446 100644 (file)
@@ -36,7 +36,6 @@
 #include <sys/filio.h>
 #include <sys/ttycom.h>
 #include <sys/stat.h>
-#include <sys/select.h>
 #include <sys/signalvar.h>
 #include <sys/sysproto.h>
 #include <sys/pipe.h>
@@ -156,22 +155,19 @@ SYSCTL_INT(_kern_pipe, OID_AUTO, bkmem_alloc,
 static void pipeclose (struct pipe *cpipe);
 static void pipe_free_kmem (struct pipe *cpipe);
 static int pipe_create (struct pipe **cpipep);
-static __inline void pipeselwakeup (struct pipe *cpipe);
+static __inline void pipewakeup (struct pipe *cpipe);
 static int pipespace (struct pipe *cpipe, int size);
 
 static __inline void
-pipeselwakeup(struct pipe *cpipe)
+pipewakeup(struct pipe *cpipe)
 {
        if ((cpipe->pipe_state & PIPE_ASYNC) && cpipe->pipe_sigio) {
                get_mplock();
                pgsigio(cpipe->pipe_sigio, SIGIO, 0);
                rel_mplock();
        }
-       if (SLIST_FIRST(&cpipe->pipe_sel.si_note)) {
-               get_mplock();
-               KNOTE(&cpipe->pipe_sel.si_note, 0);
-               rel_mplock();
-       }
+       if (SLIST_FIRST(&cpipe->pipe_kq.ki_note))
+               KNOTE(&cpipe->pipe_kq.ki_note, 0);
 }
 
 /*
@@ -652,7 +648,7 @@ pipe_read(struct file *fp, struct uio *uio, struct ucred *cred, int fflags)
                        }
                }
                lwkt_gettoken(&rpipe->pipe_wlock);
-               pipeselwakeup(rpipe);
+               pipewakeup(rpipe);
                lwkt_reltoken(&rpipe->pipe_wlock);
        }
        /*size = rpipe->pipe_buffer.windex - rpipe->pipe_buffer.rindex;*/
@@ -901,12 +897,12 @@ pipe_write(struct file *fp, struct uio *uio, struct ucred *cred, int fflags)
 
                /*
                 * We have no more space and have something to offer,
-                * wake up select/poll.
+                * wake up select/poll/kq.
                 */
                if (space == 0) {
                        wpipe->pipe_state |= PIPE_WANTW;
                        ++wpipe->pipe_wantwcnt;
-                       pipeselwakeup(wpipe);
+                       pipewakeup(wpipe);
                        if (wpipe->pipe_state & PIPE_WANTW)
                                error = tsleep(wpipe, PCATCH, "pipewr", 0);
                        ++pipe_wblocked_count;
@@ -944,7 +940,7 @@ pipe_write(struct file *fp, struct uio *uio, struct ucred *cred, int fflags)
                        }
                }
                lwkt_gettoken(&wpipe->pipe_rlock);
-               pipeselwakeup(wpipe);
+               pipewakeup(wpipe);
                lwkt_reltoken(&wpipe->pipe_rlock);
        }
 
@@ -962,7 +958,7 @@ pipe_write(struct file *fp, struct uio *uio, struct ucred *cred, int fflags)
 
        /*
         * We have something to offer,
-        * wake up select/poll.
+        * wake up select/poll/kq.
         */
        /*space = wpipe->pipe_buffer.windex - wpipe->pipe_buffer.rindex;*/
        lwkt_reltoken(&wpipe->pipe_wlock);
@@ -1139,8 +1135,8 @@ pipe_shutdown(struct file *fp, int how)
                error = 0;
                break;
        }
-       pipeselwakeup(rpipe);
-       pipeselwakeup(wpipe);
+       pipewakeup(rpipe);
+       pipewakeup(wpipe);
 
        lwkt_reltoken(&wpipe->pipe_wlock);
        lwkt_reltoken(&wpipe->pipe_rlock);
@@ -1190,11 +1186,11 @@ pipeclose(struct pipe *cpipe)
        lwkt_gettoken(&cpipe->pipe_wlock);
 
        /*
-        * Set our state, wakeup anyone waiting in select, and
+        * Set our state, wakeup anyone waiting in select/poll/kq, and
         * wakeup anyone blocked on our pipe.
         */
        cpipe->pipe_state |= PIPE_CLOSED | PIPE_REOF | PIPE_WEOF;
-       pipeselwakeup(cpipe);
+       pipewakeup(cpipe);
        if (cpipe->pipe_state & (PIPE_WANTR | PIPE_WANTW)) {
                cpipe->pipe_state &= ~(PIPE_WANTR | PIPE_WANTW);
                wakeup(cpipe);
@@ -1207,16 +1203,13 @@ pipeclose(struct pipe *cpipe)
                lwkt_gettoken(&ppipe->pipe_rlock);
                lwkt_gettoken(&ppipe->pipe_wlock);
                ppipe->pipe_state |= PIPE_REOF | PIPE_WEOF;
-               pipeselwakeup(ppipe);
+               pipewakeup(ppipe);
                if (ppipe->pipe_state & (PIPE_WANTR | PIPE_WANTW)) {
                        ppipe->pipe_state &= ~(PIPE_WANTR | PIPE_WANTW);
                        wakeup(ppipe);
                }
-               if (SLIST_FIRST(&ppipe->pipe_sel.si_note)) {
-                       get_mplock();
-                       KNOTE(&ppipe->pipe_sel.si_note, 0);
-                       rel_mplock();
-               }
+               if (SLIST_FIRST(&ppipe->pipe_kq.ki_note))
+                       KNOTE(&ppipe->pipe_kq.ki_note, 0);
                lwkt_reltoken(&ppipe->pipe_wlock);
                lwkt_reltoken(&ppipe->pipe_rlock);
        }
@@ -1289,9 +1282,7 @@ pipe_kqfilter(struct file *fp, struct knote *kn)
        }
        kn->kn_hook = (caddr_t)cpipe;
 
-       crit_enter();
-       SLIST_INSERT_HEAD(&cpipe->pipe_sel.si_note, kn, kn_selnext);
-       crit_exit();
+       knote_insert(&cpipe->pipe_kq.ki_note, kn);
 
        return (0);
 }
@@ -1301,9 +1292,7 @@ filt_pipedetach(struct knote *kn)
 {
        struct pipe *cpipe = (struct pipe *)kn->kn_hook;
 
-       crit_enter();
-       SLIST_REMOVE(&cpipe->pipe_sel.si_note, kn, knote, kn_selnext);
-       crit_exit();
+       knote_remove(&cpipe->pipe_kq.ki_note, kn);
 }
 
 /*ARGSUSED*/
index 5817a35..6a40730 100644 (file)
@@ -1172,11 +1172,11 @@ ttykqfilter(struct dev_kqfilter_args *ap)
        ap->a_result = 0;
        switch (kn->kn_filter) {
        case EVFILT_READ:
-               klist = &tp->t_rsel.si_note;
+               klist = &tp->t_rkq.ki_note;
                kn->kn_fop = &ttyread_filtops;
                break;
        case EVFILT_WRITE:
-               klist = &tp->t_wsel.si_note;
+               klist = &tp->t_wkq.ki_note;
                kn->kn_fop = &ttywrite_filtops;
                break;
        default:
@@ -1185,10 +1185,7 @@ ttykqfilter(struct dev_kqfilter_args *ap)
        }
 
        kn->kn_hook = (caddr_t)dev;
-
-       crit_enter();
-       SLIST_INSERT_HEAD(klist, kn, kn_selnext);
-       crit_exit();
+       knote_insert(klist, kn);
 
        return (0);
 }
@@ -1198,9 +1195,7 @@ filt_ttyrdetach(struct knote *kn)
 {
        struct tty *tp = ((cdev_t)kn->kn_hook)->si_tty;
 
-       crit_enter();
-       SLIST_REMOVE(&tp->t_rsel.si_note, kn, knote, kn_selnext);
-       crit_exit();
+       knote_remove(&tp->t_rkq.ki_note, kn);
 }
 
 static int
@@ -1221,9 +1216,7 @@ filt_ttywdetach(struct knote *kn)
 {
        struct tty *tp = ((cdev_t)kn->kn_hook)->si_tty;
 
-       crit_enter();
-       SLIST_REMOVE(&tp->t_wsel.si_note, kn, knote, kn_selnext);
-       crit_exit();
+       knote_remove(&tp->t_wkq.ki_note, kn);
 }
 
 static int
@@ -2218,7 +2211,7 @@ ttwakeup(struct tty *tp)
        if (ISSET(tp->t_state, TS_ASYNC) && tp->t_sigio != NULL)
                pgsigio(tp->t_sigio, SIGIO, (tp->t_session != NULL));
        wakeup(TSA_HUP_OR_INPUT(tp));
-       KNOTE(&tp->t_rsel.si_note, 0);
+       KNOTE(&tp->t_rkq.ki_note, 0);
 }
 
 /*
@@ -2240,7 +2233,7 @@ ttwwakeup(struct tty *tp)
                CLR(tp->t_state, TS_SO_OLOWAT);
                wakeup(TSA_OLOWAT(tp));
        }
-       KNOTE(&tp->t_wsel.si_note, 0);
+       KNOTE(&tp->t_wkq.ki_note, 0);
 }
 
 /*
index 9fb6fb3..5a9d238 100644 (file)
@@ -145,7 +145,7 @@ static struct dev_ops ptc_ops = {
 struct pt_ioctl {
        int     pt_flags;
        int     pt_flags2;
-       struct  selinfo pt_selr, pt_selw;
+       struct  kqinfo pt_kqr, pt_kqw;
        u_char  pt_send;
        u_char  pt_ucntl;
        struct tty pt_tty;
@@ -439,11 +439,11 @@ ptcwakeup(struct tty *tp, int flag)
 {
        if (flag & FREAD) {
                wakeup(TSA_PTC_READ(tp));
-               KNOTE(&tp->t_rsel.si_note, 0);
+               KNOTE(&tp->t_rkq.ki_note, 0);
        }
        if (flag & FWRITE) {
                wakeup(TSA_PTC_WRITE(tp));
-               KNOTE(&tp->t_wsel.si_note, 0);
+               KNOTE(&tp->t_wkq.ki_note, 0);
        }
 }
 
@@ -666,11 +666,11 @@ ptckqfilter(struct dev_kqfilter_args *ap)
        ap->a_result = 0;
        switch (kn->kn_filter) {
        case EVFILT_READ:
-               klist = &tp->t_rsel.si_note;
+               klist = &tp->t_rkq.ki_note;
                kn->kn_fop = &ptcread_filtops;
                break;
        case EVFILT_WRITE:
-               klist = &tp->t_wsel.si_note;
+               klist = &tp->t_wkq.ki_note;
                kn->kn_fop = &ptcwrite_filtops;
                break;
        default:
@@ -679,11 +679,7 @@ ptckqfilter(struct dev_kqfilter_args *ap)
        }
 
        kn->kn_hook = (caddr_t)dev;
-
-       crit_enter();
-       SLIST_INSERT_HEAD(klist, kn, kn_selnext);
-       crit_exit();
-
+       knote_insert(klist, kn);
        return (0);
 }
 
@@ -737,9 +733,7 @@ filt_ptcrdetach (struct knote *kn)
 {
        struct tty *tp = ((cdev_t)kn->kn_hook)->si_tty;
 
-       crit_enter();
-       SLIST_REMOVE(&tp->t_rsel.si_note, kn, knote, kn_selnext);
-       crit_exit();
+       knote_remove(&tp->t_rkq.ki_note, kn);
 }
 
 static void
@@ -747,9 +741,7 @@ filt_ptcwdetach (struct knote *kn)
 {
        struct tty *tp = ((cdev_t)kn->kn_hook)->si_tty;
 
-       crit_enter();
-       SLIST_REMOVE(&tp->t_wsel.si_note, kn, knote, kn_selnext);
-       crit_exit();
+       knote_remove(&tp->t_wkq.ki_note, kn);
 }
 
 /*
index bbff71c..f1a5b05 100644 (file)
@@ -621,7 +621,9 @@ netmsg_so_notify(netmsg_t netmsg)
                lwkt_replymsg(&msg->nm_netmsg.nm_lmsg,
                              msg->nm_netmsg.nm_lmsg.ms_error);
        } else {
-               TAILQ_INSERT_TAIL(&ssb->ssb_sel.si_mlist, msg, nm_list);
+               lwkt_gettoken(&kq_token);
+               TAILQ_INSERT_TAIL(&ssb->ssb_kq.ki_mlist, msg, nm_list);
+               lwkt_reltoken(&kq_token);
                ssb->ssb_flags |= SSB_MEVENT;
        }
 }
@@ -683,7 +685,9 @@ netmsg_so_notify_abort(netmsg_t netmsg)
                ssb = (msg->nm_etype & NM_REVENT) ?
                                &msg->nm_so->so_rcv :
                                &msg->nm_so->so_snd;
-               TAILQ_REMOVE(&ssb->ssb_sel.si_mlist, msg, nm_list);
+               lwkt_gettoken(&kq_token);
+               TAILQ_REMOVE(&ssb->ssb_kq.ki_mlist, msg, nm_list);
+               lwkt_reltoken(&kq_token);
                lwkt_replymsg(&msg->nm_netmsg.nm_lmsg, EINTR);
        }
 
index af7809e..8dea80e 100644 (file)
@@ -152,8 +152,8 @@ soalloc(int waitok)
        if (so) {
                /* XXX race condition for reentrant kernel */
                TAILQ_INIT(&so->so_aiojobq);
-               TAILQ_INIT(&so->so_rcv.ssb_sel.si_mlist);
-               TAILQ_INIT(&so->so_snd.ssb_sel.si_mlist);
+               TAILQ_INIT(&so->so_rcv.ssb_kq.ki_mlist);
+               TAILQ_INIT(&so->so_snd.ssb_kq.ki_mlist);
        }
        return so;
 }
@@ -1187,7 +1187,7 @@ sorflush(struct socket *so)
        asb = *ssb;
        bzero((caddr_t)ssb, sizeof (*ssb));
        if (asb.ssb_flags & SSB_KNOTE) {
-               ssb->ssb_sel.si_note = asb.ssb_sel.si_note;
+               ssb->ssb_kq.ki_note = asb.ssb_kq.ki_note;
                ssb->ssb_flags = SSB_KNOTE;
        }
        crit_exit();
@@ -1698,7 +1698,7 @@ sohasoutofband(struct socket *so)
 {
        if (so->so_sigio != NULL)
                pgsigio(so->so_sigio, SIGURG, 0);
-       KNOTE(&so->so_rcv.ssb_sel.si_note, NOTE_OOB);
+       KNOTE(&so->so_rcv.ssb_kq.ki_note, NOTE_OOB);
 }
 
 int
@@ -1727,10 +1727,8 @@ sokqfilter(struct file *fp, struct knote *kn)
                return (EOPNOTSUPP);
        }
 
-       crit_enter();
-       SLIST_INSERT_HEAD(&ssb->ssb_sel.si_note, kn, kn_selnext);
+       knote_insert(&ssb->ssb_kq.ki_note, kn);
        ssb->ssb_flags |= SSB_KNOTE;
-       crit_exit();
        return (0);
 }
 
@@ -1739,11 +1737,9 @@ filt_sordetach(struct knote *kn)
 {
        struct socket *so = (struct socket *)kn->kn_fp->f_data;
 
-       crit_enter();
-       SLIST_REMOVE(&so->so_rcv.ssb_sel.si_note, kn, knote, kn_selnext);
-       if (SLIST_EMPTY(&so->so_rcv.ssb_sel.si_note))
+       knote_remove(&so->so_rcv.ssb_kq.ki_note, kn);
+       if (SLIST_EMPTY(&so->so_rcv.ssb_kq.ki_note))
                so->so_rcv.ssb_flags &= ~SSB_KNOTE;
-       crit_exit();
 }
 
 /*ARGSUSED*/
@@ -1778,11 +1774,9 @@ filt_sowdetach(struct knote *kn)
 {
        struct socket *so = (struct socket *)kn->kn_fp->f_data;
 
-       crit_enter();
-       SLIST_REMOVE(&so->so_snd.ssb_sel.si_note, kn, knote, kn_selnext);
-       if (SLIST_EMPTY(&so->so_snd.ssb_sel.si_note))
+       knote_remove(&so->so_snd.ssb_kq.ki_note, kn);
+       if (SLIST_EMPTY(&so->so_snd.ssb_kq.ki_note))
                so->so_snd.ssb_flags &= ~SSB_KNOTE;
-       crit_exit();
 }
 
 /*ARGSUSED*/
index bdeb3ea..05eb2d0 100644 (file)
@@ -349,7 +349,7 @@ socantrcvmore(struct socket *so)
 void
 sowakeup(struct socket *so, struct signalsockbuf *ssb)
 {
-       struct selinfo *selinfo = &ssb->ssb_sel;
+       struct kqinfo *kqinfo = &ssb->ssb_kq;
 
        if (ssb->ssb_flags & SSB_WAIT) {
                if ((ssb == &so->so_snd && ssb_space(ssb) >= ssb->ssb_lowat) ||
@@ -367,18 +367,18 @@ sowakeup(struct socket *so, struct signalsockbuf *ssb)
                (*so->so_upcall)(so, so->so_upcallarg, MB_DONTWAIT);
        if (ssb->ssb_flags & SSB_AIO)
                aio_swake(so, ssb);
-       KNOTE(&selinfo->si_note, 0);
+       KNOTE(&kqinfo->ki_note, 0);
        if (ssb->ssb_flags & SSB_MEVENT) {
                struct netmsg_so_notify *msg, *nmsg;
 
-               TAILQ_FOREACH_MUTABLE(msg, &selinfo->si_mlist, nm_list, nmsg) {
+               TAILQ_FOREACH_MUTABLE(msg, &kqinfo->ki_mlist, nm_list, nmsg) {
                        if (msg->nm_predicate(&msg->nm_netmsg)) {
-                               TAILQ_REMOVE(&selinfo->si_mlist, msg, nm_list);
+                               TAILQ_REMOVE(&kqinfo->ki_mlist, msg, nm_list);
                                lwkt_replymsg(&msg->nm_netmsg.nm_lmsg, 
                                              msg->nm_netmsg.nm_lmsg.ms_error);
                        }
                }
-               if (TAILQ_EMPTY(&ssb->ssb_sel.si_mlist))
+               if (TAILQ_EMPTY(&ssb->ssb_kq.ki_mlist))
                        ssb->ssb_flags &= ~SSB_MEVENT;
        }
 }
@@ -389,8 +389,8 @@ sowakeup(struct socket *so, struct signalsockbuf *ssb)
  * Each socket contains two socket buffers: one for sending data and
  * one for receiving data.  Each buffer contains a queue of mbufs,
  * information about the number of mbufs and amount of data in the
- * queue, and other fields allowing select() statements and notification
- * on data availability to be implemented.
+ * queue, and other fields allowing kevent()/select()/poll() statements
+ * and notification on data availability to be implemented.
  *
  * Data stored in a socket buffer is maintained as a list of records.
  * Each record is a list of mbufs chained together with the m_next
index 1e4735c..5591c8d 100644 (file)
@@ -311,7 +311,7 @@ kern_accept(int s, int fflags, struct sockaddr **name, int *namelen, int *res)
        fflag = lfp->f_flag;
 
        /* connection has been removed from the listen queue */
-       KNOTE(&head->so_rcv.ssb_sel.si_note, 0);
+       KNOTE(&head->so_rcv.ssb_kq.ki_note, 0);
 
        so->so_state &= ~SS_COMP;
        so->so_head = NULL;
index 2b72c9e..22a0e86 100644 (file)
@@ -351,7 +351,7 @@ aio_free_entry(struct aiocblist *aiocbe)
 
        /* aiocbe is going away, we need to destroy any knotes */
        /* XXX lwp knote wants a thread, but only cares about the process */
-       knote_remove(&aiocbe->klist);
+       knote_empty(&aiocbe->klist);
 
        if ((ki->kaio_flags & KAIO_WAKEUP) || ((ki->kaio_flags & KAIO_RUNDOWN)
            && ((ki->kaio_buffer_count == 0) && (ki->kaio_queue_count == 0)))) {
@@ -2203,7 +2203,7 @@ filt_aioattach(struct knote *kn)
                return (EPERM);
        kn->kn_flags &= ~EV_FLAG1;
 
-       SLIST_INSERT_HEAD(&aiocbe->klist, kn, kn_selnext);
+       knote_insert(&aiocbe->klist, kn);
 
        return (0);
 }
@@ -2214,7 +2214,7 @@ filt_aiodetach(struct knote *kn)
 {
        struct aiocblist *aiocbe = (struct aiocblist *)kn->kn_sdata;
 
-       SLIST_REMOVE(&aiocbe->klist, kn, knote, kn_selnext);
+       knote_remove(&aiocbe->klist, kn);
 }
 
 /* kqueue filter function */
index b2d41a9..6388cd4 100644 (file)
@@ -2121,7 +2121,7 @@ void
 vn_gone(struct vnode *vp)
 {
        lwkt_gettoken(&vp->v_token);
-       KNOTE(&vp->v_pollinfo.vpi_selinfo.si_note, NOTE_REVOKE);
+       KNOTE(&vp->v_pollinfo.vpi_kqinfo.ki_note, NOTE_REVOKE);
        lwkt_reltoken(&vp->v_token);
 }
 
index 6ff0fd9..98a5c65 100644 (file)
@@ -521,7 +521,7 @@ bpf_wakeup(struct bpf_d *d)
                pgsigio(d->bd_sigio, d->bd_sig, 0);
 
        get_mplock();
-       KNOTE(&d->bd_sel.si_note, 0);
+       KNOTE(&d->bd_kq.ki_note, 0);
        rel_mplock();
 }
 
@@ -1094,10 +1094,8 @@ bpfkqfilter(struct dev_kqfilter_args *ap)
                return (0);
        }
 
-       crit_enter();
-       klist = &d->bd_sel.si_note;
-       SLIST_INSERT_HEAD(klist, kn, kn_selnext);
-       crit_exit();
+       klist = &d->bd_kq.ki_note;
+       knote_insert(klist, kn);
 
        return (0);
 }
@@ -1108,11 +1106,9 @@ bpf_filter_detach(struct knote *kn)
        struct klist *klist;
        struct bpf_d *d;
 
-       crit_enter();
        d = (struct bpf_d *)kn->kn_hook;
-       klist = &d->bd_sel.si_note;
-       SLIST_REMOVE(klist, kn, knote, kn_selnext);
-       crit_exit();
+       klist = &d->bd_kq.ki_note;
+       knote_remove(klist, kn);
 }
 
 static int
index 4329d79..9f82311 100644 (file)
@@ -45,7 +45,7 @@
 #define _NET_BPFDESC_H_
 
 #include <sys/callout.h>
-#include <sys/selinfo.h>
+#include <sys/event.h>
 
 /*
  * Descriptor associated with each open bpf file.
@@ -90,7 +90,7 @@ struct bpf_d {
        struct proc *   bd_selproc;     /* process that last selected us */
 #else
        u_char          bd_pad;         /* explicit alignment */
-       struct selinfo  bd_sel;         /* bsd select info */
+       struct kqinfo   bd_kq;          /* bsd kqueue info */
 #endif
        struct callout  bd_callout;     /* for BPF timeouts with select */
        int             bd_locked;      /* true if descriptor is locked */
index 0df418c..31ba6c8 100644 (file)
@@ -90,7 +90,7 @@ static struct rbch_softc {
        struct ifqueue sc_hdlcq;        /* hdlc read queue      */
 #define I4BRBCHMAXQLEN 10
 
-       struct selinfo selp;            /* select / poll        */
+       struct kqinfo kqp;              /* select / poll / kevent */
 
 #if I4BRBCHACCT
        struct callout  sc_timeout;
@@ -561,10 +561,8 @@ i4brbchkqfilter(struct dev_kqfilter_args *ap)
                return (0);
        }
 
-       crit_enter();
-       klist = &sc->selp.si_note;
-       SLIST_INSERT_HEAD(klist, kn, kn_selnext);
-       crit_exit();
+       klist = &sc->kqp.ki_note;
+       knote_insert(klist, kn);
 
        return (0);
 }
@@ -577,10 +575,8 @@ i4brbchkfilt_detach(struct knote *kn)
        struct rbch_softc *sc = &rbch_softc[unit];
        struct klist *klist;
 
-       crit_enter();
-       klist = &sc->selp.si_note;
-       SLIST_REMOVE(klist, kn, knote, kn_selnext);
-       crit_exit();
+       klist = &sc->kqp.ki_note;
+       knote_remove(klist, kn);
 }
 
 PDEVSTATIC int
@@ -812,7 +808,7 @@ rbch_rx_data_rdy(int unit)
        {
                NDBGL4(L4_RBCHDBG, "unit %d, NO wakeup", unit);
        }
-       KNOTE(&rbch_softc[unit].selp.si_note, 0);
+       KNOTE(&rbch_softc[unit].kqp.ki_note, 0);
 }
 
 /*---------------------------------------------------------------------------*
@@ -833,7 +829,7 @@ rbch_tx_queue_empty(int unit)
        {
                NDBGL4(L4_RBCHDBG, "unit %d, NO wakeup", unit);
        }
-       KNOTE(&rbch_softc[unit].selp.si_note, 0);
+       KNOTE(&rbch_softc[unit].kqp.ki_note, 0);
 }
 
 /*---------------------------------------------------------------------------*
@@ -845,7 +841,7 @@ rbch_activity(int unit, int rxtx)
 {
        if (rbch_softc[unit].sc_cd)
                rbch_softc[unit].sc_cd->last_active_time = SECOND;
-       KNOTE(&rbch_softc[unit].selp.si_note, 0);
+       KNOTE(&rbch_softc[unit].kqp.ki_note, 0);
 }
 
 /*---------------------------------------------------------------------------*
index 3a07253..8944d4f 100644 (file)
@@ -108,7 +108,7 @@ typedef struct {
 #define ST_WRWAITEMPTY 0x08            /* userland write waiting */
 #define ST_TONE                0x10            /* tone generator */
 
-       struct selinfo          selp;           /* select / poll */
+       struct kqinfo           kqp;            /* select / poll / kevent */
 
        struct i4b_tel_tones    tones;
        int                     toneidx;
@@ -716,10 +716,8 @@ i4btelkqfilter(struct dev_kqfilter_args *ap)
                return (0);
        }
 
-       crit_enter();
-       klist = &sc->selp.si_note;
-       SLIST_INSERT_HEAD(klist, kn, kn_selnext);
-       crit_exit();
+       klist = &sc->kqp.ki_note;
+       knote_insert(klist, kn);
 
        return (0);
 }
@@ -731,12 +729,9 @@ i4btelfilt_detach(struct knote *kn)
        int unit = UNIT(dev);
        int func = FUNC(dev);
        tel_sc_t *sc = &tel_sc[unit][func];
-       struct klist *klist;
+       struct klist *klist = &sc->kqp.ki_note;
 
-       crit_enter();
-       klist = &sc->selp.si_note;
-       SLIST_REMOVE(klist, kn, knote, kn_selnext);
-       crit_exit();
+       knote_remove(klist, kn);
 }
 
 PDEVSTATIC int
@@ -853,7 +848,7 @@ tel_connect(int unit, void *cdp)
                        sc->devstate &= ~ST_RDWAITDATA;
                        wakeup((caddr_t) &sc->result);
                }
-               KNOTE(&sc->selp.si_note, 0);
+               KNOTE(&sc->kqp.ki_note, 0);
        }
 }
 
@@ -896,7 +891,7 @@ tel_disconnect(int unit, void *cdp)
                        sc->devstate &= ~ST_RDWAITDATA;
                        wakeup((caddr_t) &sc->result);
                }
-               KNOTE(&sc->selp.si_note, 0);
+               KNOTE(&sc->kqp.ki_note, 0);
 
                if (sc->devstate & ST_TONE) {
                        sc->devstate &= ~ST_TONE;
@@ -924,7 +919,7 @@ tel_dialresponse(int unit, int status, cause_t cause)
                        sc->devstate &= ~ST_RDWAITDATA;
                        wakeup((caddr_t) &sc->result);
                }
-               KNOTE(&sc->selp.si_note, 0);
+               KNOTE(&sc->kqp.ki_note, 0);
        }
 }
        
@@ -951,7 +946,7 @@ tel_rx_data_rdy(int unit)
                sc->devstate &= ~ST_RDWAITDATA;
                wakeup((caddr_t) &sc->isdn_linktab->rx_queue);
        }
-       KNOTE(&sc->selp.si_note, 0);
+       KNOTE(&sc->kqp.ki_note, 0);
 }
 
 /*---------------------------------------------------------------------------*
@@ -972,7 +967,7 @@ tel_tx_queue_empty(int unit)
        if(sc->devstate & ST_TONE) {
                tel_tone(sc);
        } else {
-               KNOTE(&sc->selp.si_note, 0);
+               KNOTE(&sc->kqp.ki_note, 0);
        }
 }
 
index 6e0e6a4..e86f826 100644 (file)
@@ -55,7 +55,6 @@
 #include <sys/mbuf.h>
 #include <sys/socket.h>
 #include <sys/thread2.h>
-#include <sys/selinfo.h>
 
 #include <net/if.h>
 
@@ -74,7 +73,7 @@
 
 #include <sys/event.h>
 
-struct selinfo select_rd_info;
+struct kqinfo kq_rd_info;
 
 static struct ifqueue i4b_rdqueue;
 static int openflag = 0;
@@ -759,10 +758,8 @@ i4bkqfilter(struct dev_kqfilter_args *ap)
                return (0);
        }
 
-       crit_enter();
-       klist = &select_rd_info.si_note;
-       SLIST_INSERT_HEAD(klist, kn, kn_selnext);
-       crit_exit();
+       klist = &kq_rd_info.ki_note;
+       knote_insert(klist, kn);
 
        return (0);
 }
@@ -770,12 +767,9 @@ i4bkqfilter(struct dev_kqfilter_args *ap)
 PDEVSTATIC void
 i4bkqfilt_detach(struct knote *kn)
 {
-       struct klist *klist;
+       struct klist *klist = &kq_rd_info.ki_note;
 
-       crit_enter();
-       klist = &select_rd_info.si_note;
-       SLIST_REMOVE(klist, kn, knote, kn_selnext);
-       crit_exit();
+       knote_remove(klist, kn);
 }
 
 PDEVSTATIC int
@@ -829,7 +823,7 @@ i4bputqueue(struct mbuf *m)
                wakeup((caddr_t) &i4b_rdqueue);
        }
 
-       KNOTE(&select_rd_info.si_note, 0);
+       KNOTE(&kq_rd_info.ki_note, 0);
 }
 
 /*---------------------------------------------------------------------------*
@@ -864,7 +858,7 @@ i4bputqueue_hipri(struct mbuf *m)
                wakeup((caddr_t) &i4b_rdqueue);
        }
 
-       KNOTE(&select_rd_info.si_note, 0);
+       KNOTE(&kq_rd_info.ki_note, 0);
 }
 
 #endif /* NI4B > 0 */
index e76e05c..67f44a7 100644 (file)
@@ -428,7 +428,7 @@ tapclose(struct dev_close_args *ap)
 
        funsetown(tp->tap_sigio);
        tp->tap_sigio = NULL;
-       KNOTE(&tp->tap_rsel.si_note, 0);
+       KNOTE(&tp->tap_rkq.ki_note, 0);
 
        tp->tap_flags &= ~TAP_OPEN;
        funsetown(tp->tap_sigtd);
@@ -643,9 +643,7 @@ tapifstart(struct ifnet *ifp)
                        wakeup((caddr_t)tp);
                }
 
-               get_mplock();
-               KNOTE(&tp->tap_rsel.si_note, 0);
-               rel_mplock();
+               KNOTE(&tp->tap_rkq.ki_note, 0);
 
                if ((tp->tap_flags & TAP_ASYNC) && (tp->tap_sigio != NULL)) {
                        get_mplock();
@@ -953,9 +951,8 @@ tapkqfilter(struct dev_kqfilter_args *ap)
        struct klist *list;
        struct ifnet *ifp;
 
-       get_mplock();
        tp = dev->si_drv1;
-       list = &tp->tap_rsel.si_note;
+       list = &tp->tap_rkq.ki_note;
        ifp = &tp->tap_if;
        ap->a_result =0;
 
@@ -973,10 +970,8 @@ tapkqfilter(struct dev_kqfilter_args *ap)
                rel_mplock();
                return(0);
        }
-       crit_enter();
-       SLIST_INSERT_HEAD(list, kn, kn_selnext);
-       crit_exit();
-       rel_mplock();
+
+       knote_insert(list, kn);
        return(0);
 }
 
@@ -1003,7 +998,7 @@ filt_tapdetach(struct knote *kn)
 {
        struct tap_softc *tp = (void *)kn->kn_hook;
 
-       SLIST_REMOVE(&tp->tap_rsel.si_note, kn, knote, kn_selnext);
+       knote_remove(&tp->tap_rkq.ki_note, kn);
 }
 
 static void
index 95700cb..06398db 100644 (file)
@@ -61,7 +61,7 @@ struct tap_softc {
 
        struct sigio    *tap_sigtd;             /* track process owning tap */
        struct sigio    *tap_sigio;             /* information for async I/O */
-       struct selinfo   tap_rsel;              /* read select               */
+       struct kqinfo    tap_rkq;               /* read select/poll/kq       */
        struct ifqueue   tap_devq;
        int              tap_unit;
 
index 8c56085..9076fae 100644 (file)
@@ -218,7 +218,7 @@ tunclose(struct dev_close_args *ap)
        if_purgeaddrs_nolink(ifp);
 
        funsetown(tp->tun_sigio);
-       KNOTE(&tp->tun_rsel.si_note, 0);
+       KNOTE(&tp->tun_rkq.ki_note, 0);
 
        TUNDEBUG(ifp, "closed\n");
 #if 0
@@ -397,8 +397,8 @@ tunoutput_serialized(struct ifnet *ifp, struct mbuf *m0, struct sockaddr *dst,
                get_mplock();
                if (tp->tun_flags & TUN_ASYNC && tp->tun_sigio)
                        pgsigio(tp->tun_sigio, SIGIO, 0);
-               KNOTE(&tp->tun_rsel.si_note, 0);
                rel_mplock();
+               KNOTE(&tp->tun_rkq.ki_note, 0);
        }
        return (error);
 }
@@ -730,11 +730,8 @@ tunkqfilter(struct dev_kqfilter_args *ap)
                return (0);
        }
 
-       klist = &tp->tun_rsel.si_note;
-       crit_enter();
-       SLIST_INSERT_HEAD(klist, kn, kn_selnext);
-       crit_exit();
-
+       klist = &tp->tun_rkq.ki_note;
+       knote_insert(klist, kn);
        ifnet_deserialize_all(&tp->tun_if);
 
        return (0);
@@ -744,12 +741,9 @@ static void
 tun_filter_detach(struct knote *kn)
 {
        struct tun_softc *tp = (struct tun_softc *)kn->kn_hook;
-       struct klist *klist;
+       struct klist *klist = &tp->tun_rkq.ki_note;
 
-       klist = &tp->tun_rsel.si_note;
-       crit_enter();
-       SLIST_REMOVE(klist, kn, knote, kn_selnext);
-       crit_exit();
+       knote_remove(klist, kn);
 }
 
 static int
@@ -796,6 +790,6 @@ tunstart(struct ifnet *ifp)
                }
                if (tp->tun_flags & TUN_ASYNC && tp->tun_sigio)
                        pgsigio(tp->tun_sigio, SIGIO, 0);
-               KNOTE(&tp->tun_rsel.si_note, 0);
+               KNOTE(&tp->tun_rkq.ki_note, 0);
        }
 }
index 92efa70..69944f2 100644 (file)
@@ -47,8 +47,8 @@ struct tun_softc {
        pid_t   tun_pid;                /* PID of process to open */
        struct  ifnet tun_if;           /* the interface */
        struct  sigio *tun_sigio;       /* information for async I/O */
-       struct  selinfo tun_rsel;       /* read select */
-       struct  selinfo tun_wsel;       /* write select (not used) */
+       struct  kqinfo  tun_rkq;        /* read select/poll/kq */
+       struct  kqinfo  tun_wkq;        /* write select/poll/kq (not used) */
 };
 
 #endif /* !_NET_IF_TUNVAR_H_ */
index 1f317f0..86219ea 100644 (file)
@@ -41,7 +41,6 @@
 #include <sys/malloc.h>
 #include <sys/file.h>          /* Must come after sys/malloc.h */
 #include <sys/proc.h>
-#include <sys/select.h>
 #include <sys/socket.h>
 #include <sys/socketvar.h>
 #include <sys/sysctl.h>
@@ -125,7 +124,7 @@ nsmb_dev_open(struct dev_open_args *ap)
 /*
        STAILQ_INIT(&sdp->sd_rqlist);
        STAILQ_INIT(&sdp->sd_rplist);
-       bzero(&sdp->sd_pollinfo, sizeof(struct selinfo));
+       bzero(&sdp->sd_pollinfo, sizeof(struct kqinfo));
 */
        crit_enter();
        sdp->sd_level = -1;
index f634054..6fb4765 100644 (file)
@@ -171,7 +171,7 @@ struct smb_dev {
        int             sd_seq;
 /*     struct ifqueue  sd_rdqueue;
        struct ifqueue  sd_wrqueue;
-       struct selinfo  sd_pollinfo;
+       struct kqinfo   sd_pollinfo;
        struct smbrqh   sd_rqlist;
        struct smbrqh   sd_rplist;
        struct ucred    *sd_owner;*/
index 89d69fc..dba1991 100644 (file)
@@ -46,7 +46,6 @@ static device_t       acpi_dev;
  * APM driver emulation 
  */
 
-#include <sys/selinfo.h>
 #include <sys/event.h>
 
 #include <machine/apm_bios.h>
index 8134851..4ca2d1c 100644 (file)
@@ -28,7 +28,6 @@
 #include <sys/time.h>
 #include <sys/reboot.h>
 #include <sys/bus.h>
-#include <sys/selinfo.h>
 #include <sys/event.h>
 #include <sys/fcntl.h>
 #include <sys/uio.h>
@@ -904,7 +903,7 @@ apm_record_event(struct apm_softc *sc, u_int event_type)
        sc->event_ptr %= APM_NEVENTS;
        evp->type = event_type;
        evp->index = ++apm_evindex;
-       KNOTE(&sc->sc_rsel.si_note, 0);
+       KNOTE(&sc->sc_rkq.ki_note, 0);
        return (sc->sc_flags & SCFLAG_OCTL) ? 0 : 1; /* user may handle */
 }
 
@@ -1368,10 +1367,8 @@ apmkqfilter(struct dev_kqfilter_args *ap)
                return (0);
        }
 
-       crit_enter();
-       klist = &sc->sc_rsel.si_note;
-       SLIST_INSERT_HEAD(klist, kn, kn_selnext);
-       crit_exit();
+       klist = &sc->sc_rkq.ki_note;
+       knote_insert(klist, kn);
 
        return (0);
 }
@@ -1382,10 +1379,8 @@ apmfilter_detach(struct knote *kn)
        struct apm_softc *sc = (struct apm_softc *)kn->kn_hook;
        struct klist *klist;
 
-       crit_enter();
-       klist = &sc->sc_rsel.si_note;
-       SLIST_REMOVE(klist, kn, knote, kn_selnext);
-       crit_exit();
+       klist = &sc->sc_rkq.ki_note;
+       knote_remove(klist, kn);
 }
 
 static int
index 39794c6..501763a 100644 (file)
@@ -34,7 +34,7 @@ struct apm_softc {
        struct bios_args bios;
        struct apmhook sc_suspend;
        struct apmhook sc_resume;
-       struct selinfo sc_rsel;
+       struct kqinfo sc_rkq;
        int     sc_flags;
        int     event_count;
        int     event_ptr;
index c2f6866..2d32642 100644 (file)
@@ -47,7 +47,6 @@
 #include <sys/malloc.h>
 #include <sys/kernel.h>
 #include <sys/event.h>
-#include <sys/selinfo.h>
 #include <sys/uio.h>
 #include <sys/thread2.h>
 #include <sys/bus.h>
@@ -155,7 +154,7 @@ struct asc_unit {
   int     btime;          /* timeout of buffer in seconds/hz */
   struct  _sbuf sbuf;
   long   icnt;         /* interrupt count XXX for debugging */
-  struct selinfo selp;
+  struct  kqinfo kqp;
   int     height;         /* height, for pnm modes */
   size_t  bcount;         /* bytes to read, for pnm modes */
 };
@@ -471,8 +470,6 @@ ascattach(struct isa_device *isdp)
 /*  lprintf("asc%d.attach: ok\n", unit); */
   scu->flags &= ~FLAG_DEBUG;
 
-    scu->selp.si_flags=0;
-    scu->selp.si_pid=(pid_t)0;
 #define ASC_UID 0
 #define ASC_GID 13
   make_dev(&asc_ops, unit<<6, ASC_UID, ASC_GID, 0666, "asc%d", unit);
@@ -520,7 +517,7 @@ ascintr(void *arg)
        if (scu->sbuf.size - scu->sbuf.count >= scu->linesize) {
            dma_restart(scu);
        }
-       KNOTE(&scu->selp.si_note, 0);
+       KNOTE(&scu->kqp.ki_note, 0);
     }
 }
 
@@ -869,10 +866,8 @@ asckqfilter(struct dev_kqfilter_args *ap)
         return (0);
     }
 
-    crit_enter();
-    klist = &scu->selp.si_note;
-    SLIST_INSERT_HEAD(klist, kn, kn_selnext);
-    crit_exit();
+    klist = &scu->kqp.ki_note;
+    knote_insert(klist, kn);
 
     return (0);
 }
@@ -883,10 +878,8 @@ ascfilter_detach(struct knote *kn)
     struct asc_unit *scu = (struct asc_unit *)kn->kn_hook;
     struct klist *klist;
 
-    crit_enter();
-    klist = &scu->selp.si_note;
-    SLIST_REMOVE(klist, kn, knote, kn_selnext);
-    crit_exit();
+    klist = &scu->kqp.ki_note;
+    knote_remove(klist, kn);
 }
 
 STATIC int
index 63d500c..f4ce81b 100644 (file)
@@ -46,7 +46,6 @@ static device_t       acpi_dev;
  * APM driver emulation
  */
 
-#include <sys/selinfo.h>
 #include <sys/event.h>
 
 #include <machine/apm_bios.h>
index d6e1501..8cffc61 100644 (file)
@@ -28,7 +28,6 @@
 #include <sys/time.h>
 #include <sys/reboot.h>
 #include <sys/bus.h>
-#include <sys/selinfo.h>
 #include <sys/event.h>
 #include <sys/fcntl.h>
 #include <sys/uio.h>
@@ -904,7 +903,7 @@ apm_record_event(struct apm_softc *sc, u_int event_type)
        sc->event_ptr %= APM_NEVENTS;
        evp->type = event_type;
        evp->index = ++apm_evindex;
-       KNOTE(&sc->sc_rsel.si_note, 0);
+       KNOTE(&sc->sc_rkq.ki_note, 0);
        return (sc->sc_flags & SCFLAG_OCTL) ? 0 : 1; /* user may handle */
 }
 
@@ -1368,10 +1367,8 @@ apmkqfilter(struct dev_kqfilter_args *ap)
                return (0);
        }
 
-       crit_enter();
-       klist = &sc->sc_rsel.si_note;
-       SLIST_INSERT_HEAD(klist, kn, kn_selnext);
-       crit_exit();
+       klist = &sc->sc_rkq.ki_note;
+       knote_insert(klist, kn);
 
        return (0);
 }
@@ -1382,10 +1379,8 @@ apmfilter_detach(struct knote *kn)
        struct apm_softc *sc = (struct apm_softc *)kn->kn_hook;
        struct klist *klist;
 
-       crit_enter();
-       klist = &sc->sc_rsel.si_note;
-       SLIST_REMOVE(klist, kn, knote, kn_selnext);
-       crit_exit();
+       klist = &sc->sc_rkq.ki_note;
+       knote_remove(klist, kn);
 }
 
 static int
index 41a9c14..a3f58f5 100644 (file)
@@ -34,7 +34,7 @@ struct apm_softc {
 /*     struct bios_args bios;*/
        struct apmhook sc_suspend;
        struct apmhook sc_resume;
-       struct selinfo sc_rsel;
+       struct kqinfo sc_rkq;
        int     sc_flags;
        int     event_count;
        int     event_ptr;
index cc5998c..7f9b4f6 100644 (file)
@@ -48,7 +48,6 @@
 #include <sys/malloc.h>
 #include <sys/kernel.h>
 #include <sys/event.h>
-#include <sys/selinfo.h>
 #include <sys/uio.h>
 #include <sys/thread2.h>
 
@@ -154,7 +153,7 @@ struct asc_unit {
   int     btime;          /* timeout of buffer in seconds/hz */
   struct  _sbuf sbuf;
   long   icnt;         /* interrupt count XXX for debugging */
-  struct selinfo selp;
+  struct  kqinfo kqp;
   int     height;         /* height, for pnm modes */
   size_t  bcount;         /* bytes to read, for pnm modes */
 };
@@ -470,8 +469,6 @@ ascattach(struct isa_device *isdp)
 /*  lprintf("asc%d.attach: ok\n", unit); */
   scu->flags &= ~FLAG_DEBUG;
 
-    scu->selp.si_flags=0;
-    scu->selp.si_pid=(pid_t)0;
 #define ASC_UID 0
 #define ASC_GID 13
   make_dev(&asc_ops, unit<<6, ASC_UID, ASC_GID, 0666, "asc%d", unit);
@@ -519,7 +516,7 @@ ascintr(void *arg)
        if (scu->sbuf.size - scu->sbuf.count >= scu->linesize) {
            dma_restart(scu);
        }
-       KNOTE(&scu->selp.si_note, 0);
+       KNOTE(&scu->kqp.ki_note, 0);
     }
 }
 
@@ -868,10 +865,8 @@ asckqfilter(struct dev_kqfilter_args *ap)
         return (0);
     }
 
-    crit_enter();
-    klist = &scu->selp.si_note;
-    SLIST_INSERT_HEAD(klist, kn, kn_selnext);
-    crit_exit();
+    klist = &scu->kqp.ki_note;
+    knote_insert(klist, kn);
 
     return (0);
 }
@@ -882,10 +877,8 @@ ascfilter_detach(struct knote *kn)
     struct asc_unit *scu = (struct asc_unit *)kn->kn_hook;
     struct klist *klist;
 
-    crit_enter();
-    klist = &scu->selp.si_note;
-    SLIST_REMOVE(klist, kn, knote, kn_selnext);
-    crit_exit();
+    klist = &scu->kqp.ki_note;
+    knote_remove(klist, kn);
 }
 
 STATIC int
index 28aed8c..8a1079b 100644 (file)
@@ -33,6 +33,9 @@
 #ifndef _SYS_TYPES_H_
 #include <sys/types.h>
 #endif
+#ifndef _NET_NETISR_H_
+#include <net/netisr.h>                        /* struct notifymsglist */
+#endif
 
 #define EVFILT_READ            (-1)
 #define EVFILT_WRITE           (-2)
@@ -128,6 +131,11 @@ SLIST_HEAD(klist, knote);
 
 #ifdef _KERNEL
 
+/*
+ * Global token for kqueue subsystem
+ */
+extern struct lwkt_token kq_token;
+
 #ifdef MALLOC_DECLARE
 MALLOC_DECLARE(M_KQUEUE);
 #endif
@@ -154,7 +162,7 @@ struct filterops {
 struct knote {
        SLIST_ENTRY(knote)      kn_link;        /* for fd */
        TAILQ_ENTRY(knote)      kn_kqlink;      /* for kq_knlist */
-       SLIST_ENTRY(knote)      kn_selnext;     /* for struct selinfo */
+       SLIST_ENTRY(knote)      kn_next;        /* for struct kqinfo */
        TAILQ_ENTRY(knote)      kn_tqe;         /* for kq_head */
        struct                  kqueue *kn_kq;  /* which queue we are on */
        struct                  kevent kn_kevent;
@@ -180,6 +188,15 @@ struct knote {
 #define kn_fp          kn_ptr.p_fp
 };
 
+/*
+ * Used to maintain information about processes that wish to be
+ * notified when I/O becomes possible.
+ */
+struct kqinfo {
+       struct  klist ki_note;          /* kernel note list */
+       struct  notifymsglist ki_mlist; /* list of pending predicate messages */
+};
+
 struct proc;
 struct thread;
 struct filedesc;
@@ -194,12 +211,13 @@ int kern_kevent(struct kqueue *kq, int nevents, int *res, void *uap,
     struct timespec *tsp);
 
 extern void    knote(struct klist *list, long hint);
-extern void    knote_remove(struct klist *list);
+extern void    knote_insert(struct klist *klist, struct knote *kn);
+extern void    knote_remove(struct klist *klist, struct knote *kn);
+extern void    knote_empty(struct klist *list);
 extern void    knote_fdclose(struct file *fp, struct filedesc *fdp, int fd);
 extern void    kqueue_init(struct kqueue *kq, struct filedesc *fdp);
 extern void    kqueue_terminate(struct kqueue *kq);
 extern int     kqueue_register(struct kqueue *kq, struct kevent *kev);
-extern void    kqueue_wakeup(struct kqueue *kq);
 
 #endif         /* _KERNEL */
 
index b96256c..bba0d27 100644 (file)
@@ -42,9 +42,6 @@
 #ifndef _SYS_EVENT_H_
 #include <sys/event.h>
 #endif
-#ifndef _SYS_SELINFO_H_
-#include <sys/selinfo.h>
-#endif
 #ifndef _SYS_FILEDESC_H_
 #include <sys/filedesc.h>
 #endif
@@ -60,7 +57,7 @@ struct kqueue {
        struct kqlist   kq_knlist;
        int             kq_count;               /* number of pending events */
        struct          sigio *kq_sigio;
-       struct          selinfo kq_sel; 
+       struct          kqinfo kq_kqinfo;       
        struct          filedesc *kq_fdp;
        int             kq_state;
        u_long          kq_knhashmask;          /* size of knhash */
index a935d7e..21d6000 100644 (file)
@@ -49,7 +49,7 @@ struct mq_attr {
 #include <sys/lock.h>
 #include <sys/types.h>
 #include <sys/queue.h>
-#include <sys/selinfo.h>
+#include <sys/event.h>
 #include <sys/types.h>
 
 /*
@@ -80,8 +80,8 @@ struct mqueue {
        int                     mq_recv_cv;
        struct mq_attr          mq_attrib;
        /* Notification */
-       struct selinfo          mq_rsel;
-       struct selinfo          mq_wsel;
+       struct kqinfo           mq_rkq;
+       struct kqinfo           mq_wkq;
        struct sigevent         mq_sig_notify;
        struct proc *           mq_notify_proc;
        /* Permissions */
index 469b008..c5de382 100644 (file)
@@ -33,8 +33,8 @@
 #ifndef _SYS_TIME_H_
 #include <sys/time.h>                  /* for struct timespec */
 #endif
-#ifndef _SYS_SELINFO_H_
-#include <sys/selinfo.h>               /* for struct selinfo */
+#ifndef _SYS_EVENT_H_
+#include <sys/event.h>                 /* for struct kqinfo */
 #endif
 #ifndef _SYS_XIO_H_
 #include <sys/xio.h>                   /* for struct xio */
@@ -93,7 +93,7 @@ struct pipebuf {
  */
 struct pipe {
        struct  pipebuf pipe_buffer;    /* data storage */
-       struct  selinfo pipe_sel;       /* for compat with select */
+       struct  kqinfo pipe_kq;         /* for compat with select/poll/kq */
        struct  timespec pipe_atime;    /* time of last access */
        struct  timespec pipe_mtime;    /* time of last modify */
        struct  timespec pipe_ctime;    /* time of status change */
diff --git a/sys/sys/selinfo.h b/sys/sys/selinfo.h
deleted file mode 100644 (file)
index 71d52a8..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-/*-
- * Copyright (c) 1992, 1993
- *     The Regents of the University of California.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *     This product includes software developed by the University of
- *     California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)selinfo.h       8.2 (Berkeley) 1/4/94
- * $DragonFly: src/sys/sys/selinfo.h,v 1.3 2007/02/18 16:13:27 corecode Exp $
- */
-
-#ifndef _SYS_SELINFO_H_
-#define        _SYS_SELINFO_H_
-
-#if defined(_KERNEL) || defined(_KERNEL_STRUCTURES)
-
-#include <sys/signal.h>
-
-#include <sys/event.h>                 /* for struct klist */
-#include <net/netisr.h>                        /* for struct notifymsglist */
-
-/*
- * Used to maintain information about processes that wish to be
- * notified when I/O becomes possible.
- */
-struct selinfo {
-       pid_t   si_pid;                 /* process to be notified */
-       lwpid_t si_tid;                 /* lwp within this process */
-       struct  klist si_note;          /* kernel note list */
-       struct  notifymsglist si_mlist; /* list of pending predicate messages */
-       short   si_flags;               /* see below */
-};
-#define        SI_COLL 0x0001          /* collision occurred */
-
-#define SEL_WAITING(sel)       (sel->si_pid != 0 || (sel->si_flags & SI_COLL) != 0)
-
-#endif
-
-#endif /* !_SYS_SELINFO_H_ */
index 1bf8e02..cc999e6 100644 (file)
@@ -44,8 +44,8 @@
 #ifndef _SYS_QUEUE_H_
 #include <sys/queue.h>                 /* for TAILQ macros */
 #endif
-#ifndef _SYS_SELINFO_H_
-#include <sys/selinfo.h>               /* for struct selinfo */
+#ifndef _SYS_EVENT_H_
+#include <sys/event.h>                 /* for struct kqinfo */
 #endif
 #ifndef _SYS_SOCKBUF_H_
 #include <sys/sockbuf.h>
@@ -61,7 +61,7 @@ struct accept_filter;
  */
 struct signalsockbuf {
        struct sockbuf sb;
-       struct selinfo ssb_sel; /* process selecting read/write */
+       struct kqinfo ssb_kq;   /* process selecting read/write */
        short   ssb_flags;      /* flags, see below */
        short   ssb_timeo;      /* timeout for read/write */
        long    ssb_lowat;      /* low water mark */
@@ -262,14 +262,18 @@ ssb_space(struct signalsockbuf *ssb)
        ((ssb_space(ssb) <= 0) ? 0 : sbappendcontrol(&(ssb)->sb, m, control))
 
 #define ssb_insert_knote(ssb, kn) {                                    \
-        SLIST_INSERT_HEAD(&(ssb)->ssb_sel.si_note, kn, kn_selnext);    \
+       lwkt_gettoken(&kq_token);                                       \
+        SLIST_INSERT_HEAD(&(ssb)->ssb_kq.ki_note, kn, kn_next);                \
+       lwkt_reltoken(&kq_token);                                       \
        (ssb)->ssb_flags |= SSB_KNOTE;                                  \
 }
 
 #define ssb_remove_knote(ssb, kn) {                                    \
-        SLIST_REMOVE(&(ssb)->ssb_sel.si_note, kn, knote, kn_selnext);  \
-       if (SLIST_EMPTY(&(ssb)->ssb_sel.si_note))                       \
+       lwkt_gettoken(&kq_token);                                       \
+        SLIST_REMOVE(&(ssb)->ssb_kq.ki_note, kn, knote, kn_next);      \
+       if (SLIST_EMPTY(&(ssb)->ssb_kq.ki_note))                        \
                (ssb)->ssb_flags &= ~SSB_KNOTE;                         \
+       lwkt_reltoken(&kq_token);                                       \
 }
 
 #define        sorwakeup(so)   do { \
index 99c5dfc..4d0c993 100644 (file)
@@ -46,8 +46,8 @@
 #ifndef _SYS_TERMIOS_H_
 #include <sys/termios.h>
 #endif
-#ifndef _SYS_SELINFO_H_
-#include <sys/selinfo.h>
+#ifndef _SYS_EVENT_H_
+#include <sys/event.h>
 #endif
 #ifdef _KERNEL
 #include <sys/device.h>
@@ -94,8 +94,8 @@ struct tty {
        struct  pgrp *t_pgrp;           /* Foreground process group. */
        struct  session *t_session;     /* Enclosing session. */
        struct  sigio *t_sigio;         /* Information for async I/O. */
-       struct  selinfo t_rsel;         /* Tty read/oob select. */
-       struct  selinfo t_wsel;         /* Tty write select. */
+       struct  kqinfo t_rkq;           /* Tty read/oob kq. */
+       struct  kqinfo t_wkq;           /* Tty write kq. */
        struct  termios t_termios;      /* Termios state. */
        struct  winsize t_winsize;      /* Window size. */
                                        /* Start output. */
index e4ff7a5..98f2872 100644 (file)
@@ -46,8 +46,8 @@
 #ifndef _SYS_LOCK_H_
 #include <sys/lock.h>
 #endif
-#ifndef _SYS_SELINFO_H_
-#include <sys/selinfo.h>
+#ifndef _SYS_EVENT_H_
+#include <sys/event.h>
 #endif
 #ifndef _SYS_BIOTRACK_H_
 #include <sys/biotrack.h>
@@ -256,7 +256,7 @@ struct vnode {
        void    *v_data;                        /* private data for fs */
        struct namecache_list v_namecache;      /* (S) associated nc entries */
        struct  {
-               struct  selinfo vpi_selinfo;    /* identity of poller(s) */
+               struct  kqinfo vpi_kqinfo;      /* identity of poller(s) */
        } v_pollinfo;
        struct vmresident *v_resident;          /* optional vmresident */
        struct vrangehead v_range;              /* range lock */
index 058ce0c..e4efbdc 100644 (file)
@@ -148,7 +148,7 @@ union _qcvt {
        (q) = tmp.qcvt; \
 }
 #define VN_KNOTE(vp, b) \
-       KNOTE(&vp->v_pollinfo.vpi_selinfo.si_note, (b))
+       KNOTE(&vp->v_pollinfo.vpi_kqinfo.ki_note, (b))
 
 #define OFSFMT(vp)             ((vp)->v_mount->mnt_maxsymlinklen <= 0)
 
@@ -1958,8 +1958,9 @@ ext2_kqfilter(struct vop_kqfilter_args *ap)
 
        kn->kn_hook = (caddr_t)vp;
 
+       /* XXX: kq token actually protects the list */
        lwkt_gettoken(&vp->v_token);
-       SLIST_INSERT_HEAD(&vp->v_pollinfo.vpi_selinfo.si_note, kn, kn_selnext);
+       knote_insert(&vp->v_pollinfo.vpi_kqinfo.ki_note, kn);
        lwkt_reltoken(&vp->v_token);
 
        return (0);
@@ -1971,8 +1972,7 @@ filt_ext2detach(struct knote *kn)
        struct vnode *vp = (struct vnode *)kn->kn_hook;
 
        lwkt_gettoken(&vp->v_token);
-       SLIST_REMOVE(&vp->v_pollinfo.vpi_selinfo.si_note,
-           kn, knote, kn_selnext);
+       knote_remove(&vp->v_pollinfo.vpi_kqinfo.ki_note, kn);
        lwkt_reltoken(&vp->v_token);
 }
 
index 226ba7d..9d1dabf 100644 (file)
@@ -163,7 +163,7 @@ void
 hammer_knote(struct vnode *vp, int flags)
 {
        if (flags)
-               KNOTE(&vp->v_pollinfo.vpi_selinfo.si_note, flags);
+               KNOTE(&vp->v_pollinfo.vpi_kqinfo.ki_note, flags);
 }
 
 #ifdef DEBUG_TRUNCATE
@@ -3377,8 +3377,9 @@ hammer_vop_kqfilter(struct vop_kqfilter_args *ap)
 
        kn->kn_hook = (caddr_t)vp;
 
+       /* XXX: kq token actually protects the list */
        lwkt_gettoken(&vp->v_token);
-       SLIST_INSERT_HEAD(&vp->v_pollinfo.vpi_selinfo.si_note, kn, kn_selnext);
+       knote_insert(&vp->v_pollinfo.vpi_kqinfo.ki_note, kn);
        lwkt_reltoken(&vp->v_token);
 
        return(0);
@@ -3390,8 +3391,7 @@ filt_hammerdetach(struct knote *kn)
        struct vnode *vp = (void *)kn->kn_hook;
 
        lwkt_gettoken(&vp->v_token);
-       SLIST_REMOVE(&vp->v_pollinfo.vpi_selinfo.si_note,
-                    kn, knote, kn_selnext);
+       knote_remove(&vp->v_pollinfo.vpi_kqinfo.ki_note, kn);
        lwkt_reltoken(&vp->v_token);
 }
 
index cced082..aa43856 100644 (file)
@@ -52,7 +52,7 @@
 #include "opt_directio.h"
 
 #define VN_KNOTE(vp, b) \
-       KNOTE((struct klist *)&vp->v_pollinfo.vpi_selinfo.si_note, (b))
+       KNOTE((struct klist *)&vp->v_pollinfo.vpi_kqinfo.ki_note, (b))
 
 #ifdef DIRECTIO
 extern int ffs_rawread(struct vnode *vp, struct uio *uio, int *workdone);
index 94d5eaa..cc20531 100644 (file)
@@ -132,7 +132,7 @@ union _qcvt {
        (q) = tmp.qcvt; \
 }
 #define VN_KNOTE(vp, b) \
-       KNOTE(&vp->v_pollinfo.vpi_selinfo.si_note, (b))
+       KNOTE(&vp->v_pollinfo.vpi_kqinfo.ki_note, (b))
 
 #define OFSFMT(vp)             ((vp)->v_mount->mnt_maxsymlinklen <= 0)
 
@@ -2150,8 +2150,9 @@ ufs_kqfilter(struct vop_kqfilter_args *ap)
 
        kn->kn_hook = (caddr_t)vp;
 
+       /* XXX: kq token actually protects the list */
        lwkt_gettoken(&vp->v_token);
-       SLIST_INSERT_HEAD(&vp->v_pollinfo.vpi_selinfo.si_note, kn, kn_selnext);
+       knote_insert(&vp->v_pollinfo.vpi_kqinfo.ki_note, kn);
        lwkt_reltoken(&vp->v_token);
 
        return (0);
@@ -2163,8 +2164,7 @@ filt_ufsdetach(struct knote *kn)
        struct vnode *vp = (struct vnode *)kn->kn_hook;
 
        lwkt_gettoken(&vp->v_token);
-       SLIST_REMOVE(&vp->v_pollinfo.vpi_selinfo.si_note,
-           kn, knote, kn_selnext);
+       knote_remove(&vp->v_pollinfo.vpi_kqinfo.ki_note, kn);
        lwkt_reltoken(&vp->v_token);
 }