svn commit: r192190 - projects/pnet/sys/net
Robert Watson
rwatson at FreeBSD.org
Sat May 16 06:49:06 UTC 2009
Author: rwatson
Date: Sat May 16 06:49:05 2009
New Revision: 192190
URL: http://svn.freebsd.org/changeset/base/192190
Log:
Add netisr2_dispatch_if() and netisr2_queue_if(), which accept an explicit
ifnet argument. For now we just use it to contribute to an overall flow
identifier, but in the future we might want to use it as a source of work
placement policy.
Implement netisr_dispatch() and netisr_queue() for netisr2, which allows
existing netisr dispatch points to be used unchanged. These are simple
wrappers around netisr2_*_if(), and pass in the mbuf's receieve interface
pointer, which will cause netisr2 to distribute work to threads even
without protocol- or driver-generated flow IDs.
When there's only one netisr2 worker, don't bother with flow IDs, CPU
lookups, etc, just use the one thread, avoiding overhead.
Rename netisr2_deregister() to netisr2_unregister() to match existing
netisr naming convention.
Modified:
projects/pnet/sys/net/netisr.c
projects/pnet/sys/net/netisr2.c
projects/pnet/sys/net/netisr2.h
Modified: projects/pnet/sys/net/netisr.c
==============================================================================
--- projects/pnet/sys/net/netisr.c Sat May 16 06:42:32 2009 (r192189)
+++ projects/pnet/sys/net/netisr.c Sat May 16 06:49:05 2009 (r192190)
@@ -28,6 +28,7 @@
*/
#include "opt_device_polling.h"
+#include "opt_netisr.h"
#include <sys/param.h>
#include <sys/bus.h>
@@ -149,6 +150,7 @@ netisr_processqueue(struct netisr *ni)
/*
* Call the netisr directly instead of queueing the packet, if possible.
*/
+#ifndef NETISR2
void
netisr_dispatch(int num, struct mbuf *m)
{
@@ -209,6 +211,7 @@ netisr_queue(int num, struct mbuf *m)
schednetisr(num);
return (0);
}
+#endif /* !NETISR2 */
static void
swi_net(void *dummy)
Modified: projects/pnet/sys/net/netisr2.c
==============================================================================
--- projects/pnet/sys/net/netisr2.c Sat May 16 06:42:32 2009 (r192189)
+++ projects/pnet/sys/net/netisr2.c Sat May 16 06:49:05 2009 (r192190)
@@ -352,20 +352,20 @@ netisr2_drain_proto(struct netisr_work *
/*
* Remove the registration of a network protocol, which requires clearing
* per-protocol fields across all workstreams, including freeing all mbufs in
- * the queues at time of deregister. All work in netisr2 is briefly
+ * the queues at time of unregister. All work in netisr2 is briefly
* suspended while this takes place.
*/
void
-netisr2_deregister(u_int proto)
+netisr2_unregister(u_int proto)
{
struct netisr_work *npwp;
int i;
NETISR_WLOCK();
KASSERT(proto < NETISR_MAXPROT,
- ("netisr_deregister(%d): protocol too big", proto));
+ ("netisr_unregister(%d): protocol too big", proto));
KASSERT(np[proto].np_func != NULL,
- ("netisr_deregister(%d): protocol not registered", proto));
+ ("netisr_unregister(%d): protocol not registered", proto));
np[proto].np_name = NULL;
np[proto].np_func = NULL;
@@ -401,6 +401,14 @@ netisr2_selectcpu(struct netisr_proto *n
NETISR_LOCK_ASSERT();
+ /*
+ * In the event we have only one worker, shortcut and deliver to it
+ * without further ado.
+ */
+ if (nws_count == 1) {
+ *cpuidp = nws_array[0];
+ return (m);
+ }
if (!(m->m_flags & M_FLOWID) && npp->np_m2flow != NULL) {
m = npp->np_m2flow(m);
if (m == NULL)
@@ -597,6 +605,20 @@ netisr2_queue(u_int proto, uintptr_t sou
}
int
+netisr2_queue_if(u_int proto, struct ifnet *ifp, struct mbuf *m)
+{
+
+ return (netisr2_queue(proto, (uintptr_t)ifp, m));
+}
+
+int
+netisr_queue(int proto, struct mbuf *m)
+{
+
+ return (netisr2_queue_if(proto, m->m_pkthdr.rcvif, m));
+}
+
+int
netisr2_dispatch(u_int proto, uintptr_t source, struct mbuf *m)
{
struct netisr_workstream *nwsp;
@@ -623,6 +645,20 @@ netisr2_dispatch(u_int proto, uintptr_t
return (0);
}
+int
+netisr2_dispatch_if(u_int proto, struct ifnet *ifp, struct mbuf *m)
+{
+
+ return (netisr2_dispatch(proto, (uintptr_t)ifp, m));
+}
+
+void
+netisr_dispatch(int proto, struct mbuf *m)
+{
+
+ (void)netisr2_dispatch_if(proto, m->m_pkthdr.rcvif, m);
+}
+
static void
netisr2_start_swi(u_int cpuid, struct pcpu *pc)
{
Modified: projects/pnet/sys/net/netisr2.h
==============================================================================
--- projects/pnet/sys/net/netisr2.h Sat May 16 06:42:32 2009 (r192189)
+++ projects/pnet/sys/net/netisr2.h Sat May 16 06:49:05 2009 (r192190)
@@ -69,15 +69,19 @@ void netisr2_register(u_int proto, const
netisr_m2flow_t m2flow, netisr_flow2cpu_t flow2cpu, u_int max);
/*
- * Deregister a protocol handler.
+ * Unregister a protocol handler.
*/
-void netisr2_deregister(u_int proto);
+void netisr2_unregister(u_int proto);
/*
* Process a packet destined for a protocol, and attempt direct dispatch.
*/
+//int netisr_dispatch(u_int proto, struct mbuf *m);
+//int netisr_queue(u_int proto, struct mbuf *m);
int netisr2_dispatch(u_int proto, uintptr_t source, struct mbuf *m);
+int netisr2_dispatch_if(u_int proto, struct ifnet *ifp, struct mbuf *m);
int netisr2_queue(u_int proto, uintptr_t source, struct mbuf *m);
+int netisr2_queue_if(u_int proto, struct ifnet *ifp, struct mbuf *m);
/*
* Provide a default implementation of "map a flow ID to a cpu ID".
More information about the svn-src-projects
mailing list