Hello, diff looks good to me, I've just found one cosmetic nit.
</snip> > @@ -683,21 +685,17 @@ arpcache(struct ifnet *ifp, struct ether > > la->la_asked = 0; > la->la_refreshed = 0; > - while ((m = mq_dequeue(&la->la_mq)) != NULL) { > - unsigned int len; > - > - atomic_dec_int(&la_hold_total); > - len = mq_len(&la->la_mq); > - > + mq_delist(&la->la_mq, &ml); > + len = ml_len(&ml); > + while ((m = ml_dequeue(&ml)) != NULL) { > ifp->if_output(ifp, m, rt_key(rt), rt); > - > - /* XXXSMP we discard if other CPU enqueues */ > - if (mq_len(&la->la_mq) > len) { > - /* mbuf is back in queue. Discard. */ > - atomic_sub_int(&la_hold_total, mq_purge(&la->la_mq)); > - break; > - } > } do we want to keep curly brackets for while() loop? the loop body is a one-liner now. > + /* XXXSMP we discard if other CPU enqueues */ > + if (mq_len(&la->la_mq) > 0) { > + /* mbuf is back in queue. Discard. */ > + atomic_sub_int(&la_hold_total, len + mq_purge(&la->la_mq)); > + } else > + atomic_sub_int(&la_hold_total, len); > > return (0); > } otherwise looks OK to me. thanks and regards sashan