[rtems commit] bsp/mpc55xx: SMSC9218i avoid mbuf migration
Sebastian Huber
sebh at rtems.org
Fri Nov 2 08:33:50 UTC 2012
Module: rtems
Branch: master
Commit: 20e1e769f84089804dc94737c7aff595fc2397de
Changeset: http://git.rtems.org/rtems/commit/?id=20e1e769f84089804dc94737c7aff595fc2397de
Author: Sebastian Huber <sebastian.huber at embedded-brains.de>
Date: Wed Oct 31 17:03:06 2012 +0100
bsp/mpc55xx: SMSC9218i avoid mbuf migration
The receive task will only hand over a mbuf if it gets a new one
immediately. This avoids mbuf migration out of the receive task in case
of overload.
---
.../libbsp/powerpc/mpc55xxevb/network/smsc9218i.c | 39 ++++++++++++++------
1 files changed, 28 insertions(+), 11 deletions(-)
diff --git a/c/src/lib/libbsp/powerpc/mpc55xxevb/network/smsc9218i.c b/c/src/lib/libbsp/powerpc/mpc55xxevb/network/smsc9218i.c
index 2a03f12..0747c3d 100644
--- a/c/src/lib/libbsp/powerpc/mpc55xxevb/network/smsc9218i.c
+++ b/c/src/lib/libbsp/powerpc/mpc55xxevb/network/smsc9218i.c
@@ -810,23 +810,37 @@ static void smsc9218i_media_status_change(
smsc9218i_mac_write(regs, SMSC9218I_MAC_CR, mac_cr);
}
-static void smsc9218i_new_mbuf(
+static bool smsc9218i_new_mbuf(
struct ifnet *ifp,
smsc9218i_receive_job_control *jc,
- int i
+ int i,
+ struct mbuf *old_m
)
{
- struct mbuf *m = m_gethdr(M_WAIT, MT_DATA);
+ bool ok = false;
+ int wait = old_m != NULL ? M_DONTWAIT : M_WAIT;
+ struct mbuf *new_m = m_gethdr(wait, MT_DATA);
struct tcd_t *tcd = &jc->tcd_table [i];
char *data = NULL;
- m->m_pkthdr.rcvif = ifp;
- MCLGET(m, M_WAIT);
+ if (new_m != NULL ) {
+ new_m->m_pkthdr.rcvif = ifp;
+ MCLGET(new_m, wait);
- data = mtod(m, char *);
- m->m_data = data + SMSC9218I_RX_DATA_OFFSET + ETHER_HDR_LEN;
+ if ((new_m->m_flags & M_EXT) != 0) {
+ ok = true;
+ } else {
+ m_free(new_m);
+ new_m = old_m;
+ }
+ } else {
+ new_m = old_m;
+ }
- jc->mbuf_table [i] = m;
+ data = mtod(new_m, char *);
+ new_m->m_data = data + SMSC9218I_RX_DATA_OFFSET + ETHER_HDR_LEN;
+
+ jc->mbuf_table [i] = new_m;
tcd->DADDR = (uint32_t) data;
tcd->BMF.R = SMSC9218I_TCD_BMF_LINK;
@@ -836,6 +850,8 @@ static void smsc9218i_new_mbuf(
data,
SMSC9218I_RX_DATA_OFFSET + ETHER_HDR_LEN + ETHERMTU + ETHER_CRC_LEN
);
+
+ return ok;
}
static void smsc9218i_init_receive_jobs(
@@ -868,7 +884,7 @@ static void smsc9218i_init_receive_jobs(
tcd->CDF.B.DOFF = 4;
tcd->DLAST_SGA = (int32_t) next_tcd;
- smsc9218i_new_mbuf(ifp, jc, i);
+ smsc9218i_new_mbuf(ifp, jc, i, NULL);
}
}
@@ -889,8 +905,9 @@ static void smsc9218i_ether_input(
(mtod(m, char *) - ETHER_HDR_LEN);
++e->received_frames;
- ether_input(ifp, eh, m);
- smsc9218i_new_mbuf(ifp, jc, c);
+ if (smsc9218i_new_mbuf(ifp, jc, c, m)) {
+ ether_input(ifp, eh, m);
+ }
c = (c + 1) % SMSC9218I_RX_JOBS;
}
More information about the vc
mailing list