[PATCH rtems 13/18] mv643xx_eth_bsdnet.c: reworked buffer-iterator code.

Vijay Kumar Banerjee vijay at rtems.org
Tue Mar 30 01:27:45 UTC 2021


From: till straumann <till.straumann at alumni.tu-berlin.de>

Must be careful to skip empty buffers and to correctly
identify the last non-empty buffer (since that is the one
whose associated descriptor stores the head of the chain
for deferred cleanup).

Update #4344
---
 .../beatnik/net/if_mve/mv643xx_eth_bsdnet.c   | 42 +++++++++++--------
 1 file changed, 25 insertions(+), 17 deletions(-)

diff --git a/bsps/powerpc/beatnik/net/if_mve/mv643xx_eth_bsdnet.c b/bsps/powerpc/beatnik/net/if_mve/mv643xx_eth_bsdnet.c
index 2bafe09ac7..f8400c9f13 100644
--- a/bsps/powerpc/beatnik/net/if_mve/mv643xx_eth_bsdnet.c
+++ b/bsps/powerpc/beatnik/net/if_mve/mv643xx_eth_bsdnet.c
@@ -245,8 +245,8 @@ struct mveth_softc {
 
 typedef struct BsdMveIter {
 	MveEthBufIter it;
-	struct mbuf  *m;
-	struct mbuf  *h;
+	struct mbuf  *next;
+	struct mbuf  *head;
 } BsdMveIter;
 
 /* GLOBAL VARIABLES */
@@ -462,21 +462,34 @@ bail:
 	return m;
 }
 
-static MveEthBufIter *fillIter(struct mbuf *m, BsdMveIter *it)
+static inline struct mbuf *skipEmpty(struct mbuf *m)
 {
-	if ( (it->m = (void*)m) ) {
+	while ( m && ( 0 == m->m_len ) ) {
+		m = m->m_next;
+	}
+	return m;
+}
+
+static MveEthBufIter *nextBuf(MveEthBufIter *arg)
+{
+BsdMveIter  *it = (BsdMveIter*)arg;
+struct mbuf *m;
+	if ( (m = it->next) ) {
+		it->next    = skipEmpty( m->m_next );
 		it->it.data = mtod(m, void*);
 		it->it.len  = m->m_len;
-		it->it.uptr = m->m_next ? it->h : 0;
+		it->it.uptr = it->next ? 0 : it->head;
 		return (MveEthBufIter*)it;
 	}
 	return 0;
 }
 
-static MveEthBufIter *nextBuf(MveEthBufIter *arg)
+static MveEthBufIter *initIter(BsdMveIter *it, struct mbuf *m)
 {
-BsdMveIter *it = (BsdMveIter*)arg;
-	return fillIter( it->m->m_next, it );
+	it->head = m;
+	it->next = skipEmpty( m );
+	/* Fill with first buf info */
+	return nextBuf( &it->it );
 }
 
 int
@@ -501,12 +514,10 @@ startover:
 		return 0;
 
 	/* find first mbuf with actual data */
-	while ( 0 == m1->m_len ) {
-		if ( ! (m1 = m1->m_next) ) {
-			/* end reached and still no data to send ?? */
-			m_freem(m_head);
-			return 0;
-		}
+	if ( ! initIter( &iter, m_head ) ) {
+		/* end reached and still no data to send ?? */
+		m_freem(m_head);
+		return 0;
 	}
 
 #ifdef MVETH_DEBUG_TX_DUMP
@@ -524,9 +535,6 @@ startover:
 	}
 #endif
 
-	fillIter( m_head, &iter );
-	iter.h = m_head;
-
 	rval = BSP_mve_send_buf_chain( mp, nextBuf, &iter.it );
 
 	if ( -2 == rval ) {
-- 
2.26.2



More information about the devel mailing list