socsvn commit: r305291 - soc2016/vincenzo/head/sys/dev/netmap

vincenzo at FreeBSD.org vincenzo at FreeBSD.org
Fri Jun 17 16:22:48 UTC 2016


Author: vincenzo
Date: Fri Jun 17 16:22:46 2016
New Revision: 305291
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=305291

Log:
   freebsd: ptnet: sketch ptnet_rx_eof function

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	Fri Jun 17 16:22:28 2016	(r305290)
+++ soc2016/vincenzo/head/sys/dev/netmap/if_ptnet.c	Fri Jun 17 16:22:46 2016	(r305291)
@@ -174,6 +174,8 @@
 static void	ptnet_tx_intr(void *opaque);
 static void	ptnet_rx_intr(void *opaque);
 
+static int	ptnet_rx_eof(struct ptnet_queue *pq);
+
 static device_method_t ptnet_methods[] = {
 	DEVMETHOD(device_probe,			ptnet_probe),
 	DEVMETHOD(device_attach,		ptnet_attach),
@@ -802,8 +804,7 @@
 
 	/* Tell the host to process the new packets, updating cur and
 	 * head in the CSB. */
-	ptnetmap_guest_write_kring_csb(ptring, kring->rcur,
-			kring->rhead);
+	ptnetmap_guest_write_kring_csb(ptring, kring->rcur, kring->rhead);
 
         /* Ask for a kick from a guest to the host if needed. */
 	if (NM_ACCESS_ONCE(ptring->host_need_kick)) {
@@ -1137,4 +1138,53 @@
 	if (netmap_rx_irq(sc->ifp, pq->kring_id, &unused) != NM_IRQ_PASS) {
 		return;
 	}
+
+	ptnet_rx_eof(pq);
+}
+
+static int
+ptnet_rx_eof(struct ptnet_queue *pq)
+{
+	struct ptnet_softc *sc = pq->sc;
+	struct ptnet_ring *ptring = pq->ptring;
+	struct netmap_adapter *na = &sc->ptna_dr.hwup.up;
+	struct netmap_kring *kring = na->rx_rings + pq->kring_id;
+	struct netmap_ring *ring = kring->ring;
+	unsigned int const lim = kring->nkr_num_slots - 1;
+	unsigned int head = ring->head;
+	struct ifnet *ifp = sc->ifp;
+
+	PTNET_Q_LOCK(pq);
+
+	/* Update hwtail, rtail, tail and hwcur to what is known from the host,
+	 * reading from CSB. */
+	ptnet_sync_tail(ptring, kring);
+
+	kring->nr_kflags &= ~NKR_PENDINTR;
+
+	while (head != ring->tail) {
+		struct netmap_slot *slot = ring->slot + head;
+		unsigned int nmbuf_len = slot->len;
+		uint8_t *nmbuf = NMB(na, slot);
+		struct mbuf *m = NULL;
+
+		if (unlikely(m == NULL)) {
+			device_printf(sc->dev, "%s: failed to allocate mbuf"
+				      "(len=%d)\n", __func__, nmbuf_len);
+			break;
+		}
+
+		memcpy(m->m_data, nmbuf, nmbuf_len);
+		m->m_len = nmbuf_len;
+
+		head = nm_next(head, lim);
+
+		PTNET_Q_UNLOCK(pq);
+		(*ifp->if_input)(ifp, m);
+		PTNET_Q_LOCK(pq);
+	}
+
+	PTNET_Q_UNLOCK(pq);
+
+	return 0;
 }


More information about the svn-soc-all mailing list