svn commit: r213156 - head/sys/mips/cavium/octe
Juli Mallett
jmallett at FreeBSD.org
Sat Sep 25 04:39:13 UTC 2010
Author: jmallett
Date: Sat Sep 25 04:39:12 2010
New Revision: 213156
URL: http://svn.freebsd.org/changeset/base/213156
Log:
o) Send mbufs to BPF listeners from within cvm_oct_xmit().
o) Pin receive threads when they're running since we do access some core-local
resources.
Modified:
head/sys/mips/cavium/octe/ethernet-rx.c
head/sys/mips/cavium/octe/ethernet-tx.c
head/sys/mips/cavium/octe/octe.c
Modified: head/sys/mips/cavium/octe/ethernet-rx.c
==============================================================================
--- head/sys/mips/cavium/octe/ethernet-rx.c Sat Sep 25 04:26:40 2010 (r213155)
+++ head/sys/mips/cavium/octe/ethernet-rx.c Sat Sep 25 04:39:12 2010 (r213156)
@@ -37,6 +37,8 @@ __FBSDID("$FreeBSD$");
#include <sys/kernel.h>
#include <sys/mbuf.h>
#include <sys/socket.h>
+#include <sys/proc.h>
+#include <sys/sched.h>
#include <sys/smp.h>
#include <sys/taskqueue.h>
@@ -167,7 +169,7 @@ static inline int cvm_oct_check_rcv_erro
*/
void cvm_oct_tasklet_rx(void *context, int pending)
{
- const int coreid = cvmx_get_core_num();
+ int coreid;
uint64_t old_group_mask;
uint64_t old_scratch;
int rx_count = 0;
@@ -175,6 +177,9 @@ void cvm_oct_tasklet_rx(void *context, i
int num_freed;
int packet_not_copied;
+ sched_pin();
+ coreid = cvmx_get_core_num();
+
/* Prefetch cvm_oct_device since we know we need it soon */
CVMX_PREFETCH(cvm_oct_device, 0);
@@ -388,6 +393,7 @@ void cvm_oct_tasklet_rx(void *context, i
}
}
}
+ sched_unpin();
}
Modified: head/sys/mips/cavium/octe/ethernet-tx.c
==============================================================================
--- head/sys/mips/cavium/octe/ethernet-tx.c Sat Sep 25 04:26:40 2010 (r213155)
+++ head/sys/mips/cavium/octe/ethernet-tx.c Sat Sep 25 04:39:12 2010 (r213156)
@@ -38,6 +38,7 @@ __FBSDID("$FreeBSD$");
#include <sys/mbuf.h>
#include <sys/socket.h>
+#include <net/bpf.h>
#include <net/ethernet.h>
#include <net/if.h>
@@ -239,6 +240,9 @@ int cvm_oct_xmit(struct mbuf *m, struct
} else {
/* Put this packet on the queue to be freed later */
_IF_ENQUEUE(&priv->tx_free_queue[qos], m);
+
+ /* Pass it to any BPF listeners. */
+ ETHER_BPF_MTAP(ifp, m);
}
if (work != NULL)
cvmx_fpa_free(work, CVMX_FPA_WQE_POOL, DONT_WRITEBACK(1));
Modified: head/sys/mips/cavium/octe/octe.c
==============================================================================
--- head/sys/mips/cavium/octe/octe.c Sat Sep 25 04:26:40 2010 (r213155)
+++ head/sys/mips/cavium/octe/octe.c Sat Sep 25 04:39:12 2010 (r213156)
@@ -310,24 +310,6 @@ octe_start(struct ifnet *ifp)
OCTE_TX_UNLOCK(priv);
- /*
- * XXX
- *
- * We may not be able to pass the mbuf up to BPF for one of
- * two very good reasons:
- * (1) immediately after our inserting it another CPU may be
- * kind enough to free it for us.
- * (2) m_collapse gets called on m and we don't get back the
- * modified pointer.
- *
- * We have some options other than an m_dup route:
- * (1) use a mutex or spinlock to prevent another CPU from
- * freeing it. We could lock the tx_free_list's lock,
- * that would make sense.
- * (2) get back the new mbuf pointer.
- * (3) do the collapse here.
- */
-
if (priv->queue != -1) {
error = cvm_oct_xmit(m, ifp);
} else {
More information about the svn-src-all
mailing list