ml_purge returns how many mbufs they freed, so we can decrement the
la_hold_total with that instead of inside an ml_dequeue/m_freem
loop.
ok?
Index: netinet/if_ether.c
===================================================================
RCS file: /cvs/src/sys/netinet/if_ether.c,v
retrieving revision 1.182
diff -u -p -r1.182 if_ether.c
--- netinet/if_ether.c 2 Nov 2015 15:05:23 -0000 1.182
+++ netinet/if_ether.c 3 Nov 2015 06:15:03 -0000
@@ -141,7 +141,6 @@ arp_rtrequest(struct ifnet *ifp, int req
struct sockaddr *gate = rt->rt_gateway;
struct llinfo_arp *la = (struct llinfo_arp *)rt->rt_llinfo;
struct ifaddr *ifa;
- struct mbuf *m;
if (!arpinit_done) {
static struct timeout arptimer_to;
@@ -243,10 +242,7 @@ arp_rtrequest(struct ifnet *ifp, int req
LIST_REMOVE(la, la_list);
rt->rt_llinfo = 0;
rt->rt_flags &= ~RTF_LLINFO;
- while ((m = ml_dequeue(&la->la_ml)) != NULL) {
- la_hold_total--;
- m_freem(m);
- }
+ la_hold_total -= ml_purge(&la->la_ml);
pool_put(&arp_pool, la);
}
}
@@ -395,10 +391,7 @@ arpresolve(struct ifnet *ifp, struct rte
ml_enqueue(&la->la_ml, m);
la_hold_total++;
} else {
- while ((mh = ml_dequeue(&la->la_ml)) != NULL) {
- la_hold_total--;
- m_freem(mh);
- }
+ la_hold_total -= ml_purge(&la->la_ml);
m_freem(m);
}
@@ -431,10 +424,7 @@ arpresolve(struct ifnet *ifp, struct rte
rt->rt_flags |= RTF_REJECT;
rt->rt_expire += arpt_down;
la->la_asked = 0;
- while ((mh = ml_dequeue(&la->la_ml)) != NULL) {
- la_hold_total--;
- m_freem(mh);
- }
+ la_hold_total -= ml_purge(&la->la_ml);
}
}
}