Module Name:    src
Committed By:   msaitoh
Date:           Thu Aug 19 10:18:13 UTC 2021

Modified Files:
        src/sys/dev/pci/ixgbe: ix_txrx.c ixgbe_osdep.h

Log Message:
 Use m_adj(ETHER_ALIGN) more. Tested by me (amd64,aarch64) and rin (alpha).

 - Align with ETHER_ALIGN everywhere where mbuf is allocated.
 - Remove extra setting of M_PKTHDR. No functional change.
 - Add comment.


To generate a diff of this commit:
cvs rdiff -u -r1.85 -r1.86 src/sys/dev/pci/ixgbe/ix_txrx.c
cvs rdiff -u -r1.28 -r1.29 src/sys/dev/pci/ixgbe/ixgbe_osdep.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/pci/ixgbe/ix_txrx.c
diff -u src/sys/dev/pci/ixgbe/ix_txrx.c:1.85 src/sys/dev/pci/ixgbe/ix_txrx.c:1.86
--- src/sys/dev/pci/ixgbe/ix_txrx.c:1.85	Thu Aug 19 08:53:21 2021
+++ src/sys/dev/pci/ixgbe/ix_txrx.c	Thu Aug 19 10:18:13 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: ix_txrx.c,v 1.85 2021/08/19 08:53:21 msaitoh Exp $ */
+/* $NetBSD: ix_txrx.c,v 1.86 2021/08/19 10:18:13 msaitoh Exp $ */
 
 /******************************************************************************
 
@@ -64,7 +64,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ix_txrx.c,v 1.85 2021/08/19 08:53:21 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ix_txrx.c,v 1.86 2021/08/19 10:18:13 msaitoh Exp $");
 
 #include "opt_inet.h"
 #include "opt_inet6.h"
@@ -96,6 +96,10 @@ static bool ixgbe_rsc_enable = FALSE;
  */
 static int atr_sample_rate = 20;
 
+#define IXGBE_M_ADJ(adapter, rxr, mp)					\
+	if (adapter->max_frame_size <= (rxr->mbuf_sz - ETHER_ALIGN))	\
+		m_adj(mp, ETHER_ALIGN)
+
 /************************************************************************
  *  Local Function prototypes
  ************************************************************************/
@@ -1353,14 +1357,11 @@ ixgbe_refresh_mbufs(struct rx_ring *rxr,
 				rxr->no_jmbuf.ev_count++;
 				goto update;
 			}
-			if (adapter->max_frame_size
-			    <= (rxr->mbuf_sz - ETHER_ALIGN))
-				m_adj(mp, ETHER_ALIGN);
+			mp->m_pkthdr.len = mp->m_len = rxr->mbuf_sz;
+			IXGBE_M_ADJ(adapter, rxr, mp);
 		} else
 			mp = rxbuf->buf;
 
-		mp->m_pkthdr.len = mp->m_len = rxr->mbuf_sz;
-
 		/* If we're dealing with an mbuf that was copied rather
 		 * than replaced, there's no need to go through busdma.
 		 */
@@ -1554,6 +1555,7 @@ ixgbe_setup_receive_ring(struct rx_ring 
 		}
 		mp = rxbuf->buf;
 		mp->m_pkthdr.len = mp->m_len = rxr->mbuf_sz;
+		IXGBE_M_ADJ(adapter, rxr, mp);
 		/* Get the memory mapping */
 		error = bus_dmamap_load_mbuf(rxr->ptag->dt_dmat, rxbuf->pmap,
 		    mp, BUS_DMA_NOWAIT);
@@ -1964,41 +1966,67 @@ ixgbe_rxeof(struct ix_queue *que)
 		 */
 		sendmp = rbuf->fmp;
 		if (sendmp != NULL) {  /* secondary frag */
+			/* Update new (used in future) mbuf */
+			newmp->m_pkthdr.len = newmp->m_len = rxr->mbuf_sz;
+			IXGBE_M_ADJ(adapter, rxr, newmp);
 			rbuf->buf = newmp;
 			rbuf->fmp = NULL;
+
+			/* For secondary frag */
 			mp->m_len = len;
 			mp->m_flags &= ~M_PKTHDR;
+
+			/* For sendmp */
 			sendmp->m_pkthdr.len += mp->m_len;
 		} else {
 			/*
-			 * Optimize.  This might be a small packet,
-			 * maybe just a TCP ACK.  Do a fast copy that
-			 * is cache aligned into a new mbuf, and
-			 * leave the old mbuf+cluster for re-use.
+			 * It's the first segment of a multi descriptor
+			 * packet or a single segment which contains a full
+			 * packet.
+			 */
+
+			/*
+			 * Optimize.  This might be a small packet, maybe just
+			 * a TCP ACK. Copy into a new mbuf, and Leave the old
+			 * mbuf+cluster for re-use.
 			 */
 			if (eop && len <= adapter->rx_copy_len) {
 				sendmp = m_gethdr(M_NOWAIT, MT_DATA);
 				if (sendmp != NULL) {
-					sendmp->m_data += IXGBE_RX_COPY_ALIGN;
-					ixgbe_bcopy(mp->m_data, sendmp->m_data,
-					    len);
-					sendmp->m_len = len;
+					sendmp->m_data += ETHER_ALIGN;
+					memcpy(mtod(sendmp, void *),
+					    mtod(mp, void *), len);
 					rxr->rx_copies.ev_count++;
 					rbuf->flags |= IXGBE_RX_COPY;
 
+					/*
+					 * Free pre-allocated mbuf anymore
+					 * because we recycle the current
+					 * buffer.
+					 */
 					m_freem(newmp);
 				}
 			}
+
+			/*
+			 * Two cases:
+			 * a) non small packet(i.e. !IXGBE_RX_COPY).
+			 * b) a small packet but the above m_gethdr() failed.
+			 */
 			if (sendmp == NULL) {
+				/* Update new (used in future) mbuf */
+				newmp->m_pkthdr.len = newmp->m_len
+				    = rxr->mbuf_sz;
+				IXGBE_M_ADJ(adapter, rxr, newmp);
 				rbuf->buf = newmp;
 				rbuf->fmp = NULL;
-				mp->m_len = len;
+
+				/* For sendmp */
 				sendmp = mp;
 			}
 
 			/* first desc of a non-ps chain */
-			sendmp->m_flags |= M_PKTHDR;
-			sendmp->m_pkthdr.len = len;
+			sendmp->m_pkthdr.len = sendmp->m_len = len;
 		}
 		++processed;
 

Index: src/sys/dev/pci/ixgbe/ixgbe_osdep.h
diff -u src/sys/dev/pci/ixgbe/ixgbe_osdep.h:1.28 src/sys/dev/pci/ixgbe/ixgbe_osdep.h:1.29
--- src/sys/dev/pci/ixgbe/ixgbe_osdep.h:1.28	Tue Sep  1 04:19:16 2020
+++ src/sys/dev/pci/ixgbe/ixgbe_osdep.h	Thu Aug 19 10:18:13 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: ixgbe_osdep.h,v 1.28 2020/09/01 04:19:16 msaitoh Exp $ */
+/* $NetBSD: ixgbe_osdep.h,v 1.29 2021/08/19 10:18:13 msaitoh Exp $ */
 
 /******************************************************************************
   SPDX-License-Identifier: BSD-3-Clause
@@ -167,25 +167,6 @@ void prefetch(void *x)
 #define prefetch(x)
 #endif
 
-/*
- * Optimized bcopy thanks to Luigi Rizzo's investigative work.  Assumes
- * non-overlapping regions and 32-byte padding on both src and dst.
- */
-static __inline int
-ixgbe_bcopy(void *restrict _src, void *restrict _dst, int l)
-{
-	uint64_t *src = _src;
-	uint64_t *dst = _dst;
-
-	for (; l > 0; l -= 32) {
-		*dst++ = *src++;
-		*dst++ = *src++;
-		*dst++ = *src++;
-		*dst++ = *src++;
-	}
-	return (0);
-}
-
 struct ixgbe_osdep
 {
 	struct ethercom    ec;

Reply via email to