Date: Fri, 13 Apr 2012 16:03:08 +0000 (UTC) From: Luigi Rizzo <luigi@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r234227 - in head: sys/dev/netmap sys/net tools/tools/netmap Message-ID: <201204131603.q3DG38gK087221@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: luigi Date: Fri Apr 13 16:03:07 2012 New Revision: 234227 URL: http://svn.freebsd.org/changeset/base/234227 Log: A bit of cleanup in the names of fields of netmap-related structures. Use the name 'ring' instead of 'queue' in all fields. Bump NETMAP_API. Modified: head/sys/dev/netmap/ixgbe_netmap.h head/sys/dev/netmap/netmap.c head/sys/dev/netmap/netmap_kern.h head/sys/dev/netmap/netmap_mem1.c head/sys/net/netmap.h head/sys/net/netmap_user.h head/tools/tools/netmap/bridge.c Modified: head/sys/dev/netmap/ixgbe_netmap.h ============================================================================== --- head/sys/dev/netmap/ixgbe_netmap.h Fri Apr 13 15:43:42 2012 (r234226) +++ head/sys/dev/netmap/ixgbe_netmap.h Fri Apr 13 16:03:07 2012 (r234227) @@ -63,6 +63,9 @@ * This is tricky, much better to use TDH for now. */ SYSCTL_DECL(_dev_netmap); +static int ix_write_len; +SYSCTL_INT(_dev_netmap, OID_AUTO, ix_write_len, + CTLFLAG_RW, &ix_write_len, 0, "write rx len"); static int ix_rx_miss, ix_rx_miss_bufs, ix_use_dd, ix_crcstrip; SYSCTL_INT(_dev_netmap, OID_AUTO, ix_crcstrip, CTLFLAG_RW, &ix_crcstrip, 0, "strip CRC on rx frames"); @@ -121,6 +124,9 @@ set_crcstrip(struct ixgbe_hw *hw, int on hl = IXGBE_READ_REG(hw, IXGBE_HLREG0); rxc = IXGBE_READ_REG(hw, IXGBE_RDRXCTL); + if (netmap_verbose) + D("%s read HLREG 0x%x rxc 0x%x", + onoff ? "enter" : "exit", hl, rxc); /* hw requirements ... */ rxc &= ~IXGBE_RDRXCTL_RSCFRSTSIZE; rxc |= IXGBE_RDRXCTL_RSCACKC; @@ -133,6 +139,9 @@ set_crcstrip(struct ixgbe_hw *hw, int on hl |= IXGBE_HLREG0_RXCRCSTRP; rxc |= IXGBE_RDRXCTL_CRCSTRIP; } + if (netmap_verbose) + D("%s write HLREG 0x%x rxc 0x%x", + onoff ? "enter" : "exit", hl, rxc); IXGBE_WRITE_REG(hw, IXGBE_HLREG0, hl); IXGBE_WRITE_REG(hw, IXGBE_RDRXCTL, rxc); } @@ -479,7 +488,7 @@ ixgbe_netmap_rxsync(struct ifnet *ifp, u * of CRCSTRIP. The data sheets say differently. * Very strange. */ - int crclen = 0; // ix_crcstrip ? 0 : 4; + int crclen = ix_crcstrip ? 0 : 4; l = rxr->next_to_check; j = netmap_idx_n2k(kring, l); @@ -490,6 +499,8 @@ ixgbe_netmap_rxsync(struct ifnet *ifp, u if ((staterr & IXGBE_RXD_STAT_DD) == 0) break; ring->slot[j].len = le16toh(curr->wb.upper.length) - crclen; + if (ix_write_len) + D("rx[%d] len %d", j, ring->slot[j].len); bus_dmamap_sync(rxr->ptag, rxr->rx_buffers[l].pmap, BUS_DMASYNC_POSTREAD); j = (j == lim) ? 0 : j + 1; Modified: head/sys/dev/netmap/netmap.c ============================================================================== --- head/sys/dev/netmap/netmap.c Fri Apr 13 15:43:42 2012 (r234226) +++ head/sys/dev/netmap/netmap.c Fri Apr 13 16:03:07 2012 (r234227) @@ -173,21 +173,21 @@ netmap_dtor_locked(void *data) /* Wake up any sleeping threads. netmap_poll will * then return POLLERR */ - for (i = 0; i < na->num_tx_queues + 1; i++) + for (i = 0; i < na->num_tx_rings + 1; i++) selwakeuppri(&na->tx_rings[i].si, PI_NET); - for (i = 0; i < na->num_rx_queues + 1; i++) + for (i = 0; i < na->num_rx_rings + 1; i++) selwakeuppri(&na->rx_rings[i].si, PI_NET); selwakeuppri(&na->tx_si, PI_NET); selwakeuppri(&na->rx_si, PI_NET); /* release all buffers */ NMA_LOCK(); - for (i = 0; i < na->num_tx_queues + 1; i++) { + for (i = 0; i < na->num_tx_rings + 1; i++) { struct netmap_ring *ring = na->tx_rings[i].ring; lim = na->tx_rings[i].nkr_num_slots; for (j = 0; j < lim; j++) netmap_free_buf(nifp, ring->slot[j].buf_idx); } - for (i = 0; i < na->num_rx_queues + 1; i++) { + for (i = 0; i < na->num_rx_rings + 1; i++) { struct netmap_ring *ring = na->rx_rings[i].ring; lim = na->rx_rings[i].nkr_num_slots; for (j = 0; j < lim; j++) @@ -260,7 +260,7 @@ netmap_mmap(__unused struct cdev *dev, static void netmap_sync_to_host(struct netmap_adapter *na) { - struct netmap_kring *kring = &na->tx_rings[na->num_tx_queues]; + struct netmap_kring *kring = &na->tx_rings[na->num_tx_rings]; struct netmap_ring *ring = kring->ring; struct mbuf *head = NULL, *tail = NULL, *m; u_int k, n, lim = kring->nkr_num_slots - 1; @@ -320,7 +320,7 @@ netmap_sync_to_host(struct netmap_adapte static void netmap_sync_from_host(struct netmap_adapter *na, struct thread *td) { - struct netmap_kring *kring = &na->rx_rings[na->num_rx_queues]; + struct netmap_kring *kring = &na->rx_rings[na->num_rx_rings]; struct netmap_ring *ring = kring->ring; u_int j, n, lim = kring->nkr_num_slots; u_int k = ring->cur, resvd = ring->reserved; @@ -415,7 +415,7 @@ netmap_ring_reinit(struct netmap_kring * } if (errors) { int pos = kring - kring->na->tx_rings; - int n = kring->na->num_tx_queues + 1; + int n = kring->na->num_tx_rings + 1; D("total %d errors", errors); errors++; @@ -443,10 +443,10 @@ netmap_set_ringid(struct netmap_priv_d * u_int i = ringid & NETMAP_RING_MASK; /* initially (np_qfirst == np_qlast) we don't want to lock */ int need_lock = (priv->np_qfirst != priv->np_qlast); - int lim = na->num_rx_queues; + int lim = na->num_rx_rings; - if (na->num_tx_queues > lim) - lim = na->num_tx_queues; + if (na->num_tx_rings > lim) + lim = na->num_tx_rings; if ( (ringid & NETMAP_HW_RING) && i >= lim) { D("invalid ring id %d", i); return (EINVAL); @@ -531,8 +531,8 @@ netmap_ioctl(__unused struct cdev *dev, if (error) break; na = NA(ifp); /* retrieve netmap_adapter */ - nmr->nr_rx_rings = na->num_rx_queues; - nmr->nr_tx_rings = na->num_tx_queues; + nmr->nr_rx_rings = na->num_rx_rings; + nmr->nr_tx_rings = na->num_tx_rings; nmr->nr_rx_slots = na->num_rx_desc; nmr->nr_tx_slots = na->num_tx_desc; if_rele(ifp); /* return the refcount */ @@ -619,8 +619,8 @@ error: } /* return the offset of the netmap_if object */ - nmr->nr_rx_rings = na->num_rx_queues; - nmr->nr_tx_rings = na->num_tx_queues; + nmr->nr_rx_rings = na->num_rx_rings; + nmr->nr_tx_rings = na->num_tx_rings; nmr->nr_rx_slots = na->num_rx_desc; nmr->nr_tx_slots = na->num_tx_desc; nmr->nr_memsize = nm_mem->nm_totalsize; @@ -657,7 +657,7 @@ error: lim = priv->np_qlast; if (lim == NETMAP_HW_RING) lim = (cmd == NIOCTXSYNC) ? - na->num_tx_queues : na->num_rx_queues; + na->num_tx_rings : na->num_rx_rings; for (i = priv->np_qfirst; i < lim; i++) { if (cmd == NIOCTXSYNC) { @@ -742,8 +742,8 @@ netmap_poll(__unused struct cdev *dev, i na = NA(ifp); /* retrieve netmap adapter */ - lim_tx = na->num_tx_queues; - lim_rx = na->num_rx_queues; + lim_tx = na->num_tx_rings; + lim_rx = na->num_rx_rings; /* how many queues we are scanning */ if (priv->np_qfirst == NETMAP_SW_RING) { if (priv->np_txpoll || want_tx) { @@ -965,7 +965,7 @@ netmap_lock_wrapper(struct ifnet *dev, i * kring N+1 is only used for the selinfo for all queues. * Return 0 on success, ENOMEM otherwise. * - * na->num_tx_queues can be set for cards with different tx/rx setups + * na->num_tx_rings can be set for cards with different tx/rx setups */ int netmap_attach(struct netmap_adapter *na, int num_queues) @@ -980,22 +980,21 @@ netmap_attach(struct netmap_adapter *na, } /* clear other fields ? */ na->refcount = 0; - if (na->num_tx_queues == 0) - na->num_tx_queues = num_queues; - na->num_rx_queues = num_queues; + if (na->num_tx_rings == 0) + na->num_tx_rings = num_queues; + na->num_rx_rings = num_queues; /* on each direction we have N+1 resources * 0..n-1 are the hardware rings * n is the ring attached to the stack. */ - n = na->num_rx_queues + na->num_tx_queues + 2; + n = na->num_rx_rings + na->num_tx_rings + 2; size = sizeof(*na) + n * sizeof(struct netmap_kring); buf = malloc(size, M_DEVBUF, M_NOWAIT | M_ZERO); if (buf) { WNA(ifp) = buf; na->tx_rings = (void *)((char *)buf + sizeof(*na)); - na->rx_rings = na->tx_rings + na->num_tx_queues + 1; - na->buff_size = NETMAP_BUF_SIZE; + na->rx_rings = na->tx_rings + na->num_tx_rings + 1; bcopy(na, buf, sizeof(*na)); ifp->if_capabilities |= IFCAP_NETMAP; @@ -1003,9 +1002,9 @@ netmap_attach(struct netmap_adapter *na, if (na->nm_lock == NULL) na->nm_lock = netmap_lock_wrapper; mtx_init(&na->core_lock, "netmap core lock", NULL, MTX_DEF); - for (i = 0 ; i < na->num_tx_queues + 1; i++) + for (i = 0 ; i < na->num_tx_rings + 1; i++) mtx_init(&na->tx_rings[i].q_lock, "netmap txq lock", NULL, MTX_DEF); - for (i = 0 ; i < na->num_rx_queues + 1; i++) + for (i = 0 ; i < na->num_rx_rings + 1; i++) mtx_init(&na->rx_rings[i].q_lock, "netmap rxq lock", NULL, MTX_DEF); } #ifdef linux @@ -1033,11 +1032,11 @@ netmap_detach(struct ifnet *ifp) if (!na) return; - for (i = 0; i < na->num_tx_queues + 1; i++) { + for (i = 0; i < na->num_tx_rings + 1; i++) { knlist_destroy(&na->tx_rings[i].si.si_note); mtx_destroy(&na->tx_rings[i].q_lock); } - for (i = 0; i < na->num_rx_queues + 1; i++) { + for (i = 0; i < na->num_rx_rings + 1; i++) { knlist_destroy(&na->rx_rings[i].si.si_note); mtx_destroy(&na->rx_rings[i].q_lock); } @@ -1058,7 +1057,7 @@ int netmap_start(struct ifnet *ifp, struct mbuf *m) { struct netmap_adapter *na = NA(ifp); - struct netmap_kring *kring = &na->rx_rings[na->num_rx_queues]; + struct netmap_kring *kring = &na->rx_rings[na->num_rx_rings]; u_int i, len = MBUF_LEN(m); int error = EBUSY, lim = kring->nkr_num_slots - 1; struct netmap_slot *slot; @@ -1085,7 +1084,7 @@ netmap_start(struct ifnet *ifp, struct m slot->len = len; kring->nr_hwavail++; if (netmap_verbose & NM_VERB_HOST) - D("wake up host ring %s %d", na->ifp->if_xname, na->num_rx_queues); + D("wake up host ring %s %d", na->ifp->if_xname, na->num_rx_rings); selwakeuppri(&kring->si, PI_NET); error = 0; done: @@ -1174,10 +1173,10 @@ netmap_rx_irq(struct ifnet *ifp, int q, if (work_done) { /* RX path */ r = na->rx_rings + q; r->nr_kflags |= NKR_PENDINTR; - main_wq = (na->num_rx_queues > 1) ? &na->rx_si : NULL; + main_wq = (na->num_rx_rings > 1) ? &na->rx_si : NULL; } else { /* tx path */ r = na->tx_rings + q; - main_wq = (na->num_tx_queues > 1) ? &na->tx_si : NULL; + main_wq = (na->num_tx_rings > 1) ? &na->tx_si : NULL; work_done = &q; /* dummy */ } if (na->separate_locks) { Modified: head/sys/dev/netmap/netmap_kern.h ============================================================================== --- head/sys/dev/netmap/netmap_kern.h Fri Apr 13 15:43:42 2012 (r234226) +++ head/sys/dev/netmap/netmap_kern.h Fri Apr 13 16:03:07 2012 (r234227) @@ -34,6 +34,8 @@ #ifndef _NET_NETMAP_KERN_H_ #define _NET_NETMAP_KERN_H_ +#define NETMAP_MEM2 // use the new memory allocator + #if defined(__FreeBSD__) #define NM_LOCK_T struct mtx #define NM_SELINFO_T struct selinfo @@ -104,20 +106,25 @@ struct netmap_adapter { int refcount; /* number of user-space descriptors using this interface, which is equal to the number of struct netmap_if objs in the mapped region. */ + /* + * The selwakeup in the interrupt thread can use per-ring + * and/or global wait queues. We track how many clients + * of each type we have so we can optimize the drivers, + * and especially avoid huge contention on the locks. + */ + int na_single; /* threads attached to a single hw queue */ + int na_multi; /* threads attached to multiple hw queues */ int separate_locks; /* set if the interface suports different locks for rx, tx and core. */ - u_int num_rx_queues; /* number of tx/rx queue pairs: this is - a duplicate field needed to simplify the - signature of ``netmap_detach``. */ - u_int num_tx_queues; // if nonzero, overrides num_queues XXX + u_int num_rx_rings; /* number of tx/rx ring pairs */ + u_int num_tx_rings; // if nonzero, overrides num_rx_rings u_int num_tx_desc; /* number of descriptor in each queue */ u_int num_rx_desc; - u_int buff_size; // XXX deprecate, use NETMAP_BUF_SIZE + //u_int buff_size; // XXX deprecate, use NETMAP_BUF_SIZE - //u_int flags; // XXX unused /* tx_rings and rx_rings are private but allocated * as a contiguous chunk of memory. Each array has * N+1 entries, for the adapter queues and for the host queue. @@ -129,9 +136,7 @@ struct netmap_adapter { /* copy of if_qflush and if_transmit pointers, to intercept * packets from the network stack when netmap is active. - * XXX probably if_qflush is not necessary. */ - //void (*if_qflush)(struct ifnet *); // XXX unused int (*if_transmit)(struct ifnet *, struct mbuf *); /* references to the ifnet and device routines, used by @@ -294,6 +299,21 @@ netmap_idx_k2n(struct netmap_kring *kr, } +#ifdef NETMAP_MEM2 +/* Entries of the look-up table. */ +struct lut_entry { + void *vaddr; /* virtual address. */ + vm_paddr_t paddr; /* phisical address. */ +}; + +struct netmap_obj_pool; +extern struct lut_entry *netmap_buffer_lut; +#define NMB_VA(i) (netmap_buffer_lut[i].vaddr) +#define NMB_PA(i) (netmap_buffer_lut[i].paddr) +#else /* NETMAP_MEM1 */ +#define NMB_VA(i) (netmap_buffer_base + (i * NETMAP_BUF_SIZE) ) +#endif /* NETMAP_MEM2 */ + /* * NMB return the virtual address of a buffer (buffer 0 on bad index) * PNMB also fills the physical address @@ -302,17 +322,19 @@ static inline void * NMB(struct netmap_slot *slot) { uint32_t i = slot->buf_idx; - return (i >= netmap_total_buffers) ? netmap_buffer_base : - netmap_buffer_base + (i * NETMAP_BUF_SIZE); + return (i >= netmap_total_buffers) ? NMB_VA(0) : NMB_VA(i); } static inline void * PNMB(struct netmap_slot *slot, uint64_t *pp) { uint32_t i = slot->buf_idx; - void *ret = (i >= netmap_total_buffers) ? netmap_buffer_base : - netmap_buffer_base + (i * NETMAP_BUF_SIZE); + void *ret = (i >= netmap_total_buffers) ? NMB_VA(0) : NMB_VA(i); +#ifdef NETMAP_MEM2 + *pp = (i >= netmap_total_buffers) ? NMB_PA(0) : NMB_PA(i); +#else *pp = vtophys(ret); +#endif return ret; } Modified: head/sys/dev/netmap/netmap_mem1.c ============================================================================== --- head/sys/dev/netmap/netmap_mem1.c Fri Apr 13 15:43:42 2012 (r234226) +++ head/sys/dev/netmap/netmap_mem1.c Fri Apr 13 16:03:07 2012 (r234227) @@ -280,8 +280,8 @@ netmap_if_new(const char *ifname, struct struct netmap_kring *kring; char *buff; u_int i, len, ofs, numdesc; - u_int nrx = na->num_rx_queues + 1; /* shorthand, include stack queue */ - u_int ntx = na->num_tx_queues + 1; /* shorthand, include stack queue */ + u_int nrx = na->num_rx_rings + 1; /* shorthand, include stack queue */ + u_int ntx = na->num_tx_rings + 1; /* shorthand, include stack queue */ /* * the descriptor is followed inline by an array of offsets @@ -293,8 +293,8 @@ netmap_if_new(const char *ifname, struct return (NULL); /* initialize base fields */ - *(int *)(uintptr_t)&nifp->ni_rx_queues = na->num_rx_queues; - *(int *)(uintptr_t)&nifp->ni_tx_queues = na->num_tx_queues; + *(int *)(uintptr_t)&nifp->ni_rx_rings = na->num_rx_rings; + *(int *)(uintptr_t)&nifp->ni_tx_rings = na->num_tx_rings; strncpy(nifp->ni_name, ifname, IFNAMSIZ); (na->refcount)++; /* XXX atomic ? we are under lock */ Modified: head/sys/net/netmap.h ============================================================================== --- head/sys/net/netmap.h Fri Apr 13 15:43:42 2012 (r234226) +++ head/sys/net/netmap.h Fri Apr 13 16:03:07 2012 (r234227) @@ -83,8 +83,8 @@ / | cur | NETMAP_IF (nifp, one per file desc.) / | avail | +---------------+ / | buf_ofs | - | ni_num_queues | / +=============+ - | | / | buf_idx | slot[0] + | ni_tx_rings | / +=============+ + | ni_rx_rings | / | buf_idx | slot[0] | | / | len, flags | | | / +-------------+ +===============+ / | buf_idx | slot[1] @@ -221,8 +221,8 @@ struct netmap_ring { struct netmap_if { char ni_name[IFNAMSIZ]; /* name of the interface. */ const u_int ni_version; /* API version, currently unused */ - const u_int ni_rx_queues; /* number of rx queue pairs */ - const u_int ni_tx_queues; /* if zero, same as ni_tx_queues */ + const u_int ni_rx_rings; /* number of rx rings */ + const u_int ni_tx_rings; /* if zero, same as ni_rx_rings */ /* * The following array contains the offset of each netmap ring * from this structure. The first ni_tx_queues+1 entries refer @@ -257,7 +257,7 @@ struct netmap_if { struct nmreq { char nr_name[IFNAMSIZ]; uint32_t nr_version; /* API version */ -#define NETMAP_API 2 /* current version */ +#define NETMAP_API 3 /* current version */ uint32_t nr_offset; /* nifp offset in the shared region */ uint32_t nr_memsize; /* size of the shared region */ uint32_t nr_tx_slots; /* slots in tx rings */ Modified: head/sys/net/netmap_user.h ============================================================================== --- head/sys/net/netmap_user.h Fri Apr 13 15:43:42 2012 (r234226) +++ head/sys/net/netmap_user.h Fri Apr 13 16:03:07 2012 (r234227) @@ -70,7 +70,7 @@ #define NETMAP_RXRING(nifp, index) \ ((struct netmap_ring *)((char *)(nifp) + \ - (nifp)->ring_ofs[index + (nifp)->ni_tx_queues+1] ) ) + (nifp)->ring_ofs[index + (nifp)->ni_tx_rings + 1] ) ) #define NETMAP_BUF(ring, index) \ ((char *)(ring) + (ring)->buf_ofs + ((index)*(ring)->nr_buf_size)) Modified: head/tools/tools/netmap/bridge.c ============================================================================== --- head/tools/tools/netmap/bridge.c Fri Apr 13 15:43:42 2012 (r234226) +++ head/tools/tools/netmap/bridge.c Fri Apr 13 16:03:07 2012 (r234227) @@ -300,7 +300,7 @@ howmany(struct my_ring *me, int tx) if (0 && verbose && tot && !tx) D("ring %s %s %s has %d avail at %d", me->ifname, tx ? "tx": "rx", - me->end > me->nifp->ni_rx_queues ? + me->end >= me->nifp->ni_tx_rings ? // XXX who comes first ? "host":"net", tot, NETMAP_TXRING(me->nifp, me->begin)->cur); return tot; @@ -361,6 +361,8 @@ main(int argc, char **argv) } } + argc -= optind; + argv += optind; if (argc > 1) ifa = argv[1]; @@ -440,8 +442,8 @@ main(int argc, char **argv) D("Wait %d secs for link to come up...", wait_link); sleep(wait_link); D("Ready to go, %s 0x%x/%d <-> %s 0x%x/%d.", - me[0].ifname, me[0].queueid, me[0].nifp->ni_rx_queues, - me[1].ifname, me[1].queueid, me[1].nifp->ni_rx_queues); + me[0].ifname, me[0].queueid, me[0].nifp->ni_rx_rings, + me[1].ifname, me[1].queueid, me[1].nifp->ni_rx_rings); /* main loop */ signal(SIGINT, sigint_h);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201204131603.q3DG38gK087221>