On Sat, Mar 29, 2014 at 7:33 PM, Jarno Rajahalme <jrajaha...@nicira.com> wrote:
>
> On Mar 28, 2014, at 2:52 PM, Jesse Gross <je...@nicira.com> wrote:
>
>> On Fri, Mar 28, 2014 at 8:50 AM, Jarno Rajahalme <jrajaha...@nicira.com> 
>> wrote:
>>>
>>>> On Mar 27, 2014, at 3:59 PM, Jesse Gross <je...@nicira.com> wrote:
>>>>
>>>>> On Fri, Feb 21, 2014 at 11:41 AM, Jarno Rajahalme <jrajaha...@nicira.com> 
>>>>> wrote:
>>>>> Minimize padding in sw_flow_key and move 'tp' top the main struct.
>>>>> These changes simplify code when accessing the transport port numbers
>>>>> and the tcp flags, and makes the sw_flow_key 8 bytes smaller on 64-bit
>>>>> systems (128->120 bytes).  These changes also make the keys for IPv4
>>>>> packets to fit in one cache line.
>>>>>
>>>>> There is a valid concern for safety of packing the struct
>>>>> ovs_key_ipv4_tunnel, as it would be possible to take the address of
>>>>> the tun_id member as a __be64 * which could result in unaligned access
>>>>> in some systems. However:
>>>>>
>>>>> - sw_flow_key itself is 64-bit aligned, so the tun_id within is always
>>>>> 64-bit aligned.
>>>>> - We never make arrays of ovs_key_ipv4_tunnel (which would force every
>>>>> second tun_key to be misaligned).
>>>>> - We never take the address of the tun_id in to a __be64 *.
>>>>> - Whereever we use struct ovs_key_ipv4_tunnel outside the sw_flow_key,
>>>>> it is in stack (on tunnel input functions), where compiler has full
>>>>> control of the alignment.
>>>>
>>>> I'm not sure that I understand the last comment here. On the stack,
>>>> the compiler does have control over the layout but it will presumably
>>>> use the alignment specified here when doing that layout.
>>>
>>> Maybe the last comment is just redundant, then.
>>
>> But doesn't it mean that we could now have unaligned accesses?
>
>
> Access to tun_id member can be unaligned, but the compiler should handle it, 
> so it is safe. It seems we do it exactly once for ingress 
> (ovs_tun_key_init()) and egress from/to a tunnel in the fast path, so if it 
> needs to be as two 32-bit units in some targets, it should not matter.
>
> I see the commit message could have been clearer, though :-( There are two 
> concerns: safety and performance. As we never pass a tun_id member pointer as 
> __be64 *, this should be safe. For performance, some architectures must use 
> multiple instructions to access a “4-aligned” tun_id, but as we have such 
> accesses once per ingress/egress, it does not matter in practice. Other 
> architectures use one instruction and face a small penalty for unaligned 
> access. At the time of writing the commit message I was trying to reason when 
> that unaligned access would occur.

OK, I see now. Thanks for walking through the analysis.

> Also, now that I looked into this again, it seems to me that a tun_key in the 
> action list can be unaligned, as netlink attribute alignment is 4. If set 
> tunnel action follows pop vlan action, for example, the tun_key would not be 
> 8-aligned. This would be a safety issue with the tun_key as we had it before 
> this patch as we do the following in actions.c/execute_set_action():
>
>         case OVS_KEY_ATTR_IPV4_TUNNEL:
>                 OVS_CB(skb)->tun_key = nla_data(nested_attr);
>                 break;
>

Hmm, that is an interesting point.
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to