Module Name:    src
Committed By:   thorpej
Date:           Sat Sep  3 02:25:00 UTC 2022

Modified Files:
        src/sys/net: if_ethersubr.c if_gre.c if_loop.c if_mpls.c
            netisr_dispatch.h
        src/sys/netmpls: mpls_proto.c mpls_var.h
        src/sys/rump/net/lib/libnetmpls: netmpls_component.c

Log Message:
Convert MPLS from a legacy netisr to pktqueue.


To generate a diff of this commit:
cvs rdiff -u -r1.318 -r1.319 src/sys/net/if_ethersubr.c
cvs rdiff -u -r1.182 -r1.183 src/sys/net/if_gre.c
cvs rdiff -u -r1.115 -r1.116 src/sys/net/if_loop.c
cvs rdiff -u -r1.38 -r1.39 src/sys/net/if_mpls.c
cvs rdiff -u -r1.23 -r1.24 src/sys/net/netisr_dispatch.h
cvs rdiff -u -r1.32 -r1.33 src/sys/netmpls/mpls_proto.c
cvs rdiff -u -r1.2 -r1.3 src/sys/netmpls/mpls_var.h
cvs rdiff -u -r1.5 -r1.6 src/sys/rump/net/lib/libnetmpls/netmpls_component.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/net/if_ethersubr.c
diff -u src/sys/net/if_ethersubr.c:1.318 src/sys/net/if_ethersubr.c:1.319
--- src/sys/net/if_ethersubr.c:1.318	Sat Sep  3 01:48:22 2022
+++ src/sys/net/if_ethersubr.c	Sat Sep  3 02:24:59 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_ethersubr.c,v 1.318 2022/09/03 01:48:22 thorpej Exp $	*/
+/*	$NetBSD: if_ethersubr.c,v 1.319 2022/09/03 02:24:59 thorpej Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -61,7 +61,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_ethersubr.c,v 1.318 2022/09/03 01:48:22 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_ethersubr.c,v 1.319 2022/09/03 02:24:59 thorpej Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -648,12 +648,10 @@ ether_input(struct ifnet *ifp, struct mb
 	struct ethercom *ec = (struct ethercom *) ifp;
 #endif
 	pktqueue_t *pktq = NULL;
-	struct ifqueue *inq = NULL;
 	uint16_t etype;
 	struct ether_header *eh;
 	size_t ehlen;
 	static int earlypkts;
-	int isr = 0;
 
 	/* No RPS for not-IP. */
 	pktq_rps_hash_func_t rps_hash = NULL;
@@ -937,8 +935,7 @@ ether_input(struct ifnet *ifp, struct mb
 
 #ifdef MPLS
 	case ETHERTYPE_MPLS:
-		isr = NETISR_MPLS;
-		inq = &mplsintrq;
+		pktq = mpls_pktq;
 		break;
 #endif
 
@@ -946,20 +943,11 @@ ether_input(struct ifnet *ifp, struct mb
 		goto noproto;
 	}
 
-	if (__predict_true(pktq)) {
-		const uint32_t h = rps_hash ? pktq_rps_hash(&rps_hash, m) : 0;
-		if (__predict_false(!pktq_enqueue(pktq, m, h))) {
-			m_freem(m);
-		}
-		return;
-	}
-
-	if (__predict_false(!inq)) {
-		/* Should not happen. */
-		goto error;
+	KASSERT(pktq != NULL);
+	const uint32_t h = rps_hash ? pktq_rps_hash(&rps_hash, m) : 0;
+	if (__predict_false(!pktq_enqueue(pktq, m, h))) {
+		m_freem(m);
 	}
-
-	IFQ_ENQUEUE_ISR(inq, m, isr);
 	return;
 
 drop:

Index: src/sys/net/if_gre.c
diff -u src/sys/net/if_gre.c:1.182 src/sys/net/if_gre.c:1.183
--- src/sys/net/if_gre.c:1.182	Sat Sep  3 01:48:22 2022
+++ src/sys/net/if_gre.c	Sat Sep  3 02:24:59 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_gre.c,v 1.182 2022/09/03 01:48:22 thorpej Exp $ */
+/*	$NetBSD: if_gre.c,v 1.183 2022/09/03 02:24:59 thorpej Exp $ */
 
 /*
  * Copyright (c) 1998, 2008 The NetBSD Foundation, Inc.
@@ -45,7 +45,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_gre.c,v 1.182 2022/09/03 01:48:22 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_gre.c,v 1.183 2022/09/03 02:24:59 thorpej Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_atalk.h"
@@ -790,10 +790,8 @@ static int
 gre_input(struct gre_softc *sc, struct mbuf *m, const struct gre_h *gh)
 {
 	pktqueue_t *pktq = NULL;
-	struct ifqueue *ifq = NULL;
 	uint16_t flags;
 	uint32_t af;		/* af passed to BPF tap */
-	int isr = 0, s;
 	int hlen;
 
 	if_statadd2(&sc->sc_if, if_ipackets, 1, if_ibytes, m->m_pkthdr.len);
@@ -837,8 +835,7 @@ gre_input(struct gre_softc *sc, struct m
 #endif
 #ifdef MPLS
 	case ETHERTYPE_MPLS:
-		ifq = &mplsintrq;
-		isr = NETISR_MPLS;
+		pktq = mpls_pktq;
 		af = AF_MPLS;
 		break;
 #endif
@@ -860,24 +857,10 @@ gre_input(struct gre_softc *sc, struct m
 
 	m_set_rcvif(m, &sc->sc_if);
 
-	if (__predict_true(pktq)) {
-		if (__predict_false(!pktq_enqueue(pktq, m, 0))) {
-			m_freem(m);
-		}
-		return 1;
-	}
-
-	s = splnet();
-	if (IF_QFULL(ifq)) {
-		IF_DROP(ifq);
+	KASSERT(pktq != NULL);
+	if (__predict_false(!pktq_enqueue(pktq, m, 0))) {
 		m_freem(m);
-	} else {
-		IF_ENQUEUE(ifq, m);
 	}
-	/* we need schednetisr since the address family may change */
-	schednetisr(isr);
-	splx(s);
-
 	return 1;	/* packet is done, no further processing needed */
 }
 

Index: src/sys/net/if_loop.c
diff -u src/sys/net/if_loop.c:1.115 src/sys/net/if_loop.c:1.116
--- src/sys/net/if_loop.c:1.115	Sat Sep  3 01:48:22 2022
+++ src/sys/net/if_loop.c	Sat Sep  3 02:24:59 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_loop.c,v 1.115 2022/09/03 01:48:22 thorpej Exp $	*/
+/*	$NetBSD: if_loop.c,v 1.116 2022/09/03 02:24:59 thorpej Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -65,7 +65,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_loop.c,v 1.115 2022/09/03 01:48:22 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_loop.c,v 1.116 2022/09/03 02:24:59 thorpej Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -242,8 +242,7 @@ looutput(struct ifnet *ifp, struct mbuf 
     const struct rtentry *rt)
 {
 	pktqueue_t *pktq = NULL;
-	struct ifqueue *ifq = NULL;
-	int s, isr = -1;
+	int s;
 	int csum_flags;
 	int error = 0;
 	size_t pktlen;
@@ -304,11 +303,10 @@ looutput(struct ifnet *ifp, struct mbuf 
 		union mpls_shim msh;
 		msh.s_addr = MPLS_GETSADDR(rt);
 		if (msh.shim.label != MPLS_LABEL_IMPLNULL) {
-			ifq = &mplsintrq;
-			isr = NETISR_MPLS;
+			pktq = mpls_pktq;
 		}
 	}
-	if (isr != NETISR_MPLS)
+	if (pktq != mpls_pktq)
 #endif
 	switch (dst->sa_family) {
 
@@ -359,31 +357,17 @@ looutput(struct ifnet *ifp, struct mbuf 
 		goto out;
 	}
 
-	s = splnet();
-	if (__predict_true(pktq)) {
-		error = 0;
+	KASSERT(pktq != NULL);
 
-		if (__predict_true(pktq_enqueue(pktq, m, 0))) {
-			if_statadd2(ifp, if_ipackets, 1, if_ibytes, pktlen);
-		} else {
-			m_freem(m);
-			if_statinc(ifp, if_oerrors);
-			error = ENOBUFS;
-		}
-		splx(s);
-		goto out;
-	}
-	if (IF_QFULL(ifq)) {
-		IF_DROP(ifq);
+	error = 0;
+	s = splnet();
+	if (__predict_true(pktq_enqueue(pktq, m, 0))) {
+		if_statadd2(ifp, if_ipackets, 1, if_ibytes, pktlen);
+	} else {
 		m_freem(m);
-		splx(s);
-		error = ENOBUFS;
 		if_statinc(ifp, if_oerrors);
-		goto out;
+		error = ENOBUFS;
 	}
-	if_statadd2(ifp, if_ipackets, 1, if_ibytes, m->m_pkthdr.len);
-	IF_ENQUEUE(ifq, m);
-	schednetisr(isr);
 	splx(s);
 out:
 	KERNEL_UNLOCK_UNLESS_NET_MPSAFE();

Index: src/sys/net/if_mpls.c
diff -u src/sys/net/if_mpls.c:1.38 src/sys/net/if_mpls.c:1.39
--- src/sys/net/if_mpls.c:1.38	Fri Jul 29 15:25:51 2022
+++ src/sys/net/if_mpls.c	Sat Sep  3 02:24:59 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_mpls.c,v 1.38 2022/07/29 15:25:51 skrll Exp $ */
+/*	$NetBSD: if_mpls.c,v 1.39 2022/09/03 02:24:59 thorpej Exp $ */
 
 /*
  * Copyright (c) 2010 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_mpls.c,v 1.38 2022/07/29 15:25:51 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_mpls.c,v 1.39 2022/09/03 02:24:59 thorpej Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -189,18 +189,11 @@ mpls_input(struct ifnet *ifp, struct mbu
 }
 
 void
-mplsintr(void)
+mplsintr(void *arg __unused)
 {
 	struct mbuf *m;
 
-	for (;;) {
-		IFQ_LOCK(&mplsintrq);
-		IF_DEQUEUE(&mplsintrq, m);
-		IFQ_UNLOCK(&mplsintrq);
-
-		if (!m)
-			return;
-
+	while ((m = pktq_dequeue(mpls_pktq)) != NULL) {
 		if (((m->m_flags & M_PKTHDR) == 0) ||
 		    (m->m_pkthdr.rcvif_index == 0))
 			panic("mplsintr(): no pkthdr or rcvif");

Index: src/sys/net/netisr_dispatch.h
diff -u src/sys/net/netisr_dispatch.h:1.23 src/sys/net/netisr_dispatch.h:1.24
--- src/sys/net/netisr_dispatch.h:1.23	Sat Sep  3 02:07:32 2022
+++ src/sys/net/netisr_dispatch.h	Sat Sep  3 02:24:59 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: netisr_dispatch.h,v 1.23 2022/09/03 02:07:32 thorpej Exp $ */
+/* $NetBSD: netisr_dispatch.h,v 1.24 2022/09/03 02:24:59 thorpej Exp $ */
 
 #ifndef _NET_NETISR_DISPATCH_H_
 #define _NET_NETISR_DISPATCH_H_
@@ -27,8 +27,4 @@
  * their prototypes in <net/netisr.h> (if necessary).
  */
 
-#ifdef MPLS
-	DONETISR(NETISR_MPLS,mplsintr);
-#endif
-
 #endif /* !_NET_NETISR_DISPATCH_H_ */

Index: src/sys/netmpls/mpls_proto.c
diff -u src/sys/netmpls/mpls_proto.c:1.32 src/sys/netmpls/mpls_proto.c:1.33
--- src/sys/netmpls/mpls_proto.c:1.32	Mon Jan 28 12:53:01 2019
+++ src/sys/netmpls/mpls_proto.c	Sat Sep  3 02:24:59 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: mpls_proto.c,v 1.32 2019/01/28 12:53:01 martin Exp $ */
+/*	$NetBSD: mpls_proto.c,v 1.33 2022/09/03 02:24:59 thorpej Exp $ */
 
 /*
  * Copyright (c) 2010 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mpls_proto.c,v 1.32 2019/01/28 12:53:01 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mpls_proto.c,v 1.33 2022/09/03 02:24:59 thorpej Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -49,7 +49,8 @@ __KERNEL_RCSID(0, "$NetBSD: mpls_proto.c
 #include <netmpls/mpls.h>
 #include <netmpls/mpls_var.h>
 
-struct ifqueue mplsintrq;
+#define	MPLS_MAXQLEN	256
+pktqueue_t *		mpls_pktq		__read_mostly;
 
 static int mpls_attach(struct socket *, int);
 static void sysctl_net_mpls_setup(struct sysctllog **);
@@ -73,9 +74,8 @@ void mpls_init(void)
 #ifdef MBUFTRACE
 	MOWNER_ATTACH(&mpls_owner);
 #endif
-	memset(&mplsintrq, 0, sizeof(mplsintrq));
-	mplsintrq.ifq_maxlen = 256;
-	IFQ_LOCK_INIT(&mplsintrq);
+	mpls_pktq = pktq_create(MPLS_MAXQLEN, mplsintr, NULL);
+	KASSERT(mpls_pktq != NULL);
 
 	sysctl_net_mpls_setup(NULL);
 }
@@ -240,8 +240,9 @@ mpls_purgeif(struct socket *so, struct i
 static void
 sysctl_net_mpls_setup(struct sysctllog **clog)
 {
+	const struct sysctlnode *mpls_node;
 
-        sysctl_createv(clog, 0, NULL, NULL,
+        sysctl_createv(clog, 0, NULL, &mpls_node,
                        CTLFLAG_PERMANENT,
                        CTLTYPE_NODE, "mpls", NULL,
                        NULL, 0, NULL, 0,
@@ -265,12 +266,9 @@ sysctl_net_mpls_setup(struct sysctllog *
 		       SYSCTL_DESCR("Accept MPLS Frames"),
 		       NULL, 0, &mpls_frame_accept, 0,
 		       CTL_NET, PF_MPLS, CTL_CREATE, CTL_EOL);
-	sysctl_createv(clog, 0, NULL, NULL,
-		       CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
-		       CTLTYPE_INT, "ifq_len",
-		       SYSCTL_DESCR("MPLS queue length"),
-		       NULL, 0, &mplsintrq.ifq_maxlen, 0,
-		       CTL_NET, PF_MPLS, CTL_CREATE, CTL_EOL);
+
+	pktq_sysctl_setup(mpls_pktq, clog, mpls_node, CTL_CREATE);
+
 	sysctl_createv(clog, 0, NULL, NULL,
 		       CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
 		       CTLTYPE_INT, "rfc4182",
@@ -389,7 +387,6 @@ struct domain mplsdomain = {
 	.dom_maxrtkey = sizeof(union mpls_shim),
 	.dom_ifattach = NULL,
 	.dom_ifdetach = NULL,
-	.dom_ifqueues = { &mplsintrq, NULL },
 	.dom_link = { NULL },
 	.dom_mowner = MOWNER_INIT("MPLS", ""),
 	.dom_sa_cmpofs = offsetof(struct sockaddr_mpls, smpls_addr),

Index: src/sys/netmpls/mpls_var.h
diff -u src/sys/netmpls/mpls_var.h:1.2 src/sys/netmpls/mpls_var.h:1.3
--- src/sys/netmpls/mpls_var.h:1.2	Mon Aug 24 22:21:27 2015
+++ src/sys/netmpls/mpls_var.h	Sat Sep  3 02:24:59 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: mpls_var.h,v 1.2 2015/08/24 22:21:27 pooka Exp $ */
+/*	$NetBSD: mpls_var.h,v 1.3 2022/09/03 02:24:59 thorpej Exp $ */
 
 /*-
  * Copyright (c) 2010 The NetBSD Foundation, Inc.
@@ -40,6 +40,8 @@
 #include "opt_mbuftrace.h"
 #endif
 
+#include <net/pktqueue.h>
+
 #include "netmpls/mpls.h"
 
 #define MPLS_GETSADDR(rt) ntohl(((struct sockaddr_mpls*)rt_gettag(rt))->smpls_addr.s_addr)
@@ -51,14 +53,14 @@ extern int mpls_mapprec_inet;
 extern int mpls_mapclass_inet6;
 extern int mpls_icmp_respond;
 
-extern struct ifqueue mplsintrq;
+extern pktqueue_t *mpls_pktq;
 
 #ifdef MBUFTRACE
 extern struct mowner mpls_owner;
 #endif
 
 void	mpls_init(void);
-void	mplsintr(void);
+void	mplsintr(void *);
 
 struct mbuf *mpls_ttl_dec(struct mbuf *);
 

Index: src/sys/rump/net/lib/libnetmpls/netmpls_component.c
diff -u src/sys/rump/net/lib/libnetmpls/netmpls_component.c:1.5 src/sys/rump/net/lib/libnetmpls/netmpls_component.c:1.6
--- src/sys/rump/net/lib/libnetmpls/netmpls_component.c:1.5	Sun Aug  7 17:42:18 2016
+++ src/sys/rump/net/lib/libnetmpls/netmpls_component.c	Sat Sep  3 02:24:59 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: netmpls_component.c,v 1.5 2016/08/07 17:42:18 christos Exp $ */
+/* $NetBSD: netmpls_component.c,v 1.6 2022/09/03 02:24:59 thorpej Exp $ */
 
 /*
  * Copyright (c) 2009 Antti Kantee.  All Rights Reserved.
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: netmpls_component.c,v 1.5 2016/08/07 17:42:18 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: netmpls_component.c,v 1.6 2022/09/03 02:24:59 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/domain.h>
@@ -53,8 +53,6 @@ RUMP_COMPONENT(RUMP_COMPONENT_NET)
 	extern struct domain mplsdomain;
 
 	domain_attach(&mplsdomain);
-
-	rump_netisr_register(NETISR_MPLS, mplsintr);
 }
 
 RUMP_COMPONENT(RUMP_COMPONENT_NET_IF)

Reply via email to