On Tue, Dec 29, 2020 at 11:18:26PM +0100, Claudio Jeker wrote:
> Generally I would prefer to go for direct dispatch and not use netisr.
> This removes a queue and a scheduling point and should help reduce the
> latency in processing pppoe packages.
>
> This does not mean that I'm against this change. I just think it may be
> benefitial to move one step further.
Here's a diff that removes the kernel lock and calls input routines
directly instead of (de)queuing through netisr.
Previously, if_netisr() handled the net lock around those calls, now
if_input_process() does it before calling ether_input(), so no need to
add or remove NET_*LOCK() anywhere.
I'm running this on my home router without any regression so far.
Feedback? Objections? OK?
NB: I want to commit this separately modulo the previous diff.
Index: if.c
===================================================================
RCS file: /cvs/src/sys/net/if.c,v
retrieving revision 1.621
diff -u -p -r1.621 if.c
--- if.c 15 Dec 2020 03:43:34 -0000 1.621
+++ if.c 3 Jan 2021 21:38:57 -0000
@@ -68,7 +68,6 @@
#include "pf.h"
#include "pfsync.h"
#include "ppp.h"
-#include "pppoe.h"
#include "switch.h"
#include "if_wg.h"
@@ -902,13 +901,6 @@ if_netisr(void *unused)
if (n & (1 << NETISR_SWITCH)) {
KERNEL_LOCK();
switchintr();
- KERNEL_UNLOCK();
- }
-#endif
-#if NPPPOE > 0
- if (n & (1 << NETISR_PPPOE)) {
- KERNEL_LOCK();
- pppoeintr();
KERNEL_UNLOCK();
}
#endif
Index: if_ethersubr.c
===================================================================
RCS file: /cvs/src/sys/net/if_ethersubr.c,v
retrieving revision 1.267
diff -u -p -r1.267 if_ethersubr.c
--- if_ethersubr.c 1 Oct 2020 05:14:10 -0000 1.267
+++ if_ethersubr.c 3 Jan 2021 21:41:17 -0000
@@ -532,9 +532,9 @@ ether_input(struct ifnet *ifp, struct mb
}
#endif
if (etype == ETHERTYPE_PPPOEDISC)
- niq_enqueue(&pppoediscinq, m);
+ pppoe_disc_input(m);
else
- niq_enqueue(&pppoeinq, m);
+ pppoe_data_input(m);
return;
#endif
#ifdef MPLS
Index: if_pppoe.c
===================================================================
RCS file: /cvs/src/sys/net/if_pppoe.c,v
retrieving revision 1.75
diff -u -p -r1.75 if_pppoe.c
--- if_pppoe.c 30 Dec 2020 13:18:07 -0000 1.75
+++ if_pppoe.c 4 Jan 2021 00:14:30 -0000
@@ -143,14 +143,8 @@ struct pppoe_softc {
struct timeval sc_session_time; /* [N] time the session was established
*/
};
-/* incoming traffic will be queued here */
-struct niqueue pppoediscinq = NIQUEUE_INITIALIZER(IFQ_MAXLEN, NETISR_PPPOE);
-struct niqueue pppoeinq = NIQUEUE_INITIALIZER(IFQ_MAXLEN, NETISR_PPPOE);
-
/* input routines */
-static void pppoe_disc_input(struct mbuf *);
static void pppoe_dispatch_disc_pkt(struct mbuf *);
-static void pppoe_data_input(struct mbuf *);
/* management routines */
void pppoeattach(int);
@@ -341,21 +335,6 @@ pppoe_find_softc_by_hunique(u_int8_t *to
return (sc);
}
-/* Interface interrupt handler routine. */
-void
-pppoeintr(void)
-{
- struct mbuf *m;
-
- NET_ASSERT_LOCKED();
-
- while ((m = niq_dequeue(&pppoediscinq)) != NULL)
- pppoe_disc_input(m);
-
- while ((m = niq_dequeue(&pppoeinq)) != NULL)
- pppoe_data_input(m);
-}
-
/* Analyze and handle a single received packet while not in session state. */
static void
pppoe_dispatch_disc_pkt(struct mbuf *m)
@@ -649,7 +628,7 @@ done:
}
/* Input function for discovery packets. */
-static void
+void
pppoe_disc_input(struct mbuf *m)
{
/* avoid error messages if there is not a single pppoe instance */
@@ -661,7 +640,7 @@ pppoe_disc_input(struct mbuf *m)
}
/* Input function for data packets */
-static void
+void
pppoe_data_input(struct mbuf *m)
{
struct pppoe_softc *sc;
Index: if_pppoe.h
===================================================================
RCS file: /cvs/src/sys/net/if_pppoe.h,v
retrieving revision 1.6
diff -u -p -r1.6 if_pppoe.h
--- if_pppoe.h 10 Apr 2015 13:58:20 -0000 1.6
+++ if_pppoe.h 3 Jan 2021 21:46:11 -0000
@@ -66,10 +66,8 @@ struct pppoeconnectionstate {
#ifdef _KERNEL
-extern struct niqueue pppoediscinq;
-extern struct niqueue pppoeinq;
-
-void pppoeintr(void);
+void pppoe_disc_input(struct mbuf *);
+void pppoe_data_input(struct mbuf *);
#endif /* _KERNEL */
#endif /* _NET_IF_PPPOE_H_ */
Index: netisr.h
===================================================================
RCS file: /cvs/src/sys/net/netisr.h,v
retrieving revision 1.53
diff -u -p -r1.53 netisr.h
--- netisr.h 6 Aug 2020 12:00:46 -0000 1.53
+++ netisr.h 3 Jan 2021 21:38:37 -0000
@@ -45,7 +45,6 @@
#define NETISR_ARP 18 /* same as AF_LINK */
#define NETISR_PPP 28 /* for PPP processing */
#define NETISR_BRIDGE 29 /* for bridge processing */
-#define NETISR_PPPOE 30 /* for pppoe processing */
#define NETISR_SWITCH 31 /* for switch dataplane */
#ifndef _LOCORE