From f27ed1647073b23246a8f9ca00bdeedef156a069 Mon Sep 17 00:00:00 2001 From: Franco Fichtner Date: Wed, 1 Jan 2014 22:44:26 +0100 Subject: [PATCH] netmap: d_poll -> d_kqfilter netmap_poll() is a monster. No clue how to move it over to the kqfilter API just yet. --- sys/net/netmap/netmap.c | 47 ++++++++++++++++++++++++++++----- sys/net/netmap/netmap_freebsd.c | 4 +-- sys/net/netmap/netmap_kern.h | 3 ++- 3 files changed, 44 insertions(+), 10 deletions(-) diff --git a/sys/net/netmap/netmap.c b/sys/net/netmap/netmap.c index 84ed66296f..b97e524997 100644 --- a/sys/net/netmap/netmap.c +++ b/sys/net/netmap/netmap.c @@ -162,7 +162,6 @@ extern struct dev_ops netmap_cdevsw; #include "netmap_kern.h" #include "netmap_mem2.h" -#define selwakeuppri(x, y) do { } while (0) /* XXX porting in progress */ #define selrecord(x, y) do { } while (0) /* XXX porting in progress */ MALLOC_DEFINE(M_NETMAP, "netmap", "Network memory map"); @@ -1513,6 +1512,40 @@ out: return (error); } +static int +netmap_kqfilter_event(struct knote *kn, long hint) +{ + return (0); +} + +static void +netmap_kqfilter_detach(struct knote *kn) +{ +} + +static struct filterops netmap_kqfilter_ops = { + FILTEROP_ISFD, NULL, netmap_kqfilter_detach, netmap_kqfilter_event, +}; + +int +netmap_kqfilter(struct dev_kqfilter_args *ap) +{ + struct knote *kn = ap->a_kn; + + ap->a_result = 0; + + switch (kn->kn_filter) { + case EVFILT_READ: + case EVFILT_WRITE: + kn->kn_fop = &netmap_kqfilter_ops; + break; + default: + ap->a_result = EOPNOTSUPP; + return (0); + } + + return (0); +} /* * select(2) and poll(2) handlers for the "netmap" device. @@ -1528,7 +1561,7 @@ out: * The first one is remapped to pwait as selrecord() uses the name as an * hidden argument. */ -int +static int netmap_poll(struct cdev *dev, int events, struct thread *td) { struct netmap_priv_d *priv = NULL; @@ -1789,14 +1822,16 @@ netmap_notify(struct netmap_adapter *na, u_int n_ring, enum txrx tx, int flags) if (tx == NR_TX) { kring = na->tx_rings + n_ring; - selwakeuppri(&kring->si, PI_NET); + KNOTE(&kring->si.ki_note, 0); + wakeup(&kring->si.ki_note); if (flags & NAF_GLOBAL_NOTIFY) - selwakeuppri(&na->tx_si, PI_NET); + wakeup(&na->tx_si.ki_note); } else { kring = na->rx_rings + n_ring; - selwakeuppri(&kring->si, PI_NET); + KNOTE(&kring->si.ki_note, 0); + wakeup(&kring->si.ki_note); if (flags & NAF_GLOBAL_NOTIFY) - selwakeuppri(&na->rx_si, PI_NET); + wakeup(&na->rx_si.ki_note); } return 0; } diff --git a/sys/net/netmap/netmap_freebsd.c b/sys/net/netmap/netmap_freebsd.c index 3fbe00222b..b1a58e7440 100644 --- a/sys/net/netmap/netmap_freebsd.c +++ b/sys/net/netmap/netmap_freebsd.c @@ -384,9 +384,7 @@ struct dev_ops netmap_cdevsw = { .d_open = netmap_open, .d_mmap_single = netmap_mmap_single, .d_ioctl = netmap_ioctl, -#if 0 - .d_poll = netmap_poll, -#endif + .d_kqfilter = netmap_kqfilter, .d_close = netmap_close, }; diff --git a/sys/net/netmap/netmap_kern.h b/sys/net/netmap/netmap_kern.h index 15dfbd61a8..fb6654127f 100644 --- a/sys/net/netmap/netmap_kern.h +++ b/sys/net/netmap/netmap_kern.h @@ -664,7 +664,8 @@ int netmap_bdg_ctl(struct nmreq *nmr, bdg_lookup_fn_t func); #endif /* !WITH_VALE */ /* Various prototypes */ -int netmap_poll(struct cdev *dev, int events, struct thread *td); +struct dev_kfilter_args; /* XXX this shouldn't be here */ +int netmap_kqfilter(struct dev_kqfilter_args *ap); int netmap_init(void); -- 2.41.0