From 5b22f1a7302b644c8e417d0bf1192e953e27d3b6 Mon Sep 17 00:00:00 2001 From: "Samuel J. Greear" Date: Thu, 29 Jul 2010 12:06:13 +0000 Subject: [PATCH] kernel - Remove kevent subsystem from under mplock * 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 --- sys/bus/cam/scsi/scsi_target.c | 12 +-- sys/bus/firewire/firewire.c | 2 +- sys/bus/firewire/firewirereg.h | 4 +- sys/bus/firewire/fwdev.c | 13 +-- sys/bus/usb/usb.c | 17 ++-- sys/dev/drm/drmP.h | 1 - sys/dev/misc/cmx/cmx.c | 24 ++--- sys/dev/misc/cmx/cmx_pccard.c | 2 +- sys/dev/misc/cmx/cmxvar.h | 2 +- sys/dev/misc/hotplug/hotplug.c | 17 ++-- sys/dev/misc/kbd/kbd.c | 18 ++-- sys/dev/misc/kbdmux/kbdmux.c | 2 +- sys/dev/misc/mse/mse.c | 17 ++-- sys/dev/misc/nmdm/nmdm.c | 4 +- sys/dev/misc/psm/psm.c | 19 ++-- sys/dev/misc/snp/snp.c | 18 ++-- sys/dev/misc/spic/spic.c | 17 ++-- sys/dev/misc/syscons/apm/apm_saver.c | 2 +- sys/dev/misc/tw/tw.c | 17 ++-- sys/dev/raid/aac/aac.c | 14 +-- sys/dev/raid/aac/aacvar.h | 4 +- sys/dev/sound/pcm/buffer.c | 16 ++-- sys/dev/sound/pcm/buffer.h | 6 +- sys/dev/sound/pcm/channel.c | 6 +- sys/dev/sound/pcm/dsp.c | 12 +-- sys/dev/usbmisc/ucom/ucom.c | 3 +- sys/dev/usbmisc/ugen/ugen.c | 21 ++--- sys/dev/usbmisc/uhid/uhid.c | 17 ++-- sys/dev/usbmisc/ums/ums.c | 19 ++-- sys/dev/video/bktr/bktr_audio.c | 2 +- sys/dev/video/bktr/bktr_core.c | 2 +- sys/dev/video/bktr/bktr_i2c.c | 1 - sys/dev/video/bktr/bktr_os.c | 14 +-- sys/dev/video/bktr/bktr_reg.h | 2 +- sys/dev/video/bktr/bktr_tuner.c | 2 +- sys/dev/video/cxm/cxm.c | 16 +--- sys/dev/video/cxm/cxm.h | 4 +- sys/kern/kern_event.c | 114 ++++++++++++----------- sys/kern/kern_sig.c | 4 +- sys/kern/kern_udev.c | 16 ++-- sys/kern/subr_bus.c | 17 ++-- sys/kern/subr_log.c | 16 ++-- sys/kern/sys_mqueue.c | 35 +++---- sys/kern/sys_pipe.c | 47 ++++------ sys/kern/tty.c | 21 ++--- sys/kern/tty_pty.c | 24 ++--- sys/kern/uipc_msg.c | 8 +- sys/kern/uipc_socket.c | 24 ++--- sys/kern/uipc_socket2.c | 14 +-- sys/kern/uipc_syscalls.c | 2 +- sys/kern/vfs_aio.c | 6 +- sys/kern/vfs_subr.c | 2 +- sys/net/bpf.c | 14 +-- sys/net/bpfdesc.h | 4 +- sys/net/i4b/driver/i4b_rbch.c | 20 ++-- sys/net/i4b/driver/i4b_tel.c | 25 ++--- sys/net/i4b/layer4/i4b_i4bdrv.c | 20 ++-- sys/net/tap/if_tap.c | 17 ++-- sys/net/tap/if_tapvar.h | 2 +- sys/net/tun/if_tun.c | 20 ++-- sys/net/tun/if_tunvar.h | 4 +- sys/netproto/smb/smb_dev.c | 3 +- sys/netproto/smb/smb_dev.h | 2 +- sys/platform/pc32/acpica5/acpi_machdep.c | 1 - sys/platform/pc32/apm/apm.c | 15 +-- sys/platform/pc32/apm/apm.h | 2 +- sys/platform/pc32/isa/asc.c | 19 ++-- sys/platform/pc64/acpica5/acpi_machdep.c | 1 - sys/platform/pc64/apm/apm.c | 15 +-- sys/platform/pc64/apm/apm.h | 2 +- sys/platform/pc64/isa/asc.c | 19 ++-- sys/sys/event.h | 24 ++++- sys/sys/eventvar.h | 5 +- sys/sys/mqueue.h | 6 +- sys/sys/pipe.h | 6 +- sys/sys/selinfo.h | 64 ------------- sys/sys/socketvar.h | 16 ++-- sys/sys/tty.h | 8 +- sys/sys/vnode.h | 6 +- sys/vfs/gnu/ext2fs/ext2_vnops.c | 8 +- sys/vfs/hammer/hammer_vnops.c | 8 +- sys/vfs/ufs/ufs_readwrite.c | 2 +- sys/vfs/ufs/ufs_vnops.c | 8 +- 83 files changed, 419 insertions(+), 666 deletions(-) delete mode 100644 sys/sys/selinfo.h diff --git a/sys/bus/cam/scsi/scsi_target.c b/sys/bus/cam/scsi/scsi_target.c index 28f753e7c4..5993da795b 100644 --- a/sys/bus/cam/scsi/scsi_target.c +++ b/sys/bus/cam/scsi/scsi_target.c @@ -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); } diff --git a/sys/bus/firewire/firewire.c b/sys/bus/firewire/firewire.c index 5031a70fb3..f1cb651b8e 100644 --- a/sys/bus/firewire/firewire.c +++ b/sys/bus/firewire/firewire.c @@ -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); diff --git a/sys/bus/firewire/firewirereg.h b/sys/bus/firewire/firewirereg.h index 1dececc383..6faa9c7e36 100644 --- a/sys/bus/firewire/firewirereg.h +++ b/sys/bus/firewire/firewirereg.h @@ -44,8 +44,8 @@ typedef struct thread fw_proc; typedef struct proc fw_proc; #endif -#include #include +#include 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 *); }; diff --git a/sys/bus/firewire/fwdev.c b/sys/bus/firewire/fwdev.c index 206f7c7b0e..5acb9c34d3 100644 --- a/sys/bus/firewire/fwdev.c +++ b/sys/bus/firewire/fwdev.c @@ -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 diff --git a/sys/bus/usb/usb.c b/sys/bus/usb/usb.c index 1bf35dadf3..04cd5530c1 100644 --- a/sys/bus/usb/usb.c +++ b/sys/bus/usb/usb.c @@ -70,7 +70,6 @@ #include #include #include -#include #include #include #include @@ -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); } diff --git a/sys/dev/drm/drmP.h b/sys/dev/drm/drmP.h index 59d1c457a6..3dcce54603 100644 --- a/sys/dev/drm/drmP.h +++ b/sys/dev/drm/drmP.h @@ -81,7 +81,6 @@ struct drm_file; #include #include #include -#include #include #include "dev/drm/drm.h" diff --git a/sys/dev/misc/cmx/cmx.c b/sys/dev/misc/cmx/cmx.c index 63c39dd08c..5f62dc03e0 100644 --- a/sys/dev/misc/cmx/cmx.c +++ b/sys/dev/misc/cmx/cmx.c @@ -48,7 +48,6 @@ #include #include #include -#include #include #include #include @@ -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 diff --git a/sys/dev/misc/cmx/cmx_pccard.c b/sys/dev/misc/cmx/cmx_pccard.c index f2c9dec2b2..6e5b332623 100644 --- a/sys/dev/misc/cmx/cmx_pccard.c +++ b/sys/dev/misc/cmx/cmx_pccard.c @@ -32,8 +32,8 @@ #include #include #include -#include #include +#include #include #include diff --git a/sys/dev/misc/cmx/cmxvar.h b/sys/dev/misc/cmx/cmxvar.h index dc5234eb1f..a97bb3eea1 100644 --- a/sys/dev/misc/cmx/cmxvar.h +++ b/sys/dev/misc/cmx/cmxvar.h @@ -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? */ diff --git a/sys/dev/misc/hotplug/hotplug.c b/sys/dev/misc/hotplug/hotplug.c index 2c7d64f0be..0417cefe7d 100644 --- a/sys/dev/misc/hotplug/hotplug.c +++ b/sys/dev/misc/hotplug/hotplug.c @@ -27,7 +27,6 @@ #include #include #include -#include #include #include #include @@ -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); } diff --git a/sys/dev/misc/kbd/kbd.c b/sys/dev/misc/kbd/kbd.c index 30297681bf..0f51936d6e 100644 --- a/sys/dev/misc/kbd/kbd.c +++ b/sys/dev/misc/kbd/kbd.c @@ -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; diff --git a/sys/dev/misc/kbdmux/kbdmux.c b/sys/dev/misc/kbdmux/kbdmux.c index 754e4c7543..4de39e3bee 100644 --- a/sys/dev/misc/kbdmux/kbdmux.c +++ b/sys/dev/misc/kbdmux/kbdmux.c @@ -48,7 +48,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/sys/dev/misc/mse/mse.c b/sys/dev/misc/mse/mse.c index 05d1033b75..2ed49ca196 100644 --- a/sys/dev/misc/mse/mse.c +++ b/sys/dev/misc/mse/mse.c @@ -52,7 +52,6 @@ #include #include #include -#include #include #include #include @@ -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); } } diff --git a/sys/dev/misc/nmdm/nmdm.c b/sys/dev/misc/nmdm/nmdm.c index 701b0fadd9..5774269cfe 100644 --- a/sys/dev/misc/nmdm/nmdm.c +++ b/sys/dev/misc/nmdm/nmdm.c @@ -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); } } diff --git a/sys/dev/misc/psm/psm.c b/sys/dev/misc/psm/psm.c index d502c8317d..1911c772de 100644 --- a/sys/dev/misc/psm/psm.c +++ b/sys/dev/misc/psm/psm.c @@ -75,7 +75,6 @@ #include #include #include -#include #include #include #include @@ -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 diff --git a/sys/dev/misc/snp/snp.c b/sys/dev/misc/snp/snp.c index 0e63fe61d7..3999707176 100644 --- a/sys/dev/misc/snp/snp.c +++ b/sys/dev/misc/snp/snp.c @@ -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 diff --git a/sys/dev/misc/spic/spic.c b/sys/dev/misc/spic/spic.c index 0d5d97b99a..370c554417 100644 --- a/sys/dev/misc/spic/spic.c +++ b/sys/dev/misc/spic/spic.c @@ -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 diff --git a/sys/dev/misc/syscons/apm/apm_saver.c b/sys/dev/misc/syscons/apm/apm_saver.c index bb24bd0d26..1c5c95506f 100644 --- a/sys/dev/misc/syscons/apm/apm_saver.c +++ b/sys/dev/misc/syscons/apm/apm_saver.c @@ -35,12 +35,12 @@ #include #include #include +#include #include #include #include "../syscons.h" -#include #include #include #include diff --git a/sys/dev/misc/tw/tw.c b/sys/dev/misc/tw/tw.c index 2711092389..201cc24d87 100644 --- a/sys/dev/misc/tw/tw.c +++ b/sys/dev/misc/tw/tw.c @@ -148,7 +148,6 @@ #include #include #include -#include #include #include @@ -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); } diff --git a/sys/dev/raid/aac/aac.c b/sys/dev/raid/aac/aac.c index d40ed534a3..cfc8f0c8eb 100644 --- a/sys/dev/raid/aac/aac.c +++ b/sys/dev/raid/aac/aac.c @@ -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); diff --git a/sys/dev/raid/aac/aacvar.h b/sys/dev/raid/aac/aacvar.h index 8fffe8ed87..8995c3c2e7 100644 --- a/sys/dev/raid/aac/aacvar.h +++ b/sys/dev/raid/aac/aacvar.h @@ -34,7 +34,7 @@ #include #include #include -#include +#include #include #include @@ -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) diff --git a/sys/dev/sound/pcm/buffer.c b/sys/dev/sound/pcm/buffer.c index 6f0f342a7e..afae55fb80 100644 --- a/sys/dev/sound/pcm/buffer.c +++ b/sys/dev/sound/pcm/buffer.c @@ -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; } /************************************************************/ diff --git a/sys/dev/sound/pcm/buffer.h b/sys/dev/sound/pcm/buffer.h index dd0e62460d..fd052c322c 100644 --- a/sys/dev/sound/pcm/buffer.h +++ b/sys/dev/sound/pcm/buffer.h @@ -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); diff --git a/sys/dev/sound/pcm/channel.c b/sys/dev/sound/pcm/channel.c index 81d17580f0..45f5d8f261 100644 --- a/sys/dev/sound/pcm/channel.c +++ b/sys/dev/sound/pcm/channel.c @@ -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) { diff --git a/sys/dev/sound/pcm/dsp.c b/sys/dev/sound/pcm/dsp.c index 60da277a10..a56ae391d9 100644 --- a/sys/dev/sound/pcm/dsp.c +++ b/sys/dev/sound/pcm/dsp.c @@ -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); } diff --git a/sys/dev/usbmisc/ucom/ucom.c b/sys/dev/usbmisc/ucom/ucom.c index a710205025..d3644d296e 100644 --- a/sys/dev/usbmisc/ucom/ucom.c +++ b/sys/dev/usbmisc/ucom/ucom.c @@ -77,7 +77,6 @@ #include #include #include -#include #include #include #include @@ -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) { diff --git a/sys/dev/usbmisc/ugen/ugen.c b/sys/dev/usbmisc/ugen/ugen.c index e0a85f05eb..aa7e456024 100644 --- a/sys/dev/usbmisc/ugen/ugen.c +++ b/sys/dev/usbmisc/ugen/ugen.c @@ -61,7 +61,6 @@ #include #include #include -#include #include #include #include @@ -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); } } diff --git a/sys/dev/usbmisc/uhid/uhid.c b/sys/dev/usbmisc/uhid/uhid.c index c48e7f7c5c..579f3b7cc1 100644 --- a/sys/dev/usbmisc/uhid/uhid.c +++ b/sys/dev/usbmisc/uhid/uhid.c @@ -60,7 +60,6 @@ #include #include #include -#include #include #include #include @@ -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 diff --git a/sys/dev/usbmisc/ums/ums.c b/sys/dev/usbmisc/ums/ums.c index 292b47dba6..c7705970a4 100644 --- a/sys/dev/usbmisc/ums/ums.c +++ b/sys/dev/usbmisc/ums/ums.c @@ -53,7 +53,6 @@ #include #include #include -#include #include #include #include @@ -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 diff --git a/sys/dev/video/bktr/bktr_audio.c b/sys/dev/video/bktr/bktr_audio.c index 451c59acf8..9f9a7dda95 100644 --- a/sys/dev/video/bktr/bktr_audio.c +++ b/sys/dev/video/bktr/bktr_audio.c @@ -54,7 +54,7 @@ #include #include #include -#include +#include #include diff --git a/sys/dev/video/bktr/bktr_core.c b/sys/dev/video/bktr/bktr_core.c index ef9464271d..99535f006a 100644 --- a/sys/dev/video/bktr/bktr_core.c +++ b/sys/dev/video/bktr/bktr_core.c @@ -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); diff --git a/sys/dev/video/bktr/bktr_i2c.c b/sys/dev/video/bktr/bktr_i2c.c index ad0af350f5..8d69717d9b 100644 --- a/sys/dev/video/bktr/bktr_i2c.c +++ b/sys/dev/video/bktr/bktr_i2c.c @@ -42,7 +42,6 @@ #include #include #include -#include #include #include diff --git a/sys/dev/video/bktr/bktr_os.c b/sys/dev/video/bktr/bktr_os.c index 9b7b290efd..35c1fa748d 100644 --- a/sys/dev/video/bktr/bktr_os.c +++ b/sys/dev/video/bktr/bktr_os.c @@ -60,12 +60,10 @@ #include #include #include -#include #include #include #include #include -#include #include #include @@ -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 diff --git a/sys/dev/video/bktr/bktr_reg.h b/sys/dev/video/bktr/bktr_reg.h index c0037b5d70..18958b3e6a 100644 --- a/sys/dev/video/bktr/bktr_reg.h +++ b/sys/dev/video/bktr/bktr_reg.h @@ -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 */ diff --git a/sys/dev/video/bktr/bktr_tuner.c b/sys/dev/video/bktr/bktr_tuner.c index 40e06213e6..640315a0e6 100644 --- a/sys/dev/video/bktr/bktr_tuner.c +++ b/sys/dev/video/bktr/bktr_tuner.c @@ -48,7 +48,7 @@ #include #include #include -#include +#include #include diff --git a/sys/dev/video/cxm/cxm.c b/sys/dev/video/cxm/cxm.c index 354e5169d4..c596452937 100644 --- a/sys/dev/video/cxm/cxm.c +++ b/sys/dev/video/cxm/cxm.c @@ -50,7 +50,6 @@ #include #include #include -#include #include #include #include @@ -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 diff --git a/sys/dev/video/cxm/cxm.h b/sys/dev/video/cxm/cxm.h index 53293fa2d7..3b6ac36a57 100644 --- a/sys/dev/video/cxm/cxm.h +++ b/sys/dev/video/cxm/cxm.h @@ -36,7 +36,7 @@ * Header file for the Conexant MPEG-2 Codec driver. */ -#include +#include #include @@ -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; diff --git a/sys/kern/kern_event.c b/sys/kern/kern_event.c index 088efe7663..85d9ace76f 100644 --- a/sys/kern/kern_event.c +++ b/sys/kern/kern_event.c @@ -36,7 +36,6 @@ #include #include #include -#include #include #include #include @@ -46,6 +45,7 @@ #include #include #include +#include #include #include #include @@ -57,6 +57,11 @@ #include +/* + * 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 diff --git a/sys/kern/kern_sig.c b/sys/kern/kern_sig.c index be4cfcb2fc..eb691268d5 100644 --- a/sys/kern/kern_sig.c +++ b/sys/kern/kern_sig.c @@ -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); } /* diff --git a/sys/kern/kern_udev.c b/sys/kern/kern_udev.c index 6422b4594a..e00b574016 100644 --- a/sys/kern/kern_udev.c +++ b/sys/kern/kern_udev.c @@ -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); } diff --git a/sys/kern/subr_bus.c b/sys/kern/subr_bus.c index 24f8ecad42..efc5aa4dae 100644 --- a/sys/kern/subr_bus.c +++ b/sys/kern/subr_bus.c @@ -43,7 +43,6 @@ #include #include #include -#include #include #include #include @@ -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) diff --git a/sys/kern/subr_log.c b/sys/kern/subr_log.c index 479e6baa9c..bc89aec08d 100644 --- a/sys/kern/subr_log.c +++ b/sys/kern/subr_log.c @@ -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) { diff --git a/sys/kern/sys_mqueue.c b/sys/kern/sys_mqueue.c index cef4d13a0f..47d9a859be 100644 --- a/sys/kern/sys_mqueue.c +++ b/sys/kern/sys_mqueue.c @@ -57,7 +57,6 @@ #include #include #include -#include #include #include #include @@ -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) diff --git a/sys/kern/sys_pipe.c b/sys/kern/sys_pipe.c index a26d1d58b4..3a1e4466bd 100644 --- a/sys/kern/sys_pipe.c +++ b/sys/kern/sys_pipe.c @@ -36,7 +36,6 @@ #include #include #include -#include #include #include #include @@ -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*/ diff --git a/sys/kern/tty.c b/sys/kern/tty.c index 5817a35151..6a4073027b 100644 --- a/sys/kern/tty.c +++ b/sys/kern/tty.c @@ -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); } /* diff --git a/sys/kern/tty_pty.c b/sys/kern/tty_pty.c index 9fb6fb33c0..5a9d238406 100644 --- a/sys/kern/tty_pty.c +++ b/sys/kern/tty_pty.c @@ -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); } /* diff --git a/sys/kern/uipc_msg.c b/sys/kern/uipc_msg.c index bbff71c593..f1a5b05c74 100644 --- a/sys/kern/uipc_msg.c +++ b/sys/kern/uipc_msg.c @@ -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); } diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c index af7809e388..8dea80eb72 100644 --- a/sys/kern/uipc_socket.c +++ b/sys/kern/uipc_socket.c @@ -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*/ diff --git a/sys/kern/uipc_socket2.c b/sys/kern/uipc_socket2.c index bdeb3ea05d..05eb2d0798 100644 --- a/sys/kern/uipc_socket2.c +++ b/sys/kern/uipc_socket2.c @@ -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 diff --git a/sys/kern/uipc_syscalls.c b/sys/kern/uipc_syscalls.c index 1e4735ce03..5591c8ded2 100644 --- a/sys/kern/uipc_syscalls.c +++ b/sys/kern/uipc_syscalls.c @@ -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; diff --git a/sys/kern/vfs_aio.c b/sys/kern/vfs_aio.c index 2b72c9e1bf..22a0e86997 100644 --- a/sys/kern/vfs_aio.c +++ b/sys/kern/vfs_aio.c @@ -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 */ diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c index b2d41a9058..6388cd473c 100644 --- a/sys/kern/vfs_subr.c +++ b/sys/kern/vfs_subr.c @@ -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); } diff --git a/sys/net/bpf.c b/sys/net/bpf.c index 6ff0fd9804..98a5c6565c 100644 --- a/sys/net/bpf.c +++ b/sys/net/bpf.c @@ -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 diff --git a/sys/net/bpfdesc.h b/sys/net/bpfdesc.h index 4329d792de..9f8231116b 100644 --- a/sys/net/bpfdesc.h +++ b/sys/net/bpfdesc.h @@ -45,7 +45,7 @@ #define _NET_BPFDESC_H_ #include -#include +#include /* * 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 */ diff --git a/sys/net/i4b/driver/i4b_rbch.c b/sys/net/i4b/driver/i4b_rbch.c index 0df418c689..31ba6c8757 100644 --- a/sys/net/i4b/driver/i4b_rbch.c +++ b/sys/net/i4b/driver/i4b_rbch.c @@ -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); } /*---------------------------------------------------------------------------* diff --git a/sys/net/i4b/driver/i4b_tel.c b/sys/net/i4b/driver/i4b_tel.c index 3a07253252..8944d4f73a 100644 --- a/sys/net/i4b/driver/i4b_tel.c +++ b/sys/net/i4b/driver/i4b_tel.c @@ -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); } } diff --git a/sys/net/i4b/layer4/i4b_i4bdrv.c b/sys/net/i4b/layer4/i4b_i4bdrv.c index 6e0e6a4050..e86f826653 100644 --- a/sys/net/i4b/layer4/i4b_i4bdrv.c +++ b/sys/net/i4b/layer4/i4b_i4bdrv.c @@ -55,7 +55,6 @@ #include #include #include -#include #include @@ -74,7 +73,7 @@ #include -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 */ diff --git a/sys/net/tap/if_tap.c b/sys/net/tap/if_tap.c index e76e05c5ed..67f44a7ed6 100644 --- a/sys/net/tap/if_tap.c +++ b/sys/net/tap/if_tap.c @@ -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 diff --git a/sys/net/tap/if_tapvar.h b/sys/net/tap/if_tapvar.h index 95700cb6a4..06398db6c2 100644 --- a/sys/net/tap/if_tapvar.h +++ b/sys/net/tap/if_tapvar.h @@ -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; diff --git a/sys/net/tun/if_tun.c b/sys/net/tun/if_tun.c index 8c56085906..9076fae565 100644 --- a/sys/net/tun/if_tun.c +++ b/sys/net/tun/if_tun.c @@ -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); } } diff --git a/sys/net/tun/if_tunvar.h b/sys/net/tun/if_tunvar.h index 92efa704ab..69944f2a6b 100644 --- a/sys/net/tun/if_tunvar.h +++ b/sys/net/tun/if_tunvar.h @@ -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_ */ diff --git a/sys/netproto/smb/smb_dev.c b/sys/netproto/smb/smb_dev.c index 1f317f0ead..86219eaaf1 100644 --- a/sys/netproto/smb/smb_dev.c +++ b/sys/netproto/smb/smb_dev.c @@ -41,7 +41,6 @@ #include #include /* Must come after sys/malloc.h */ #include -#include #include #include #include @@ -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; diff --git a/sys/netproto/smb/smb_dev.h b/sys/netproto/smb/smb_dev.h index f63405442b..6fb4765369 100644 --- a/sys/netproto/smb/smb_dev.h +++ b/sys/netproto/smb/smb_dev.h @@ -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;*/ diff --git a/sys/platform/pc32/acpica5/acpi_machdep.c b/sys/platform/pc32/acpica5/acpi_machdep.c index 89d69fc5ae..dba1991a1a 100644 --- a/sys/platform/pc32/acpica5/acpi_machdep.c +++ b/sys/platform/pc32/acpica5/acpi_machdep.c @@ -46,7 +46,6 @@ static device_t acpi_dev; * APM driver emulation */ -#include #include #include diff --git a/sys/platform/pc32/apm/apm.c b/sys/platform/pc32/apm/apm.c index 81348515e9..4ca2d1cd0f 100644 --- a/sys/platform/pc32/apm/apm.c +++ b/sys/platform/pc32/apm/apm.c @@ -28,7 +28,6 @@ #include #include #include -#include #include #include #include @@ -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 diff --git a/sys/platform/pc32/apm/apm.h b/sys/platform/pc32/apm/apm.h index 39794c6a92..501763a4f5 100644 --- a/sys/platform/pc32/apm/apm.h +++ b/sys/platform/pc32/apm/apm.h @@ -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; diff --git a/sys/platform/pc32/isa/asc.c b/sys/platform/pc32/isa/asc.c index c2f6866c46..2d32642109 100644 --- a/sys/platform/pc32/isa/asc.c +++ b/sys/platform/pc32/isa/asc.c @@ -47,7 +47,6 @@ #include #include #include -#include #include #include #include @@ -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 diff --git a/sys/platform/pc64/acpica5/acpi_machdep.c b/sys/platform/pc64/acpica5/acpi_machdep.c index 63d500c1d0..f4ce81b582 100644 --- a/sys/platform/pc64/acpica5/acpi_machdep.c +++ b/sys/platform/pc64/acpica5/acpi_machdep.c @@ -46,7 +46,6 @@ static device_t acpi_dev; * APM driver emulation */ -#include #include #include diff --git a/sys/platform/pc64/apm/apm.c b/sys/platform/pc64/apm/apm.c index d6e1501cd4..8cffc61433 100644 --- a/sys/platform/pc64/apm/apm.c +++ b/sys/platform/pc64/apm/apm.c @@ -28,7 +28,6 @@ #include #include #include -#include #include #include #include @@ -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 diff --git a/sys/platform/pc64/apm/apm.h b/sys/platform/pc64/apm/apm.h index 41a9c14009..a3f58f5e10 100644 --- a/sys/platform/pc64/apm/apm.h +++ b/sys/platform/pc64/apm/apm.h @@ -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; diff --git a/sys/platform/pc64/isa/asc.c b/sys/platform/pc64/isa/asc.c index cc5998c938..7f9b4f6600 100644 --- a/sys/platform/pc64/isa/asc.c +++ b/sys/platform/pc64/isa/asc.c @@ -48,7 +48,6 @@ #include #include #include -#include #include #include @@ -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 diff --git a/sys/sys/event.h b/sys/sys/event.h index 28aed8ca5f..8a1079b511 100644 --- a/sys/sys/event.h +++ b/sys/sys/event.h @@ -33,6 +33,9 @@ #ifndef _SYS_TYPES_H_ #include #endif +#ifndef _NET_NETISR_H_ +#include /* 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 */ diff --git a/sys/sys/eventvar.h b/sys/sys/eventvar.h index b96256c1ec..bba0d27703 100644 --- a/sys/sys/eventvar.h +++ b/sys/sys/eventvar.h @@ -42,9 +42,6 @@ #ifndef _SYS_EVENT_H_ #include #endif -#ifndef _SYS_SELINFO_H_ -#include -#endif #ifndef _SYS_FILEDESC_H_ #include #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 */ diff --git a/sys/sys/mqueue.h b/sys/sys/mqueue.h index a935d7e95a..21d6000128 100644 --- a/sys/sys/mqueue.h +++ b/sys/sys/mqueue.h @@ -49,7 +49,7 @@ struct mq_attr { #include #include #include -#include +#include #include /* @@ -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 */ diff --git a/sys/sys/pipe.h b/sys/sys/pipe.h index 469b008802..c5de382916 100644 --- a/sys/sys/pipe.h +++ b/sys/sys/pipe.h @@ -33,8 +33,8 @@ #ifndef _SYS_TIME_H_ #include /* for struct timespec */ #endif -#ifndef _SYS_SELINFO_H_ -#include /* for struct selinfo */ +#ifndef _SYS_EVENT_H_ +#include /* for struct kqinfo */ #endif #ifndef _SYS_XIO_H_ #include /* 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 index 71d52a839f..0000000000 --- a/sys/sys/selinfo.h +++ /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 - -#include /* for struct klist */ -#include /* 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_ */ diff --git a/sys/sys/socketvar.h b/sys/sys/socketvar.h index 1bf8e02fe1..cc999e66e1 100644 --- a/sys/sys/socketvar.h +++ b/sys/sys/socketvar.h @@ -44,8 +44,8 @@ #ifndef _SYS_QUEUE_H_ #include /* for TAILQ macros */ #endif -#ifndef _SYS_SELINFO_H_ -#include /* for struct selinfo */ +#ifndef _SYS_EVENT_H_ +#include /* for struct kqinfo */ #endif #ifndef _SYS_SOCKBUF_H_ #include @@ -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 { \ diff --git a/sys/sys/tty.h b/sys/sys/tty.h index 99c5dfc9b3..4d0c993a3f 100644 --- a/sys/sys/tty.h +++ b/sys/sys/tty.h @@ -46,8 +46,8 @@ #ifndef _SYS_TERMIOS_H_ #include #endif -#ifndef _SYS_SELINFO_H_ -#include +#ifndef _SYS_EVENT_H_ +#include #endif #ifdef _KERNEL #include @@ -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. */ diff --git a/sys/sys/vnode.h b/sys/sys/vnode.h index e4ff7a5b4b..98f287298d 100644 --- a/sys/sys/vnode.h +++ b/sys/sys/vnode.h @@ -46,8 +46,8 @@ #ifndef _SYS_LOCK_H_ #include #endif -#ifndef _SYS_SELINFO_H_ -#include +#ifndef _SYS_EVENT_H_ +#include #endif #ifndef _SYS_BIOTRACK_H_ #include @@ -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 */ diff --git a/sys/vfs/gnu/ext2fs/ext2_vnops.c b/sys/vfs/gnu/ext2fs/ext2_vnops.c index 058ce0c8b2..e4efbdc461 100644 --- a/sys/vfs/gnu/ext2fs/ext2_vnops.c +++ b/sys/vfs/gnu/ext2fs/ext2_vnops.c @@ -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); } diff --git a/sys/vfs/hammer/hammer_vnops.c b/sys/vfs/hammer/hammer_vnops.c index 226ba7df1c..9d1dabf8fd 100644 --- a/sys/vfs/hammer/hammer_vnops.c +++ b/sys/vfs/hammer/hammer_vnops.c @@ -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); } diff --git a/sys/vfs/ufs/ufs_readwrite.c b/sys/vfs/ufs/ufs_readwrite.c index cced082738..aa438568de 100644 --- a/sys/vfs/ufs/ufs_readwrite.c +++ b/sys/vfs/ufs/ufs_readwrite.c @@ -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); diff --git a/sys/vfs/ufs/ufs_vnops.c b/sys/vfs/ufs/ufs_vnops.c index 94d5eaae1c..cc205317c0 100644 --- a/sys/vfs/ufs/ufs_vnops.c +++ b/sys/vfs/ufs/ufs_vnops.c @@ -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); } -- 2.41.0