On Thu, Apr 29, 2021 at 02:30:48AM +0300, Vitaliy Makkoveev wrote: > > > > On 29 Apr 2021, at 02:20, Alexandr Nedvedicky > > <alexandr.nedvedi...@oracle.com> wrote: > > > > </snip> > >> > >> This time arpcache() is only called by netisr() with both kernel and > >> exclusive net locks held. RTM_DELETE message processing will also call > >> ifp->if_rtrequest() with exclusive netlock held. > >> > >> So this while() loop within arpcache() can’t be broken by “arp -a -d”. > > > > completely agree. > > > >> > >> Also netlock serializes arpcache() and arpresolve(). > >> > > > > I agree arepcache() always runs as a writer on netlock + KERNEL_LOCK > > > > I suspect arpresolve() might be running also as a reader on netlock. > > this happens when we forward packet. I think forwarded packets runs > > arpresolve() as a reader on netlock, when it is dispatched/forwarded > > to outbound interface. > > Sure, but this arpresolve() threads can’t insert packet to la->la_mq > while we perform arpcache() because of exclusive netlock.
yes, indeed. no other thread can insert packet to queue, because we own everything: we run as a writer on netlock we have a KERNEL_LOCK OK now I see the bluhm's comment is OK. but still would like to see a notion we also hold netlock exclusively (as I keep forgetting about it). how about this: /* * Note: we run as a writer on netlock and we also own a kernel lock. No other * CPU can insert to la_mq while we feed the packets to if_output(). If a * packet is reinserted from there we have a loop. This should not happen and * we want to find such cases. */ thanks and regards sashan