socsvn commit: r305708 - soc2016/vincenzo/head/sys/dev/netmap
vincenzo at FreeBSD.org
vincenzo at FreeBSD.org
Mon Jul 4 07:43:14 UTC 2016
Author: vincenzo
Date: Mon Jul 4 07:43:12 2016
New Revision: 305708
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=305708
Log:
freebsd: run-time computation of min_tx_space
Modified:
soc2016/vincenzo/head/sys/dev/netmap/if_ptnet.c
Modified: soc2016/vincenzo/head/sys/dev/netmap/if_ptnet.c
==============================================================================
--- soc2016/vincenzo/head/sys/dev/netmap/if_ptnet.c Mon Jul 4 07:42:39 2016 (r305707)
+++ soc2016/vincenzo/head/sys/dev/netmap/if_ptnet.c Mon Jul 4 07:43:12 2016 (r305708)
@@ -136,6 +136,8 @@
struct ptnet_queue *rxqueues;
struct ptnet_csb *csb;
+ unsigned int min_tx_space;
+
struct netmap_pt_guest_adapter *ptna_nm;
struct netmap_pt_guest_adapter ptna_dr;
/* XXX we should move ptna_dr and backend_regifs inside struct
@@ -321,6 +323,8 @@
}
}
+ sc->min_tx_space = 64; /* Safe initial value. */
+
err = ptnet_irqs_init(sc);
if (err) {
goto err_path;
@@ -698,6 +702,7 @@
{
struct ifnet *ifp = sc->ifp;
struct netmap_adapter *na_dr = &sc->ptna_dr.hwup.up;
+ unsigned int nm_buf_size;
int ret;
if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
@@ -742,6 +747,13 @@
goto err_register;
}
+ nm_buf_size = NETMAP_BUF_SIZE(na_dr);
+
+ KASSERT(nm_buf_size > 0, "Invalid netmap buffer size");
+ sc->min_tx_space = 65536 / nm_buf_size + 2;
+ device_printf(sc->dev, "%s: min_tx_space = %u\n", __func__,
+ sc->min_tx_space);
+
ifp->if_drv_flags |= IFF_DRV_RUNNING;
return 0;
@@ -1164,12 +1176,9 @@
}
}
-/* This should be computed as MAX_FRAME_SIZE / NETMAP_BUF_SIZE */
-#define PTNET_TX_MIN_SLOTS 33
-
-#define PTNET_TX_NOSPACE(h, k) \
- ((((h) < (k)->rtail) ? 0 : (k)->nkr_num_slots) + \
- (k)->rtail - (h)) < PTNET_TX_MIN_SLOTS
+#define PTNET_TX_NOSPACE(_h, _k, _min) \
+ ((((_h) < (_k)->rtail) ? 0 : (_k)->nkr_num_slots) + \
+ (_k)->rtail - (_h)) < (_min)
static int
ptnet_transmit(struct ifnet *ifp, struct mbuf *m)
@@ -1183,6 +1192,7 @@
struct netmap_slot *slot;
struct ptnet_queue *pq;
unsigned int prev_head;
+ unsigned int minspace;
unsigned int head;
unsigned int lim;
struct mbuf *mf;
@@ -1226,15 +1236,16 @@
ring = kring->ring;
lim = kring->nkr_num_slots - 1;
head = ring->head;
+ minspace = sc->min_tx_space;
for (;;) {
- if (PTNET_TX_NOSPACE(head, kring)) {
+ if (PTNET_TX_NOSPACE(head, kring, minspace)) {
/* We ran out of slot, let's see if the host has
* freed up some, by reading hwcur and hwtail from
* the CSB. */
ptnet_sync_tail(ptring, kring);
- if (PTNET_TX_NOSPACE(head, kring)) {
+ if (PTNET_TX_NOSPACE(head, kring, minspace)) {
/* Still no slots available. Reactivate the
* interrupts so that we can be notified
* when some free slots are made available by
@@ -1243,7 +1254,8 @@
/* Double-check. */
ptnet_sync_tail(ptring, kring);
- if (likely(PTNET_TX_NOSPACE(head, kring))) {
+ if (likely(PTNET_TX_NOSPACE(head, kring,
+ minspace))) {
break;
}
More information about the svn-soc-all
mailing list