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