socsvn commit: r305824 - soc2016/vincenzo/head/sys/dev/netmap
vincenzo at FreeBSD.org
vincenzo at FreeBSD.org
Fri Jul 8 15:43:37 UTC 2016
Author: vincenzo
Date: Fri Jul 8 15:43:36 2016
New Revision: 305824
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=305824
Log:
freebsd: ptnet_rx_eof: introduce ptnet_rx_slot() to improve readability
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 Jul 8 15:43:27 2016 (r305823)
+++ soc2016/vincenzo/head/sys/dev/netmap/if_ptnet.c Fri Jul 8 15:43:36 2016 (r305824)
@@ -1532,6 +1532,43 @@
return ptnet_drain_transmit_queue(pq);
}
+static inline int
+ptnet_rx_slot(uint8_t *nmbuf, unsigned int nmbuf_len, struct mbuf **mtail,
+ uint8_t **mdata)
+{
+ do {
+ unsigned int copy;
+
+ if ((*mtail)->m_len == MCLBYTES) {
+ struct mbuf *mf;
+
+ mf = m_getcl(M_NOWAIT, MT_DATA, 0);
+ if (unlikely(!mf)) {
+ return ENOMEM;
+ }
+
+ (*mtail)->m_next = mf;
+ (*mtail) = mf;
+ *mdata = mtod(*mtail, uint8_t *);
+ (*mtail)->m_len = 0;
+ }
+
+ copy = MCLBYTES - (*mtail)->m_len;
+ if (nmbuf_len < copy) {
+ copy = nmbuf_len;
+ }
+
+ memcpy(*mdata, nmbuf, copy);
+
+ nmbuf += copy;
+ nmbuf_len -= copy;
+ *mdata += copy;
+ (*mtail)->m_len += copy;
+ } while (nmbuf_len);
+
+ return 0;
+}
+
static int
ptnet_rx_eof(struct ptnet_queue *pq)
{
@@ -1604,6 +1641,8 @@
mtail->m_len = 0;
for (;;) {
+ int err;
+
slot = ring->slot + head;
nmbuf_len = slot->len;
nmbuf = NMB(na, slot);
@@ -1615,48 +1654,22 @@
head, ring->tail, nmbuf_len,
slot->flags));
- do {
- unsigned int copy;
-
- if (mtail->m_len == MCLBYTES) {
- struct mbuf *mf;
-
- mf = m_getcl(M_NOWAIT, MT_DATA, 0);
- if (unlikely(!mf)) {
- /* Ouch. We ran out of memory
- * while processing a packet.
- * We have to restore the
- * previous head position,
- * free the mbuf chain, and
- * schedule the taskqueue to
- * give the packet another
- * chance. */
- head = prev_head;
- m_freem(mhead);
- taskqueue_enqueue(pq->taskq,
- &pq->task);
- goto escape;
- }
-
- mtail->m_next = mf;
- mtail = mf;
- mdata = mtod(mtail, uint8_t *);
- mtail->m_len = 0;
- }
-
- copy = MCLBYTES - mtail->m_len;
- if (nmbuf_len < copy) {
- copy = nmbuf_len;
- }
-
- memcpy(mdata, nmbuf, copy);
-
- nmbuf += copy;
- nmbuf_len -= copy;
- mdata += copy;
- mtail->m_len += copy;
- } while (nmbuf_len);
-
+ err = ptnet_rx_slot(nmbuf, nmbuf_len, &mtail, &mdata);
+ if (unlikely(err)) {
+ /* Ouch. We ran out of memory
+ * while processing a packet.
+ * We have to restore the
+ * previous head position,
+ * free the mbuf chain, and
+ * schedule the taskqueue to
+ * give the packet another
+ * chance. */
+ head = prev_head;
+ m_freem(mhead);
+ taskqueue_enqueue(pq->taskq,
+ &pq->task);
+ goto escape;
+ }
head = nm_next(head, lim);
if (!(slot->flags & NS_MOREFRAG)) {
More information about the svn-soc-all
mailing list