diff options
author | Visa Hankala <visa@cvs.openbsd.org> | 2020-01-28 16:26:10 +0000 |
---|---|---|
committer | Visa Hankala <visa@cvs.openbsd.org> | 2020-01-28 16:26:10 +0000 |
commit | 754e9c79bbe9e0d7c7b3a931a581db36adbbc2e5 (patch) | |
tree | 097fc53b45e0f3df8ffdfdb736fd254273ae3c85 | |
parent | 8ce4aa7d98c28abf4ad12e7b585544453f466559 (diff) |
Simplify filterops routines where klist_invalidate() is used.
klist_invalidate() detaches knotes from the list and rewires them
synchronously so that the original filterops routines do not get
called after the invalidation.
OK anton@, mpi@
-rw-r--r-- | sys/net/if_pppx.c | 42 | ||||
-rw-r--r-- | sys/net/if_tun.c | 38 | ||||
-rw-r--r-- | sys/net/switchctl.c | 13 |
3 files changed, 16 insertions, 77 deletions
diff --git a/sys/net/if_pppx.c b/sys/net/if_pppx.c index 112fac18788..7ffc4903a57 100644 --- a/sys/net/if_pppx.c +++ b/sys/net/if_pppx.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_pppx.c,v 1.73 2020/01/24 06:42:13 jsg Exp $ */ +/* $OpenBSD: if_pppx.c,v 1.74 2020/01/28 16:26:09 visa Exp $ */ /* * Copyright (c) 2010 Claudio Jeker <claudio@openbsd.org> @@ -541,9 +541,6 @@ filt_pppx_rdetach(struct knote *kn) struct pppx_dev *pxd = (struct pppx_dev *)kn->kn_hook; struct klist *klist = &pxd->pxd_rsel.si_note; - if (ISSET(kn->kn_status, KN_DETACHED)) - return; - mtx_enter(&pxd->pxd_rsel_mtx); SLIST_REMOVE(klist, kn, knote, kn_selnext); mtx_leave(&pxd->pxd_rsel_mtx); @@ -554,11 +551,6 @@ filt_pppx_read(struct knote *kn, long hint) { struct pppx_dev *pxd = (struct pppx_dev *)kn->kn_hook; - if (ISSET(kn->kn_status, KN_DETACHED)) { - kn->kn_data = 0; - return (1); - } - kn->kn_data = mq_hdatalen(&pxd->pxd_svcq); return (kn->kn_data > 0); @@ -570,9 +562,6 @@ filt_pppx_wdetach(struct knote *kn) struct pppx_dev *pxd = (struct pppx_dev *)kn->kn_hook; struct klist *klist = &pxd->pxd_wsel.si_note; - if (ISSET(kn->kn_status, KN_DETACHED)) - return; - mtx_enter(&pxd->pxd_wsel_mtx); SLIST_REMOVE(klist, kn, knote, kn_selnext); mtx_leave(&pxd->pxd_wsel_mtx); @@ -1462,14 +1451,8 @@ pppackqfilter(dev_t dev, struct knote *kn) static void filt_pppac_rdetach(struct knote *kn) { - struct pppac_softc *sc; - struct klist *klist; - - if (ISSET(kn->kn_status, KN_DETACHED)) - return; - - sc = kn->kn_hook; - klist = &sc->sc_rsel.si_note; + struct pppac_softc *sc = kn->kn_hook; + struct klist *klist = &sc->sc_rsel.si_note; mtx_enter(&sc->sc_rsel_mtx); SLIST_REMOVE(klist, kn, knote, kn_selnext); @@ -1479,14 +1462,7 @@ filt_pppac_rdetach(struct knote *kn) static int filt_pppac_read(struct knote *kn, long hint) { - struct pppac_softc *sc; - - if (ISSET(kn->kn_status, KN_DETACHED)) { - kn->kn_data = 0; - return (1); - } - - sc = kn->kn_hook; + struct pppac_softc *sc = kn->kn_hook; kn->kn_data = mq_hdatalen(&sc->sc_mq); @@ -1496,14 +1472,8 @@ filt_pppac_read(struct knote *kn, long hint) static void filt_pppac_wdetach(struct knote *kn) { - struct pppac_softc *sc; - struct klist *klist; - - if (ISSET(kn->kn_status, KN_DETACHED)) - return; - - sc = kn->kn_hook; - klist = &sc->sc_wsel.si_note; + struct pppac_softc *sc = kn->kn_hook; + struct klist *klist = &sc->sc_wsel.si_note; mtx_enter(&sc->sc_wsel_mtx); SLIST_REMOVE(klist, kn, knote, kn_selnext); diff --git a/sys/net/if_tun.c b/sys/net/if_tun.c index f853e76a4cd..7497db8cfea 100644 --- a/sys/net/if_tun.c +++ b/sys/net/if_tun.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_tun.c,v 1.214 2020/01/27 11:00:44 dlg Exp $ */ +/* $OpenBSD: if_tun.c,v 1.215 2020/01/28 16:26:09 visa Exp $ */ /* $NetBSD: if_tun.c,v 1.24 1996/05/07 02:40:48 thorpej Exp $ */ /* @@ -1015,28 +1015,18 @@ void filt_tunrdetach(struct knote *kn) { int s; - struct tun_softc *sc; + struct tun_softc *sc = kn->kn_hook; - sc = (struct tun_softc *)kn->kn_hook; s = splhigh(); - if (!(kn->kn_status & KN_DETACHED)) - SLIST_REMOVE(&sc->sc_rsel.si_note, kn, knote, kn_selnext); + SLIST_REMOVE(&sc->sc_rsel.si_note, kn, knote, kn_selnext); splx(s); } int filt_tunread(struct knote *kn, long hint) { - struct tun_softc *sc; - struct ifnet *ifp; - - if (kn->kn_status & KN_DETACHED) { - kn->kn_data = 0; - return (1); - } - - sc = (struct tun_softc *)kn->kn_hook; - ifp = &sc->sc_if; + struct tun_softc *sc = kn->kn_hook; + struct ifnet *ifp = &sc->sc_if; kn->kn_data = ifq_hdatalen(&ifp->if_snd); @@ -1047,28 +1037,18 @@ void filt_tunwdetach(struct knote *kn) { int s; - struct tun_softc *sc; + struct tun_softc *sc = kn->kn_hook; - sc = (struct tun_softc *)kn->kn_hook; s = splhigh(); - if (!(kn->kn_status & KN_DETACHED)) - SLIST_REMOVE(&sc->sc_wsel.si_note, kn, knote, kn_selnext); + SLIST_REMOVE(&sc->sc_wsel.si_note, kn, knote, kn_selnext); splx(s); } int filt_tunwrite(struct knote *kn, long hint) { - struct tun_softc *sc; - struct ifnet *ifp; - - if (kn->kn_status & KN_DETACHED) { - kn->kn_data = 0; - return (1); - } - - sc = (struct tun_softc *)kn->kn_hook; - ifp = &sc->sc_if; + struct tun_softc *sc = kn->kn_hook; + struct ifnet *ifp = &sc->sc_if; kn->kn_data = ifp->if_hdrlen + ifp->if_hardmtu; diff --git a/sys/net/switchctl.c b/sys/net/switchctl.c index a3b51481bd5..88a212afc5a 100644 --- a/sys/net/switchctl.c +++ b/sys/net/switchctl.c @@ -1,4 +1,4 @@ -/* $OpenBSD: switchctl.c,v 1.18 2019/12/31 13:48:32 visa Exp $ */ +/* $OpenBSD: switchctl.c,v 1.19 2020/01/28 16:26:09 visa Exp $ */ /* * Copyright (c) 2016 Kazuya GODA <goda@openbsd.org> @@ -420,9 +420,6 @@ filt_switch_rdetach(struct knote *kn) struct switch_softc *sc = (struct switch_softc *)kn->kn_hook; struct klist *klist = &sc->sc_swdev->swdev_rsel.si_note; - if (ISSET(kn->kn_status, KN_DETACHED)) - return; - SLIST_REMOVE(klist, kn, knote, kn_selnext); } @@ -431,11 +428,6 @@ filt_switch_read(struct knote *kn, long hint) { struct switch_softc *sc = (struct switch_softc *)kn->kn_hook; - if (ISSET(kn->kn_status, KN_DETACHED)) { - kn->kn_data = 0; - return (1); - } - if (!mq_empty(&sc->sc_swdev->swdev_outq) || sc->sc_swdev->swdev_lastm != NULL) { kn->kn_data = mq_len(&sc->sc_swdev->swdev_outq) + @@ -452,9 +444,6 @@ filt_switch_wdetach(struct knote *kn) struct switch_softc *sc = (struct switch_softc *)kn->kn_hook; struct klist *klist = &sc->sc_swdev->swdev_wsel.si_note; - if (ISSET(kn->kn_status, KN_DETACHED)) - return; - SLIST_REMOVE(klist, kn, knote, kn_selnext); } |