ALTQ patch for if_vlan.c
Jon Simola
jsimola at gmail.com
Wed Jan 5 12:32:56 PST 2005
I just whipped up this against
5.3-STABLE #1: Wed Dec 22 17:11:02 PST 2004
Would someone who knows a bit more about this than myself give it a
quick lookover and see if it appears sane? I'm mostly wondering about
the splimp() and splx() and whether it's required or excessive due to
the mtx_lock/unlock in the VLAN_LOCK/UNLOCK macros.
Due to a lack of equipment it's difficult for me to run a seperate
test environment, so any sort of review would be appreciated.
--- sys/net/if_vlan.c.orig Wed Jan 5 12:25:19 2005
+++ sys/net/if_vlan.c Wed Jan 5 12:53:45 2005
@@ -379,7 +379,10 @@
ifp->if_init = vlan_ifinit;
ifp->if_start = vlan_start;
ifp->if_ioctl = vlan_ioctl;
- ifp->if_snd.ifq_maxlen = ifqmaxlen;
+ IFQ_SET_MAXLEN(&ifp->if_snd, ifqmaxlen);
+ ifp->if_snd.ifq_drv_maxlen = 0;
+ IFQ_SET_READY(&ifp->if_snd);
+
ether_ifattach(ifp, ifv->ifv_ac.ac_enaddr);
/* Now undo some of the damage... */
ifp->if_baudrate = 0;
@@ -423,11 +426,15 @@
{
int unit;
struct ifvlan *ifv = ifp->if_softc;
+ int s;
unit = ifp->if_dunit;
VLAN_LOCK();
LIST_REMOVE(ifv, ifv_list);
+ s = splimp();
+ IFQ_PURGE(&ifp->if_snd);
+ splx(s);
vlan_unconfig(ifp);
VLAN_UNLOCK();
@@ -458,12 +465,22 @@
struct mbuf *m;
int error;
+ if (ALTQ_IS_ENABLED(&ifp->if_snd)) {
+ IFQ_LOCK(&ifp->if_snd);
+ IFQ_POLL_NOLOCK(&ifp->if_snd, m);
+ if (m == NULL ) {
+ IFQ_UNLOCK(&ifp->if_snd);
+ return;
+ }
+ IFQ_UNLOCK(&ifp->if_snd);
+ }
+
ifv = ifp->if_softc;
p = ifv->ifv_p;
ifp->if_flags |= IFF_OACTIVE;
for (;;) {
- IF_DEQUEUE(&ifp->if_snd, m);
+ IFQ_DEQUEUE(&ifp->if_snd, m);
if (m == 0)
break;
BPF_MTAP(ifp, m);
More information about the freebsd-stable
mailing list