On 03/11/15(Tue) 16:17, David Gwynne wrote:
> 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?
ok mpi@
>
> 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);
> }
> }
> }