[patch] reducing arp locking
Fabien Thomas
fabien.thomas at netasq.com
Fri Nov 9 14:03:14 UTC 2012
Le 9 nov. 2012 à 12:18, Alexander V. Chernikov a écrit :
> On 09.11.2012 13:59, Fabien Thomas wrote:
>>
>> Le 9 nov. 2012 à 10:05, Alexander V. Chernikov a écrit :
>>
>>> On 09.11.2012 12:51, Fabien Thomas wrote:
>>>>
>>>> Le 8 nov. 2012 à 11:25, Alexander V. Chernikov a écrit :
>>>>
>>>>> On 08.11.2012 14:24, Andre Oppermann wrote:
>>>>>> On 08.11.2012 00:24, Alexander V. Chernikov wrote:
>>>>>>> Hello list!
>>>>>>>
>>>>>>> Currently we need to acquire 2 read locks to perform simple 6-byte
>>>>>>> copying from arp record to packet
>>>>>>> ethernet header.
>>>>>>>
>>>>>>> It seems that acquiring lle lock for fast path (main traffic flow) is
>>>>>>> not necessary even with
>>>>>>> current code.
>>>>>>>
>>>>>>> My tests shows ~10% improvement with this patch applied.
>>>>>>>
>>>>>>> If nobody objects I plan to commit this change at the end of next week.
>>>>>>
>>>>>> This is risky and prone to race conditions. The copy of the MAC address
>>>>>> should be done while the table read lock is held to protect against the
>>>>> It is done exactly as you say: table read lock is held.
>>>>
>>>> How do you protect from entry update if i've a ref to the entry ?
>>>> You can end up doing bcopy of a partial mac address.
>>> I see no problems in copying incorrect mac address in that case:
>>> if host mac address id updated, this is, most likely, another host, and several packets being lost changes nothing.
>>
>> Sending packet to a bogus mac address is not really nothing :)
>>
>>>
>>> However, there can be some realistic scenario where this can be the case (L2 load balancing/failover). I'll update in_arpinput() to do lle removal/insertion in that case.
>>>
>>>> la_preempt modification is also write access to an unlocked structure.
>>> This one changes nothing:
>>> current code does this under _read_ lock.
>>
>> Under the table lock not the entry lock ?
> lle entry is read-locked while la_preempt is modified.
>
>> Table lock is here to protect the table if I've understood the code correctly.
> Yes.
>> If i get an exclusive reference to the entry you will end up reading and writing to the entry without any lock.
> Yes. And the only single drawback in worst case can be sending a bit more packets to right (but probably expired) MAC address.
Or partial copy of the new mac.
>
> I'm talking about the following:
> ARP stack is just IP -> 6 bytes mapping, there is no reason to make it unnecessary complicated like rte, with references being held by upper layer stack. It does not contain interface pointer, etc..
>
> We may need to r/w lock entry, but for 'control plane' code only.
> If one acquired exclusive lock and wants to change STATIC flag to non-static or change lle address - this is simply wrong and has to be handled by acquiring table wlock.
>
> Current ARP code has some flaws like handling arp expiration, but this patch doesn't change much here..
In in_arpinput only exclusive access to the entry is taken during the update no IF_AFDATA_LOCK that's why i was surprised.
;
>
>>
>>>
>>>>
>>>>
>>>>>
>>>>>> entry going away. You can either return with table lock held and drop
>>>>>> it after the copy, or you could a modified lookup function that takes a
>>>>>> pointer for the copy destination, do the copy with the read lock, and then
>>>>>> return. If no entry is found an error is returned and obviously no copy
>>>>>> is done.
>>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> WBR, Alexander
>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> freebsd-hackers at freebsd.org mailing list
>>>>> http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
>>>>> To unsubscribe, send any mail to "freebsd-hackers-unsubscribe at freebsd.org"
>>>>
>>>>
>>>
>>
>>
>
>
> --
> WBR, Alexander
>
>
More information about the freebsd-hackers
mailing list