On Mon, Aug 11, 2014 at 2:32 PM, Jarno Rajahalme <jrajaha...@nicira.com> wrote:
>
> On Aug 11, 2014, at 2:22 PM, Andy Zhou <az...@nicira.com> wrote:
>
>> When flow key becomes invalid due to push or pop actions, current
>> implementation leaves it as invalid, only rebuild the flow key used
>> for recirculation.
>>
>> This works, but is less efficient in case of multiple recirc
>> actions. Each recirc action will have to re-extract
>> its own flow keys.
>>
>> This patch update the original flow key as soon as the first recirc
>> action is encountered, avoiding expensive flow extract call for any
>> future recirc actions as long as the flow key remains valid.
>>
>> Signed-off-by: Andy Zhou <az...@nicira.com>
>> ---
>> datapath/actions.c | 16 +++++++---------
>> datapath/flow.c    |  5 +++++
>> datapath/flow.h    |  2 ++
>> 3 files changed, 14 insertions(+), 9 deletions(-)
>>
>> diff --git a/datapath/actions.c b/datapath/actions.c
>> index 25c5d77..ae1978d 100644
>> --- a/datapath/actions.c
>> +++ b/datapath/actions.c
>> @@ -806,20 +806,18 @@ static int execute_recirc(struct datapath *dp, struct 
>> sk_buff *skb,
>>       }
>>
>>       if (is_skb_flow_key_valid(skb)) {
>
> Do you mean Iis_… here?
Yes, you are right. I will fix it in the next rev.
>
>> -             if (!last_action(a, rem))
>> -                     flow_key_clone_recirc(skb, nla_get_u32(a), 
>> &recirc_key);
>> -             else
>> -                     flow_key_set_recirc_id(skb, nla_get_u32(a));
>> -     } else {
>> -             struct sw_flow_key *pkt_key = OVS_CB(skb)->pkt_key;
>> -
>> -             err = ovs_flow_key_extract_recirc(nla_get_u32(a), pkt_key,
>> -                                               skb, &recirc_key);
>> +             err = ovs_flow_key_update(skb, OVS_CB(skb)->pkt_key);
>>               if (err) {
>>                       kfree_skb(skb);
>>                       return err;
>>               }
>>       }
>> +     BUG_ON(!is_skb_flow_key_valid(skb));
>> +
>> +     if (last_action(a, rem))
>> +             flow_key_set_recirc_id(skb, nla_get_u32(a));
>> +     else
>> +             flow_key_clone_recirc(skb, nla_get_u32(a), &recirc_key);
>>
>>       ovs_dp_process_packet(skb, true);
>>       return 0;
>> diff --git a/datapath/flow.c b/datapath/flow.c
>> index d56812a..ae64813 100644
>> --- a/datapath/flow.c
>> +++ b/datapath/flow.c
>> @@ -673,6 +673,11 @@ static int key_extract(struct sk_buff *skb, struct 
>> sw_flow_key *key)
>>       return 0;
>> }
>>
>> +int ovs_flow_key_update(struct sk_buff *skb, struct sw_flow_key *key)
>> +{
>> +     return key_extract(skb, key);
>> +}
>> +
>> int ovs_flow_key_extract(const struct ovs_tunnel_info *tun_info,
>>                        struct sk_buff *skb,
>>                        struct sw_flow_key *key)
>> diff --git a/datapath/flow.h b/datapath/flow.h
>> index 106feb8..bc38eba 100644
>> --- a/datapath/flow.h
>> +++ b/datapath/flow.h
>> @@ -232,5 +232,7 @@ int ovs_flow_key_extract_recirc(u32 recirc_id,
>>                               const struct sw_flow_key *key,
>>                               struct sk_buff *skb,
>>                               struct sw_flow_key *new_key);
>> +/* Update the non-metadata part of the flow key using skb. */
>> +int ovs_flow_key_update(struct sk_buff *skb, struct sw_flow_key *key);
>>
>> #endif /* flow.h */
>> --
>> 1.9.1
>>
>> _______________________________________________
>> dev mailing list
>> dev@openvswitch.org
>> http://openvswitch.org/mailman/listinfo/dev
>
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to