Module Name: src
Committed By: thorpej
Date: Thu Nov 16 05:02:23 UTC 2023
Modified Files:
src/sys/altq [thorpej-ifq]: if_altq.h
src/sys/net [thorpej-ifq]: if_bridge.c if_ethersubr.c if_vlan.c
src/sys/net80211 [thorpej-ifq]: ieee80211_input.c
Log Message:
Clean up the locking protocol around altq_etherclassify(). It's no longer
required to acquire KERNEL_LOCK *just* because ALTQ is compiled into the
kernel; you only have to acquire it if ALTQ is enabled on the interface
in question.
To generate a diff of this commit:
cvs rdiff -u -r1.16.4.1 -r1.16.4.1.2.1 src/sys/altq/if_altq.h
cvs rdiff -u -r1.189.6.1 -r1.189.6.1.2.1 src/sys/net/if_bridge.c
cvs rdiff -u -r1.326.2.1.2.1 -r1.326.2.1.2.2 src/sys/net/if_ethersubr.c
cvs rdiff -u -r1.171.2.1 -r1.171.2.1.2.1 src/sys/net/if_vlan.c
cvs rdiff -u -r1.117.4.1 -r1.117.4.1.2.1 src/sys/net80211/ieee80211_input.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/altq/if_altq.h
diff -u src/sys/altq/if_altq.h:1.16.4.1 src/sys/altq/if_altq.h:1.16.4.1.2.1
--- src/sys/altq/if_altq.h:1.16.4.1 Sat Nov 11 13:16:30 2023
+++ src/sys/altq/if_altq.h Thu Nov 16 05:02:23 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: if_altq.h,v 1.16.4.1 2023/11/11 13:16:30 thorpej Exp $ */
+/* $NetBSD: if_altq.h,v 1.16.4.1.2.1 2023/11/16 05:02:23 thorpej Exp $ */
/* $KAME: if_altq.h,v 1.12 2005/04/13 03:44:25 suz Exp $ */
/*
@@ -188,7 +188,7 @@ extern int altq_disable(struct ifaltq *)
extern struct mbuf *tbr_dequeue(struct ifaltq *, int);
extern int (*altq_input)(struct mbuf *, int);
#if 1 /* ALTQ3_CLFIER_COMPAT */
-void altq_etherclassify(struct ifaltq *, struct mbuf *);
+void altq_etherclassify(struct ifqueue *, struct mbuf *);
#endif
#endif /* _KERNEL */
Index: src/sys/net/if_bridge.c
diff -u src/sys/net/if_bridge.c:1.189.6.1 src/sys/net/if_bridge.c:1.189.6.1.2.1
--- src/sys/net/if_bridge.c:1.189.6.1 Sat Nov 11 13:16:30 2023
+++ src/sys/net/if_bridge.c Thu Nov 16 05:02:23 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: if_bridge.c,v 1.189.6.1 2023/11/11 13:16:30 thorpej Exp $ */
+/* $NetBSD: if_bridge.c,v 1.189.6.1.2.1 2023/11/16 05:02:23 thorpej Exp $ */
/*
* Copyright 2001 Wasabi Systems, Inc.
@@ -80,7 +80,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_bridge.c,v 1.189.6.1 2023/11/11 13:16:30 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_bridge.c,v 1.189.6.1.2.1 2023/11/16 05:02:23 thorpej Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -1488,18 +1488,18 @@ bridge_enqueue(struct bridge_softc *sc,
}
#ifdef ALTQ
- KERNEL_LOCK(1, NULL);
/*
* If ALTQ is enabled on the member interface, do
* classification; the queueing discipline might
* not require classification, but might require
* the address family/header pointer in the pktattr.
*/
+ mutex_enter(dst_ifp->if_snd.ifq_lock);
if (ALTQ_IS_ENABLED(&dst_ifp->if_snd)) {
/* XXX IFT_ETHER */
- altq_etherclassify(dst_ifp->if_snd.ifq_altq, m);
+ altq_etherclassify(&dst_ifp->if_snd, m);
}
- KERNEL_UNLOCK_ONE(NULL);
+ mutex_exit(dst_ifp->if_snd.ifq_lock);
#endif /* ALTQ */
if (vlan_has_tag(m) &&
Index: src/sys/net/if_ethersubr.c
diff -u src/sys/net/if_ethersubr.c:1.326.2.1.2.1 src/sys/net/if_ethersubr.c:1.326.2.1.2.2
--- src/sys/net/if_ethersubr.c:1.326.2.1.2.1 Wed Nov 15 02:08:34 2023
+++ src/sys/net/if_ethersubr.c Thu Nov 16 05:02:23 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: if_ethersubr.c,v 1.326.2.1.2.1 2023/11/15 02:08:34 thorpej Exp $ */
+/* $NetBSD: if_ethersubr.c,v 1.326.2.1.2.2 2023/11/16 05:02:23 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.326.2.1.2.1 2023/11/15 02:08:34 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_ethersubr.c,v 1.326.2.1.2.2 2023/11/16 05:02:23 thorpej Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -447,16 +447,16 @@ ether_output(struct ifnet * const ifp0,
#endif
#ifdef ALTQ
- KERNEL_LOCK(1, NULL);
/*
* If ALTQ is enabled on the parent interface, do
* classification; the queueing discipline might not
* require classification, but might require the
* address family/header pointer in the pktattr.
*/
+ mutex_enter(ifp->if_snd.ifq_lock);
if (ALTQ_IS_ENABLED(&ifp->if_snd))
- altq_etherclassify(ifp->if_snd.ifq_altq, m);
- KERNEL_UNLOCK_ONE(NULL);
+ altq_etherclassify(&ifp->if_snd, m);
+ mutex_exit(ifp->if_snd.ifq_lock);
#endif
return if_enqueue(ifp, m);
@@ -477,8 +477,9 @@ bad:
* is indeed contiguous, then to read the LLC and so on.
*/
void
-altq_etherclassify(struct ifaltq *ifq, struct mbuf *m)
+altq_etherclassify(struct ifqueue *ifq, struct mbuf *m)
{
+ struct ifaltq *altq = ifq->ifq_altq;
struct ether_header *eh;
struct mbuf *mtop = m;
uint16_t ether_type;
@@ -487,6 +488,18 @@ altq_etherclassify(struct ifaltq *ifq, s
KASSERT((mtop->m_flags & M_PKTHDR) != 0);
+ /*
+ * Release the ifqueue lock so that we can acquire the
+ * KERNEL_LOCK in the right order.
+ */
+ mutex_exit(ifq->ifq_lock);
+ KERNEL_LOCK(1, NULL);
+ mutex_enter(ifq->ifq_lock);
+
+ if (!ALTQ_IS_ENABLED(ifq)) {
+ goto bad;
+ }
+
hlen = ETHER_HDR_LEN;
eh = mtod(m, struct ether_header *);
@@ -552,7 +565,7 @@ altq_etherclassify(struct ifaltq *ifq, s
if (ALTQ_NEEDS_CLASSIFY(ifq)) {
mtop->m_pkthdr.pattr_class =
- (*ifq->altq_classify)(ifq->altq_clfier, m, af);
+ (*altq->altq_classify)(altq->altq_clfier, m, af);
}
mtop->m_pkthdr.pattr_af = af;
mtop->m_pkthdr.pattr_hdr = hdr;
@@ -560,9 +573,11 @@ altq_etherclassify(struct ifaltq *ifq, s
m->m_data -= hlen;
m->m_len += hlen;
+ KERNEL_UNLOCK_ONE(NULL);
return;
bad:
+ KERNEL_UNLOCK_ONE(NULL);
mtop->m_pkthdr.pattr_class = NULL;
mtop->m_pkthdr.pattr_hdr = NULL;
mtop->m_pkthdr.pattr_af = AF_UNSPEC;
Index: src/sys/net/if_vlan.c
diff -u src/sys/net/if_vlan.c:1.171.2.1 src/sys/net/if_vlan.c:1.171.2.1.2.1
--- src/sys/net/if_vlan.c:1.171.2.1 Sat Nov 11 13:16:30 2023
+++ src/sys/net/if_vlan.c Thu Nov 16 05:02:23 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: if_vlan.c,v 1.171.2.1 2023/11/11 13:16:30 thorpej Exp $ */
+/* $NetBSD: if_vlan.c,v 1.171.2.1.2.1 2023/11/16 05:02:23 thorpej Exp $ */
/*
* Copyright (c) 2000, 2001 The NetBSD Foundation, Inc.
@@ -78,7 +78,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_vlan.c,v 1.171.2.1 2023/11/11 13:16:30 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_vlan.c,v 1.171.2.1.2.1 2023/11/16 05:02:23 thorpej Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -1275,23 +1275,19 @@ vlan_start(struct ifnet *ifp)
#ifdef ALTQ
/*
- * KERNEL_LOCK is required for ALTQ even if NET_MPSAFE is
- * defined.
- */
- KERNEL_LOCK(1, NULL);
- /*
* If ALTQ is enabled on the parent interface, do
* classification; the queueing discipline might
* not require classification, but might require
* the address family/header pointer in the pktattr.
*/
+ mutex_enter(p->if_snd.ifq_lock);
if (ALTQ_IS_ENABLED(&p->if_snd)) {
KASSERT(
p->if_type == IFT_ETHER ||
p->if_type == IFT_L2TP);
- altq_etherclassify(p->if_snd.ifq_altq, m);
+ altq_etherclassify(&p->if_snd, m);
}
- KERNEL_UNLOCK_ONE(NULL);
+ mutex_exit(p->if_snd.ifq_lock);
#endif /* ALTQ */
bpf_mtap(ifp, m, BPF_D_OUT);
Index: src/sys/net80211/ieee80211_input.c
diff -u src/sys/net80211/ieee80211_input.c:1.117.4.1 src/sys/net80211/ieee80211_input.c:1.117.4.1.2.1
--- src/sys/net80211/ieee80211_input.c:1.117.4.1 Sat Nov 11 13:16:31 2023
+++ src/sys/net80211/ieee80211_input.c Thu Nov 16 05:02:23 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: ieee80211_input.c,v 1.117.4.1 2023/11/11 13:16:31 thorpej Exp $ */
+/* $NetBSD: ieee80211_input.c,v 1.117.4.1.2.1 2023/11/16 05:02:23 thorpej Exp $ */
/*
* Copyright (c) 2001 Atsushi Onoe
@@ -37,7 +37,7 @@
__FBSDID("$FreeBSD: src/sys/net80211/ieee80211_input.c,v 1.81 2005/08/10 16:22:29 sam Exp $");
#endif
#ifdef __NetBSD__
-__KERNEL_RCSID(0, "$NetBSD: ieee80211_input.c,v 1.117.4.1 2023/11/11 13:16:31 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ieee80211_input.c,v 1.117.4.1.2.1 2023/11/16 05:02:23 thorpej Exp $");
#endif
#ifdef _KERNEL_OPT
@@ -900,9 +900,11 @@ ieee80211_deliver_data(struct ieee80211c
if (m1 != NULL) {
int len;
#ifdef ALTQ
+ mutex_enter(ifp->if_snd.ifq_lock);
if (ALTQ_IS_ENABLED(&ifp->if_snd)) {
- altq_etherclassify(ifp->if_snd.ifq_altq, m1);
+ altq_etherclassify(&ifp->if_snd, m1);
}
+ mutex_exit(ifp->if_snd.ifq_lock);
#endif
len = m1->m_pkthdr.len;
IFQ_ENQUEUE(&ifp->if_snd, m1, error);