Date: Tue, 21 Jul 2015 14:21:33 GMT From: stefano@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r288619 - in soc2015/stefano/ptnetmap/stable/10/sys: dev/netmap modules/netmap net Message-ID: <201507211421.t6LELX3G082686@socsvn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: stefano Date: Tue Jul 21 14:21:33 2015 New Revision: 288619 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=288619 Log: add ptnetmap host and kthread support for FreeBSD Modified: soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/netmap_freebsd.c soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/netmap_kern.h soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/netmap_mem2.c soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/netmap_virt.h soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/ptnetmap.c soc2015/stefano/ptnetmap/stable/10/sys/modules/netmap/Makefile soc2015/stefano/ptnetmap/stable/10/sys/net/netmap.h Modified: soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/netmap_freebsd.c ============================================================================== --- soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/netmap_freebsd.c Tue Jul 21 14:19:50 2015 (r288618) +++ soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/netmap_freebsd.c Tue Jul 21 14:21:33 2015 (r288619) @@ -50,6 +50,10 @@ #include <sys/malloc.h> #include <sys/socket.h> /* sockaddrs */ #include <sys/selinfo.h> +#include <sys/kthread.h> /* kthread_add() */ +#include <sys/proc.h> /* PROC_LOCK() */ +#include <sys/unistd.h> /* RFNOWAIT */ +#include <sys/sched.h> /* sched_bind() */ #include <net/if.h> #include <net/if_var.h> #include <net/if_types.h> /* IFT_ETHER */ @@ -535,7 +539,7 @@ *nm_paddr = rman_get_start(ptn_dev->pci_mem); *nm_addr = rman_get_virtual(ptn_dev->pci_mem); - D("=== BAR %d start %llx len %llx mem_size %x ===", + D("=== BAR %d start %lx len %lx mem_size %x ===", PTNETMAP_MEM_PCI_BAR, *nm_paddr, rman_get_size(ptn_dev->pci_mem), @@ -892,6 +896,215 @@ return 0; } +/******************** kthread wrapper ****************/ +struct nm_kthread_ctx { + void *ioevent_file; + void *irq_file; +#if 0 /* to be dane after eventfd implementation */ + /* files to exchange notifications */ + struct file *ioevent_file; /* notification from guest */ + struct file *irq_file; /* notification to guest (interrupt) */ + struct eventfd_ctx *irq_ctx; + + /* poll ioeventfd to receive notification from the guest */ + poll_table poll_table; + wait_queue_head_t *waitq_head; + wait_queue_t waitq; +#endif /* 0 */ + + /* worker function and parameter */ + nm_kthread_worker_fn_t worker_fn; + void *worker_private; + + struct nm_kthread *nmk; + + /* integer to manage multiple worker contexts (e.g., RX or TX on ptnetmap) */ + long type; +}; + +struct nm_kthread { + //struct mm_struct *mm; + struct thread *worker; + struct mtx worker_lock; + uint64_t scheduled; /* currently not used */ + struct nm_kthread_ctx worker_ctx; + int affinity; +}; + +void inline +nm_kthread_wakeup_worker(struct nm_kthread *nmk) +{ + (void)nmk; +} + +void inline +nm_kthread_send_irq(struct nm_kthread *nmk) +{ + (void)nmk; +} + +static +int is_suspended(void) +{ + struct proc *p; + struct thread *td; + int ret = 0; + + td = curthread; + p = td->td_proc; + + if ((td->td_pflags & TDP_KTHREAD) == 0) + panic("%s: curthread is not a valid kthread", __func__); + PROC_LOCK(p); + if (td->td_flags & TDF_KTH_SUSP) { + wakeup(&td->td_flags); + //msleep(&td->td_flags, &p->p_mtx, PPAUSE, "ktsusp", 0); + ret = 1; + } + PROC_UNLOCK(p); + return ret; +} + +static void +nm_kthread_worker(void *data) +{ + struct nm_kthread *nmk = data; + struct nm_kthread_ctx *ctx = &nmk->worker_ctx; + + thread_lock(curthread); + if (nmk->affinity >= 0) + sched_bind(curthread, nmk->affinity); + thread_unlock(curthread); + for (; !is_suspended();) { + if (nmk->worker == NULL) + break; + ctx->worker_fn(ctx->worker_private); /* worker_body */ + } + kthread_exit(); +} + +static int +nm_kthread_open_files(struct nm_kthread *nmk, struct nm_eventfd_cfg_ring *ring_cfg) +{ + (void)nmk; + (void)ring_cfg; + return 0; +} + +static void +nm_kthread_close_files(struct nm_kthread *nmk) +{ + (void)nmk; +} + +static void +nm_kthread_init_poll(struct nm_kthread *nmk, struct nm_kthread_ctx *ctx) +{ + (void)nmk; + (void)ctx; + return; +} + +static int +nm_kthread_start_poll(struct nm_kthread_ctx *ctx, void *file) +{ + (void)ctx; + (void)file; + return 0; +} + +static void +nm_kthread_stop_poll(struct nm_kthread_ctx *ctx) +{ + (void)ctx; +} + +void +nm_kthread_set_affinity(struct nm_kthread *nmk, int affinity) +{ + nmk->affinity = affinity; +} + +struct nm_kthread * +nm_kthread_create(struct nm_kthread_cfg *cfg) +{ + struct nm_kthread *nmk = NULL; + int error; + + nmk = malloc(sizeof(*nmk), M_DEVBUF, M_NOWAIT | M_ZERO); + if (!nmk) + return NULL; + + mtx_init(&nmk->worker_lock, "nm_kthread lock", NULL, MTX_DEF); + nmk->worker_ctx.worker_fn = cfg->worker_fn; + nmk->worker_ctx.worker_private = cfg->worker_private; + nmk->worker_ctx.type = cfg->type; + nmk->affinity = -1; + + /* open event fd */ + error = nm_kthread_open_files(nmk, &cfg->ring); + if (error) + goto err; + nm_kthread_init_poll(nmk, &nmk->worker_ctx); + + return nmk; +err: + free(nmk, M_DEVBUF); + return NULL; +} + +int +nm_kthread_start(struct nm_kthread *nmk) +{ + int error = 0; + + if (nmk->worker) { + return EBUSY; + } + + error = kthread_add(nm_kthread_worker, nmk, curproc, + &nmk->worker, RFNOWAIT /* to be checked */, 0, "nm-kthread-%ld", + nmk->worker_ctx.type); + if (error) + goto err; + D("started td 0x%p", nmk->worker); + + error = nm_kthread_start_poll(&nmk->worker_ctx, nmk->worker_ctx.ioevent_file); + if (error) + goto err_kstop; + return 0; +err_kstop: + kthread_suspend(nmk->worker, 0); +err: + nmk->worker = NULL; + return error; +} + +void +nm_kthread_stop(struct nm_kthread *nmk) +{ + if (!nmk->worker) { + return; + } + nm_kthread_stop_poll(&nmk->worker_ctx); + kthread_suspend(nmk->worker, 100); + nmk->worker = NULL; +} + +void +nm_kthread_delete(struct nm_kthread *nmk) +{ + if (!nmk) + return; + if (nmk->worker) { + nm_kthread_stop(nmk); + } + + nm_kthread_close_files(nmk); + + free(nmk, M_DEVBUF); +} + /******************** kqueue support ****************/ /* Modified: soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/netmap_kern.h ============================================================================== --- soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/netmap_kern.h Tue Jul 21 14:19:50 2015 (r288618) +++ soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/netmap_kern.h Tue Jul 21 14:21:33 2015 (r288619) @@ -62,8 +62,8 @@ #define WITH_PIPES #define WITH_MONITOR #define WITH_GENERIC -//#define WITH_PTNETMAP_HOST /* ptnetmap host not supported in FreeBSD */ -#define WITH_PTNETMAP_GUEST +#define WITH_PTNETMAP_HOST /* ptnetmap host support */ +#define WITH_PTNETMAP_GUEST /* ptnetmap guest support */ #endif @@ -1753,6 +1753,26 @@ void nm_vi_detach(struct ifnet *); void nm_vi_init_index(void); +/* + * kernel thread routines + */ +struct nm_kthread; /* OS-specific kthread - opaque */ +typedef void (*nm_kthread_worker_fn_t)(void *data); +/* kthread configuration */ +struct nm_kthread_cfg { + long type; /* kthread type */ + struct nm_eventfd_cfg_ring ring; /* ring event fd */ + nm_kthread_worker_fn_t worker_fn; /* worker function */ + void *worker_private; /* worker parameter */ +}; +/* kthread configuration */ +struct nm_kthread *nm_kthread_create(struct nm_kthread_cfg *cfg); +int nm_kthread_start(struct nm_kthread *); +void nm_kthread_stop(struct nm_kthread *); +void nm_kthread_delete(struct nm_kthread *); +void nm_kthread_wakeup_worker(struct nm_kthread *nmk); +void nm_kthread_send_irq(struct nm_kthread *); +void nm_kthread_set_affinity(struct nm_kthread *, int); #ifdef WITH_PTNETMAP_HOST /* Modified: soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/netmap_mem2.c ============================================================================== --- soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/netmap_mem2.c Tue Jul 21 14:19:50 2015 (r288618) +++ soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/netmap_mem2.c Tue Jul 21 14:21:33 2015 (r288619) @@ -1764,7 +1764,7 @@ } } - vaddr = (char *)(pv->nm_addr + nms_info->buf_pool_offset); + vaddr = (char *)(pv->nm_addr) + nms_info->buf_pool_offset; paddr = pv->nm_paddr + nms_info->buf_pool_offset; for (i = 0; i < nbuffers; i++) { @@ -1901,7 +1901,7 @@ { struct netmap_mem_ptg *pv = (struct netmap_mem_ptg *)nmd; - return vaddr - pv->nm_addr; + return (const char *)(vaddr) - (char *)(pv->nm_addr); } static void @@ -1932,7 +1932,7 @@ if (csb == NULL) return NULL; - return (struct netmap_if *)(pv->nm_addr + csb->nifp_offset); + return (struct netmap_if *)((char *)(pv->nm_addr) + csb->nifp_offset); } static void @@ -1961,7 +1961,7 @@ NMA_LOCK(na->nm_mem); /* point each kring to the corresponding backend ring */ - nifp = (struct netmap_if *)(pv->nm_addr + csb->nifp_offset); + nifp = (struct netmap_if *)((char *)pv->nm_addr + csb->nifp_offset); for (i = 0; i <= na->num_tx_rings; i++) { struct netmap_kring *kring = na->tx_rings + i; if (kring->ring) Modified: soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/netmap_virt.h ============================================================================== --- soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/netmap_virt.h Tue Jul 21 14:19:50 2015 (r288618) +++ soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/netmap_virt.h Tue Jul 21 14:21:33 2015 (r288619) @@ -179,11 +179,6 @@ /* * Structures used for ptnetmap configuration */ -struct ptnetmap_cfg_ring { - uint32_t ioeventfd; - uint32_t irqfd; -}; - /* * struct ptnetmap_cfg overlaps struct nmreq * from nr_offset field, but nr_cmd is required in netmap_ioctl() @@ -195,8 +190,8 @@ uint32_t features; #define PTNETMAP_CFG_FEAT_CSB 0x0001 #define PTNETMAP_CFG_FEAT_EVENTFD 0x0002 - struct ptnetmap_cfg_ring tx_ring; - struct ptnetmap_cfg_ring rx_ring; + struct nm_eventfd_cfg_ring tx_ring; + struct nm_eventfd_cfg_ring rx_ring; uint8_t pad[2]; /* padding to overlap strct nmreq */ uint16_t nr_cmd; /* needed in netmap_ioctl() */ void *csb; /* CSB */ @@ -275,21 +270,6 @@ #ifdef WITH_PTNETMAP_HOST /* ptnetmap kernel thread routines */ enum ptn_kthread_t { PTK_RX = 0, PTK_TX = 1 }; /* kthread type */ -struct ptn_kthread; /* ptnetmap kthread - opaque */ -typedef void (*ptn_kthread_worker_fn_t)(void *data); -/* ptnetmap kthread configuration */ -struct ptn_kthread_cfg { - enum ptn_kthread_t type; /* kthread TX or RX */ - struct ptnetmap_cfg_ring ring; /* ring event fd */ - ptn_kthread_worker_fn_t worker_fn; /* worker function */ - void *worker_private; /* worker parameter */ -}; -struct ptn_kthread *ptn_kthread_create(struct ptn_kthread_cfg *); -int ptn_kthread_start(struct ptn_kthread *); -void ptn_kthread_stop(struct ptn_kthread *); -void ptn_kthread_delete(struct ptn_kthread *); -void ptn_kthread_wakeup_worker(struct ptn_kthread *ptk); -void ptn_kthread_send_irq(struct ptn_kthread *); /* Functions to read and write CSB fields in the host */ #if defined (linux) Modified: soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/ptnetmap.c ============================================================================== --- soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/ptnetmap.c Tue Jul 21 14:19:50 2015 (r288618) +++ soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/ptnetmap.c Tue Jul 21 14:21:33 2015 (r288619) @@ -1,8 +1,23 @@ /* * common headers */ +#if defined(__FreeBSD__) +#include <sys/cdefs.h> +#include <sys/param.h> +#include <sys/kernel.h> +#include <sys/types.h> +#include <sys/selinfo.h> +#include <sys/socket.h> +#include <net/if.h> +#include <net/if_var.h> +#include <machine/bus.h> +#define usleep_range(_1, _2) pause("ptnetmap-sleep", _1 * hz / 1000000) + +#elif defined(linux) #include <bsd_glue.h> +#endif + #include <net/netmap.h> #include <dev/netmap/netmap_kern.h> #include <dev/netmap/netmap_virt.h> @@ -11,9 +26,10 @@ #ifdef WITH_PTNETMAP_HOST #define PTN_RX_NOWORK_CYCLE 10 /* RX cycle without receive any packets */ -#define PTN_TX_BATCH_LIM ((nkr_num_slots >> 1)) /* Limit Batch TX to half ring */ +//#define PTN_TX_BATCH_LIM ((nkr_num_slots >> 1)) /* Limit Batch TX to half ring */ #define PTN_AVOID_NM_PROLOGUE /* XXX: avoid nm_*sync_prologue() */ +#define BUSY_WAIT #define DEBUG /* Enables communication debugging. */ #ifdef DEBUG @@ -113,7 +129,7 @@ #endif /* RATE */ struct ptnetmap_state { - struct ptn_kthread *ptk_tx, *ptk_rx; /* kthreads pointers */ + struct nm_kthread *ptk_tx, *ptk_rx; /* kthreads pointers */ struct ptnetmap_cfg config; /* rings configuration */ struct paravirt_csb __user *csb; /* shared page with the guest */ @@ -129,12 +145,13 @@ static inline void ptnetmap_kring_dump(const char *title, const struct netmap_kring *kring) { - D("%s - name: %s hwcur: %d hwtail: %d rhead: %d rcur: %d rtail: %d head: %d cur: %d tail: %d", + RD(1, "%s - name: %s hwcur: %d hwtail: %d rhead: %d rcur: %d rtail: %d head: %d cur: %d tail: %d", title, kring->name, kring->nr_hwcur, kring->nr_hwtail, kring->rhead, kring->rcur, kring->rtail, kring->ring->head, kring->ring->cur, kring->ring->tail); } +#if 0 static inline void ptnetmap_ring_reinit(struct netmap_kring *kring, uint32_t g_head, uint32_t g_cur) { @@ -148,7 +165,7 @@ netmap_ring_reinit(kring); ptnetmap_kring_dump("kring reinit", kring); } - +#endif /* * TX functions to set/get and to handle host/guest kick. @@ -191,7 +208,9 @@ uint32_t g_cur, g_head, g_flags = 0; /* guest variables; init for compiler */ uint32_t nkr_num_slots; bool work = false; +#ifdef PTN_TX_BATCH_LIM int batch; +#endif IFRATE(uint32_t pre_tail;) if (unlikely(!pts)) { @@ -200,7 +219,7 @@ } if (unlikely(!pts->pth_na || pts->stopped || !pts->configured)) { - D("backend netmap is not configured or stopped"); + RD(1, "backend netmap is not configured or stopped"); goto leave; } @@ -282,13 +301,12 @@ if (unlikely(netmap_verbose & NM_VERB_TXSYNC)) ptnetmap_kring_dump("post txsync", kring); -//#define BUSY_WAIT #ifndef BUSY_WAIT /* Send kick to the guest if it needs them */ if (work && ptnetmap_tx_get_guestkick(csb)) { /* Disable guest kick to avoid sending unnecessary kicks */ ptnetmap_tx_set_guestkick(csb, 0); - ptn_kthread_send_irq(pts->ptk_tx); + nm_kthread_send_irq(pts->ptk_tx); IFRATE(pts->rate_ctx.new.htxk++); work = false; } @@ -337,7 +355,7 @@ /* Send kick to the guest if it needs them */ if (work && ptnetmap_tx_get_guestkick(csb)) { ptnetmap_tx_set_guestkick(csb, 0); - ptn_kthread_send_irq(pts->ptk_tx); + nm_kthread_send_irq(pts->ptk_tx); IFRATE(pts->rate_ctx.new.htxk++); } } @@ -380,11 +398,13 @@ * ring is full * We need to wait that the guest gets some packets from the ring and then it notifies us. */ +#ifndef BUSY_WAIT static inline int ptnetmap_kr_rxfull(struct netmap_kring *kring, uint32_t g_head) { return (ACCESS_ONCE(kring->nr_hwtail) == nm_prev(g_head, kring->nkr_num_slots - 1)); } +#endif /* !BUSY_WAIT */ /* Handle RX events: from the guest or from the backend */ static void @@ -406,7 +426,7 @@ } if (unlikely(!pts->pth_na || pts->stopped || !pts->configured)) { - D("backend netmap is not configured or stopped"); + RD(1, "backend netmap is not configured or stopped"); goto leave; } @@ -479,7 +499,7 @@ if (work && ptnetmap_rx_get_guestkick(csb)) { /* Disable guest kick to avoid sending unnecessary kicks */ ptnetmap_rx_set_guestkick(csb, 0); - ptn_kthread_send_irq(pts->ptk_rx); + nm_kthread_send_irq(pts->ptk_rx); IFRATE(pts->rate_ctx.new.hrxk++); work = false; } @@ -529,7 +549,7 @@ /* Send kick to the guest if it needs them */ if (work && ptnetmap_rx_get_guestkick(csb)) { ptnetmap_rx_set_guestkick(csb, 0); - ptn_kthread_send_irq(pts->ptk_rx); + nm_kthread_send_irq(pts->ptk_rx); IFRATE(pts->rate_ctx.new.hrxk++); } } @@ -540,7 +560,7 @@ if (unlikely(!pts)) return; ND("TX notify"); - ptn_kthread_wakeup_worker(pts->ptk_tx); + nm_kthread_wakeup_worker(pts->ptk_tx); IFRATE(pts->rate_ctx.new.btxwu++); } @@ -549,7 +569,7 @@ if (unlikely(!pts)) return; ND("RX notify"); - ptn_kthread_wakeup_worker(pts->ptk_rx); + nm_kthread_wakeup_worker(pts->ptk_rx); IFRATE(pts->rate_ctx.new.brxwu++); } @@ -614,24 +634,24 @@ static int ptnetmap_create_kthreads(struct ptnetmap_state *pts) { - struct ptn_kthread_cfg ptk_cfg; + struct nm_kthread_cfg nmk_cfg; - ptk_cfg.worker_private = pts; + nmk_cfg.worker_private = pts; /* TX kthread */ - ptk_cfg.type = PTK_TX; - ptk_cfg.ring = pts->config.tx_ring; - ptk_cfg.worker_fn = ptnetmap_tx_handler; - pts->ptk_tx = ptn_kthread_create(&ptk_cfg); + nmk_cfg.type = PTK_TX; + nmk_cfg.ring = pts->config.tx_ring; + nmk_cfg.worker_fn = ptnetmap_tx_handler; + pts->ptk_tx = nm_kthread_create(&nmk_cfg); if (pts->ptk_tx == NULL) { goto err; } /* RX kthread */ - ptk_cfg.type = PTK_RX; - ptk_cfg.ring = pts->config.rx_ring; - ptk_cfg.worker_fn = ptnetmap_rx_handler; - pts->ptk_rx = ptn_kthread_create(&ptk_cfg); + nmk_cfg.type = PTK_RX; + nmk_cfg.ring = pts->config.rx_ring; + nmk_cfg.worker_fn = ptnetmap_rx_handler; + pts->ptk_rx = nm_kthread_create(&nmk_cfg); if (pts->ptk_rx == NULL) { goto err; } @@ -639,7 +659,7 @@ return 0; err: if (pts->ptk_tx) { - ptn_kthread_delete(pts->ptk_tx); + nm_kthread_delete(pts->ptk_tx); pts->ptk_tx = NULL; } return EFAULT; @@ -659,14 +679,16 @@ pts->stopped = false; /* TX kthread */ - error = ptn_kthread_start(pts->ptk_tx); + //nm_kthread_set_affinity(pts->ptk_tx, 2); + error = nm_kthread_start(pts->ptk_tx); if (error) { return error; } /* RX kthread */ - error = ptn_kthread_start(pts->ptk_rx); + //nm_kthread_set_affinity(pts->ptk_tx, 3); + error = nm_kthread_start(pts->ptk_rx); if (error) { - ptn_kthread_stop(pts->ptk_tx); + nm_kthread_stop(pts->ptk_tx); return error; } @@ -683,9 +705,9 @@ pts->stopped = true; /* TX kthread */ - ptn_kthread_stop(pts->ptk_tx); + nm_kthread_stop(pts->ptk_tx); /* RX kthread */ - ptn_kthread_stop(pts->ptk_rx); + nm_kthread_stop(pts->ptk_rx); } static int nm_pt_host_notify(struct netmap_kring *, int); @@ -796,8 +818,8 @@ pts->configured = false; /* delete kthreads */ - ptn_kthread_delete(pts->ptk_tx); - ptn_kthread_delete(pts->ptk_rx); + nm_kthread_delete(pts->ptk_tx); + nm_kthread_delete(pts->ptk_rx); IFRATE(del_timer(&pts->rate_ctx.timer)); Modified: soc2015/stefano/ptnetmap/stable/10/sys/modules/netmap/Makefile ============================================================================== --- soc2015/stefano/ptnetmap/stable/10/sys/modules/netmap/Makefile Tue Jul 21 14:19:50 2015 (r288618) +++ soc2015/stefano/ptnetmap/stable/10/sys/modules/netmap/Makefile Tue Jul 21 14:21:33 2015 (r288619) @@ -10,7 +10,7 @@ .PATH.h: ${.CURDIR}/../../net CFLAGS += -I${.CURDIR}/../../ KMOD = netmap -SRCS = device_if.h bus_if.h opt_netmap.h +SRCS = device_if.h bus_if.h pci_if.h opt_netmap.h SRCS += netmap.c netmap.h netmap_kern.h SRCS += netmap_mem2.c netmap_mem2.h SRCS += netmap_generic.c @@ -20,7 +20,7 @@ SRCS += netmap_offloadings.c SRCS += netmap_pipe.c SRCS += netmap_monitor.c -SRCS += ptnetmap_freebsd.c +SRCS += ptnetmap.c SRCS += opt_inet.h opt_inet6.h .include <bsd.kmod.mk> Modified: soc2015/stefano/ptnetmap/stable/10/sys/net/netmap.h ============================================================================== --- soc2015/stefano/ptnetmap/stable/10/sys/net/netmap.h Tue Jul 21 14:19:50 2015 (r288618) +++ soc2015/stefano/ptnetmap/stable/10/sys/net/netmap.h Tue Jul 21 14:21:33 2015 (r288619) @@ -563,4 +563,12 @@ char nifr_name[IFNAMSIZ]; char data[NM_IFRDATA_LEN]; }; + +/* + * kernel thread config + */ +struct nm_eventfd_cfg_ring { + uint32_t ioeventfd; + uint32_t irqfd; +}; #endif /* _NET_NETMAP_H_ */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201507211421.t6LELX3G082686>