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-hack...@freebsd.org mailing list
>>>>> http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
>>>>> To unsubscribe, send any mail to "freebsd-hackers-unsubscr...@freebsd.org"
>>>> 
>>>> 
>>> 
>> 
>> 
> 
> 
> -- 
> WBR, Alexander
> 
> 

_______________________________________________
freebsd-net@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-net
To unsubscribe, send any mail to "freebsd-net-unsubscr...@freebsd.org"

Reply via email to