diff options
Diffstat (limited to 'sys/dev/netmap')
| -rw-r--r-- | sys/dev/netmap/if_lem_netmap.h | 4 | ||||
| -rw-r--r-- | sys/dev/netmap/if_ptnet.c | 12 | ||||
| -rw-r--r-- | sys/dev/netmap/netmap.c | 5 | ||||
| -rw-r--r-- | sys/dev/netmap/netmap_freebsd.c | 9 | ||||
| -rw-r--r-- | sys/dev/netmap/netmap_generic.c | 21 | ||||
| -rw-r--r-- | sys/dev/netmap/netmap_kern.h | 5 | ||||
| -rw-r--r-- | sys/dev/netmap/netmap_pt.c | 108 |
7 files changed, 60 insertions, 104 deletions
diff --git a/sys/dev/netmap/if_lem_netmap.h b/sys/dev/netmap/if_lem_netmap.h index 1c2afbd18f10..91c637a8b3f8 100644 --- a/sys/dev/netmap/if_lem_netmap.h +++ b/sys/dev/netmap/if_lem_netmap.h @@ -35,12 +35,8 @@ #include <net/netmap.h> #include <sys/selinfo.h> -#include <vm/vm.h> -#include <vm/pmap.h> /* vtophys ? */ #include <dev/netmap/netmap_kern.h> -extern int netmap_adaptive_io; - /* * Register/unregister. We are already under netmap lock. */ diff --git a/sys/dev/netmap/if_ptnet.c b/sys/dev/netmap/if_ptnet.c index 86b500e36e18..90a90e984a5a 100644 --- a/sys/dev/netmap/if_ptnet.c +++ b/sys/dev/netmap/if_ptnet.c @@ -341,7 +341,11 @@ ptnet_attach(device_t dev) } { - vm_paddr_t paddr = vtophys(sc->csb); + /* + * We use uint64_t rather than vm_paddr_t since we + * need 64 bit addresses even on 32 bit platforms. + */ + uint64_t paddr = vtophys(sc->csb); bus_write_4(sc->iomem, PTNET_IO_CSBBAH, (paddr >> 32) & 0xffffffff); @@ -1139,9 +1143,11 @@ ptnet_sync_from_csb(struct ptnet_softc *sc, struct netmap_adapter *na) static void ptnet_update_vnet_hdr(struct ptnet_softc *sc) { - sc->vnet_hdr_len = ptnet_vnet_hdr ? PTNET_HDR_SIZE : 0; + unsigned int wanted_hdr_len = ptnet_vnet_hdr ? PTNET_HDR_SIZE : 0; + + bus_write_4(sc->iomem, PTNET_IO_VNET_HDR_LEN, wanted_hdr_len); + sc->vnet_hdr_len = bus_read_4(sc->iomem, PTNET_IO_VNET_HDR_LEN); sc->ptna->hwup.up.virt_hdr_len = sc->vnet_hdr_len; - bus_write_4(sc->iomem, PTNET_IO_VNET_HDR_LEN, sc->vnet_hdr_len); } static int diff --git a/sys/dev/netmap/netmap.c b/sys/dev/netmap/netmap.c index d92d342af83c..46aca2eab5e2 100644 --- a/sys/dev/netmap/netmap.c +++ b/sys/dev/netmap/netmap.c @@ -483,7 +483,6 @@ static int netmap_no_timestamp; /* don't timestamp on rxsync */ int netmap_mitigate = 1; int netmap_no_pendintr = 1; int netmap_txsync_retry = 2; -int netmap_adaptive_io = 0; int netmap_flags = 0; /* debug flags */ static int netmap_fwd = 0; /* force transparent mode */ @@ -540,8 +539,6 @@ SYSCTL_INT(_dev_netmap, OID_AUTO, no_pendintr, CTLFLAG_RW, &netmap_no_pendintr, 0, "Always look for new received packets."); SYSCTL_INT(_dev_netmap, OID_AUTO, txsync_retry, CTLFLAG_RW, &netmap_txsync_retry, 0 , "Number of txsync loops in bridge's flush."); -SYSCTL_INT(_dev_netmap, OID_AUTO, adaptive_io, CTLFLAG_RW, - &netmap_adaptive_io, 0 , "Adaptive I/O on paravirt"); SYSCTL_INT(_dev_netmap, OID_AUTO, flags, CTLFLAG_RW, &netmap_flags, 0 , ""); SYSCTL_INT(_dev_netmap, OID_AUTO, fwd, CTLFLAG_RW, &netmap_fwd, 0 , ""); @@ -1559,7 +1556,7 @@ nm_txsync_prologue(struct netmap_kring *kring, struct netmap_ring *ring) } } if (ring->tail != kring->rtail) { - RD(5, "tail overwritten was %d need %d", + RD(5, "%s tail overwritten was %d need %d", kring->name, ring->tail, kring->rtail); ring->tail = kring->rtail; } diff --git a/sys/dev/netmap/netmap_freebsd.c b/sys/dev/netmap/netmap_freebsd.c index 20ea5c8f2972..50e2d0f46744 100644 --- a/sys/dev/netmap/netmap_freebsd.c +++ b/sys/dev/netmap/netmap_freebsd.c @@ -353,7 +353,7 @@ nm_os_generic_xmit_frame(struct nm_os_gen_arg *a) bcopy(a->addr, m->m_data, len); #else /* __FreeBSD_version >= 1100000 */ /* New FreeBSD versions. Link the external storage to - * the netmap buffer, so that no copy is necessary. */ + * the netmap buffer, so that no copy is necessary. */ m->m_ext.ext_buf = m->m_data = a->addr; m->m_ext.ext_size = len; #endif /* __FreeBSD_version >= 1100000 */ @@ -644,7 +644,8 @@ DRIVER_MODULE_ORDERED(ptn_memdev, pci, ptn_memdev_driver, ptnetmap_devclass, * of the netmap memory mapped in the guest. */ int -nm_os_pt_memdev_iomap(struct ptnetmap_memdev *ptn_dev, vm_paddr_t *nm_paddr, void **nm_addr) +nm_os_pt_memdev_iomap(struct ptnetmap_memdev *ptn_dev, vm_paddr_t *nm_paddr, + void **nm_addr) { uint32_t mem_size; int rid; @@ -668,8 +669,8 @@ nm_os_pt_memdev_iomap(struct ptnetmap_memdev *ptn_dev, vm_paddr_t *nm_paddr, voi D("=== BAR %d start %lx len %lx mem_size %x ===", PTNETMAP_MEM_PCI_BAR, - *nm_paddr, - rman_get_size(ptn_dev->pci_mem), + (unsigned long)(*nm_paddr), + (unsigned long)rman_get_size(ptn_dev->pci_mem), mem_size); return (0); } diff --git a/sys/dev/netmap/netmap_generic.c b/sys/dev/netmap/netmap_generic.c index 5cef4a29110a..87072069fbcf 100644 --- a/sys/dev/netmap/netmap_generic.c +++ b/sys/dev/netmap/netmap_generic.c @@ -95,7 +95,7 @@ __FBSDID("$FreeBSD$"); /* * For older versions of FreeBSD: - * + * * We allocate EXT_PACKET mbuf+clusters, but need to set M_NOFREE * so that the destructor, if invoked, will not free the packet. * In principle we should set the destructor only on demand, @@ -628,8 +628,6 @@ generic_mbuf_destructor(struct mbuf *m) #endif } -extern int netmap_adaptive_io; - /* Record completed transmissions and update hwtail. * * The oldest tx buffer not yet completed is at nr_hwtail + 1, @@ -690,23 +688,6 @@ generic_netmap_tx_clean(struct netmap_kring *kring, int txqdisc) n++; nm_i = nm_next(nm_i, lim); -#if 0 /* rate adaptation */ - if (netmap_adaptive_io > 1) { - if (n >= netmap_adaptive_io) - break; - } else if (netmap_adaptive_io) { - /* if hwcur - nm_i < lim/8 do an early break - * so we prevent the sender from stalling. See CVT. - */ - if (hwcur >= nm_i) { - if (hwcur - nm_i < lim/2) - break; - } else { - if (hwcur + lim + 1 - nm_i < lim/2) - break; - } - } -#endif } kring->nr_hwtail = nm_prev(nm_i, lim); ND("tx completed [%d] -> hwtail %d", n, kring->nr_hwtail); diff --git a/sys/dev/netmap/netmap_kern.h b/sys/dev/netmap/netmap_kern.h index 30f071c1d9e4..28e69d7ab093 100644 --- a/sys/dev/netmap/netmap_kern.h +++ b/sys/dev/netmap/netmap_kern.h @@ -1512,9 +1512,9 @@ int netmap_adapter_put(struct netmap_adapter *na); */ #define NETMAP_BUF_BASE(_na) ((_na)->na_lut.lut[0].vaddr) #define NETMAP_BUF_SIZE(_na) ((_na)->na_lut.objsize) -extern int netmap_mitigate; // XXX not really used extern int netmap_no_pendintr; -extern int netmap_verbose; // XXX debugging +extern int netmap_mitigate; +extern int netmap_verbose; /* for debugging */ enum { /* verbose flags */ NM_VERB_ON = 1, /* generic verbose */ NM_VERB_HOST = 0x2, /* verbose host stack */ @@ -1527,7 +1527,6 @@ enum { /* verbose flags */ }; extern int netmap_txsync_retry; -extern int netmap_adaptive_io; extern int netmap_flags; extern int netmap_generic_mit; extern int netmap_generic_ringsize; diff --git a/sys/dev/netmap/netmap_pt.c b/sys/dev/netmap/netmap_pt.c index 53348495c4eb..56434a236145 100644 --- a/sys/dev/netmap/netmap_pt.c +++ b/sys/dev/netmap/netmap_pt.c @@ -64,13 +64,10 @@ * results in random drops in the VALE txsync. */ //#define PTN_TX_BATCH_LIM(_n) ((_n >> 1)) -/* XXX: avoid nm_*sync_prologue(). XXX-vin: this should go away, - * we should never trust the guest. */ -#define PTN_AVOID_NM_PROLOGUE //#define BUSY_WAIT -#define DEBUG /* Enables communication debugging. */ -#ifdef DEBUG +#define NETMAP_PT_DEBUG /* Enables communication debugging. */ +#ifdef NETMAP_PT_DEBUG #define DBG(x) x #else #define DBG(x) @@ -196,22 +193,6 @@ ptnetmap_kring_dump(const char *title, const struct netmap_kring *kring) 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) -{ - struct netmap_ring *ring = kring->ring; - - //XXX: trust guest? - ring->head = g_head; - ring->cur = g_cur; - ring->tail = NM_ACCESS_ONCE(kring->nr_hwtail); - - netmap_ring_reinit(kring); - ptnetmap_kring_dump("kring reinit", kring); -} -#endif - /* * TX functions to set/get and to handle host/guest kick. */ @@ -251,7 +232,7 @@ ptnetmap_tx_handler(void *data) (struct netmap_pt_host_adapter *)kring->na->na_private; struct ptnetmap_state *ptns = pth_na->ptns; struct ptnet_ring __user *ptring; - struct netmap_ring g_ring; /* guest ring pointer, copied from CSB */ + struct netmap_ring shadow_ring; /* shadow copy of the netmap_ring */ bool more_txspace = false; struct nm_kthread *kth; uint32_t num_slots; @@ -281,18 +262,18 @@ ptnetmap_tx_handler(void *data) kth = ptns->kthreads[kring->ring_id]; num_slots = kring->nkr_num_slots; - g_ring.head = kring->rhead; - g_ring.cur = kring->rcur; + shadow_ring.head = kring->rhead; + shadow_ring.cur = kring->rcur; /* Disable guest --> host notifications. */ ptring_kick_enable(ptring, 0); /* Copy the guest kring pointers from the CSB */ - ptnetmap_host_read_kring_csb(ptring, &g_ring, num_slots); + ptnetmap_host_read_kring_csb(ptring, &shadow_ring, num_slots); for (;;) { /* If guest moves ahead too fast, let's cut the move so * that we don't exceed our batch limit. */ - batch = g_ring.head - kring->nr_hwcur; + batch = shadow_ring.head - kring->nr_hwcur; if (batch < 0) batch += num_slots; @@ -302,37 +283,35 @@ ptnetmap_tx_handler(void *data) if (head_lim >= num_slots) head_lim -= num_slots; - ND(1, "batch: %d head: %d head_lim: %d", batch, g_ring.head, + ND(1, "batch: %d head: %d head_lim: %d", batch, shadow_ring.head, head_lim); - g_ring.head = head_lim; + shadow_ring.head = head_lim; batch = PTN_TX_BATCH_LIM(num_slots); } #endif /* PTN_TX_BATCH_LIM */ if (nm_kr_txspace(kring) <= (num_slots >> 1)) { - g_ring.flags |= NAF_FORCE_RECLAIM; + shadow_ring.flags |= NAF_FORCE_RECLAIM; } -#ifndef PTN_AVOID_NM_PROLOGUE + /* Netmap prologue */ - if (unlikely(nm_txsync_prologue(kring, &g_ring) >= num_slots)) { - ptnetmap_ring_reinit(kring, g_ring.head, g_ring.cur); - /* Reenable notifications. */ + shadow_ring.tail = kring->rtail; + if (unlikely(nm_txsync_prologue(kring, &shadow_ring) >= num_slots)) { + /* Reinit ring and enable notifications. */ + netmap_ring_reinit(kring); ptring_kick_enable(ptring, 1); break; } -#else /* PTN_AVOID_NM_PROLOGUE */ - kring->rhead = g_ring.head; - kring->rcur = g_ring.cur; -#endif /* !PTN_AVOID_NM_PROLOGUE */ + if (unlikely(netmap_verbose & NM_VERB_TXSYNC)) { ptnetmap_kring_dump("pre txsync", kring); } IFRATE(pre_tail = kring->rtail); - if (unlikely(kring->nm_sync(kring, g_ring.flags))) { + if (unlikely(kring->nm_sync(kring, shadow_ring.flags))) { /* Reenable notifications. */ ptring_kick_enable(ptring, 1); - D("ERROR txsync"); + D("ERROR txsync()"); break; } @@ -350,7 +329,7 @@ ptnetmap_tx_handler(void *data) } IFRATE(rate_batch_stats_update(&ptns->rate_ctx.new.txbs, pre_tail, - kring->rtail, num_slots)); + kring->rtail, num_slots)); if (unlikely(netmap_verbose & NM_VERB_TXSYNC)) { ptnetmap_kring_dump("post txsync", kring); @@ -367,9 +346,9 @@ ptnetmap_tx_handler(void *data) } #endif /* Read CSB to see if there is more work to do. */ - ptnetmap_host_read_kring_csb(ptring, &g_ring, num_slots); + ptnetmap_host_read_kring_csb(ptring, &shadow_ring, num_slots); #ifndef BUSY_WAIT - if (g_ring.head == kring->rhead) { + if (shadow_ring.head == kring->rhead) { /* * No more packets to transmit. We enable notifications and * go to sleep, waiting for a kick from the guest when new @@ -379,8 +358,8 @@ ptnetmap_tx_handler(void *data) /* Reenable notifications. */ ptring_kick_enable(ptring, 1); /* Doublecheck. */ - ptnetmap_host_read_kring_csb(ptring, &g_ring, num_slots); - if (g_ring.head != kring->rhead) { + ptnetmap_host_read_kring_csb(ptring, &shadow_ring, num_slots); + if (shadow_ring.head != kring->rhead) { /* We won the race condition, there are more packets to * transmit. Disable notifications and do another cycle */ ptring_kick_enable(ptring, 0); @@ -433,7 +412,7 @@ ptnetmap_rx_handler(void *data) (struct netmap_pt_host_adapter *)kring->na->na_private; struct ptnetmap_state *ptns = pth_na->ptns; struct ptnet_ring __user *ptring; - struct netmap_ring g_ring; /* guest ring pointer, copied from CSB */ + struct netmap_ring shadow_ring; /* shadow copy of the netmap_ring */ struct nm_kthread *kth; uint32_t num_slots; int dry_cycles = 0; @@ -464,36 +443,32 @@ ptnetmap_rx_handler(void *data) kth = ptns->kthreads[pth_na->up.num_tx_rings + kring->ring_id]; num_slots = kring->nkr_num_slots; - g_ring.head = kring->rhead; - g_ring.cur = kring->rcur; + shadow_ring.head = kring->rhead; + shadow_ring.cur = kring->rcur; /* Disable notifications. */ ptring_kick_enable(ptring, 0); /* Copy the guest kring pointers from the CSB */ - ptnetmap_host_read_kring_csb(ptring, &g_ring, num_slots); + ptnetmap_host_read_kring_csb(ptring, &shadow_ring, num_slots); for (;;) { uint32_t hwtail; -#ifndef PTN_AVOID_NM_PROLOGUE /* Netmap prologue */ - if (unlikely(nm_rxsync_prologue(kring, &g_ring) >= num_slots)) { - ptnetmap_ring_reinit(kring, g_ring.head, g_ring.cur); - /* Reenable notifications. */ + shadow_ring.tail = kring->rtail; + if (unlikely(nm_rxsync_prologue(kring, &shadow_ring) >= num_slots)) { + /* Reinit ring and enable notifications. */ + netmap_ring_reinit(kring); ptring_kick_enable(ptring, 1); break; } -#else /* PTN_AVOID_NM_PROLOGUE */ - kring->rhead = g_ring.head; - kring->rcur = g_ring.cur; -#endif /* !PTN_AVOID_NM_PROLOGUE */ - if (unlikely(netmap_verbose & NM_VERB_RXSYNC)) + if (unlikely(netmap_verbose & NM_VERB_RXSYNC)) { ptnetmap_kring_dump("pre rxsync", kring); + } IFRATE(pre_tail = kring->rtail); - - if (unlikely(kring->nm_sync(kring, g_ring.flags))) { + if (unlikely(kring->nm_sync(kring, shadow_ring.flags))) { /* Reenable notifications. */ ptring_kick_enable(ptring, 1); D("ERROR rxsync()"); @@ -516,8 +491,9 @@ ptnetmap_rx_handler(void *data) IFRATE(rate_batch_stats_update(&ptns->rate_ctx.new.rxbs, pre_tail, kring->rtail, num_slots)); - if (unlikely(netmap_verbose & NM_VERB_RXSYNC)) + if (unlikely(netmap_verbose & NM_VERB_RXSYNC)) { ptnetmap_kring_dump("post rxsync", kring); + } #ifndef BUSY_WAIT /* Interrupt the guest if needed. */ @@ -530,9 +506,9 @@ ptnetmap_rx_handler(void *data) } #endif /* Read CSB to see if there is more work to do. */ - ptnetmap_host_read_kring_csb(ptring, &g_ring, num_slots); + ptnetmap_host_read_kring_csb(ptring, &shadow_ring, num_slots); #ifndef BUSY_WAIT - if (ptnetmap_norxslots(kring, g_ring.head)) { + if (ptnetmap_norxslots(kring, shadow_ring.head)) { /* * No more slots available for reception. We enable notification and * go to sleep, waiting for a kick from the guest when new receive @@ -542,8 +518,8 @@ ptnetmap_rx_handler(void *data) /* Reenable notifications. */ ptring_kick_enable(ptring, 1); /* Doublecheck. */ - ptnetmap_host_read_kring_csb(ptring, &g_ring, num_slots); - if (!ptnetmap_norxslots(kring, g_ring.head)) { + ptnetmap_host_read_kring_csb(ptring, &shadow_ring, num_slots); + if (!ptnetmap_norxslots(kring, shadow_ring.head)) { /* We won the race condition, more slots are available. Disable * notifications and do another cycle. */ ptring_kick_enable(ptring, 0); @@ -578,7 +554,7 @@ ptnetmap_rx_handler(void *data) } } -#ifdef DEBUG +#ifdef NETMAP_PT_DEBUG static void ptnetmap_print_configuration(struct ptnetmap_cfg *cfg) { @@ -594,7 +570,7 @@ ptnetmap_print_configuration(struct ptnetmap_cfg *cfg) } } -#endif +#endif /* NETMAP_PT_DEBUG */ /* Copy actual state of the host ring into the CSB for the guest init */ static int |
