Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/dev/pci/ixgbe Use m_adj(ETHER_ALIGN) more. Tested by me ...
details: https://anonhg.NetBSD.org/src/rev/33548ca98450
branches: trunk
changeset: 985321:33548ca98450
user: msaitoh <msaitoh%NetBSD.org@localhost>
date: Thu Aug 19 10:18:13 2021 +0000
description:
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.
diffstat:
sys/dev/pci/ixgbe/ix_txrx.c | 64 +++++++++++++++++++++++++++++-----------
sys/dev/pci/ixgbe/ixgbe_osdep.h | 21 +------------
2 files changed, 47 insertions(+), 38 deletions(-)
diffs (168 lines):
diff -r 1a49c4a89952 -r 33548ca98450 sys/dev/pci/ixgbe/ix_txrx.c
--- a/sys/dev/pci/ixgbe/ix_txrx.c Thu Aug 19 09:05:22 2021 +0000
+++ b/sys/dev/pci/ixgbe/ix_txrx.c Thu Aug 19 10:18:13 2021 +0000
@@ -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 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 @@
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 @@
}
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 @@
*/
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;
diff -r 1a49c4a89952 -r 33548ca98450 sys/dev/pci/ixgbe/ixgbe_osdep.h
--- a/sys/dev/pci/ixgbe/ixgbe_osdep.h Thu Aug 19 09:05:22 2021 +0000
+++ b/sys/dev/pci/ixgbe/ixgbe_osdep.h Thu Aug 19 10:18:13 2021 +0000
@@ -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 @@
#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;
Home |
Main Index |
Thread Index |
Old Index