[ovs-dev] [PATCH 2/4] datapath: Add per-CPU recirc stack infrasturcutre

Andy Zhou azhou at nicira.com
Mon Aug 18 20:34:07 UTC 2014


On Sun, Aug 17, 2014 at 7:43 PM, Pravin Shelar <pshelar at nicira.com> wrote:
> On Fri, Aug 15, 2014 at 3:12 AM, Andy Zhou <azhou at nicira.com> wrote:
>> Future pathces will make use of those functions.
>>
>> Signed-off-by: Andy Zhou <azhou at nicira.com>
>> ---
>>  datapath/Modules.mk |  1 +
>>  datapath/actions.c  | 27 ++++++++++++++++
>>  datapath/actions.h  | 90 +++++++++++++++++++++++++++++++++++++++++++++++++++++
>>  datapath/datapath.c |  4 +++
>>  datapath/datapath.h |  2 +-
>>  5 files changed, 123 insertions(+), 1 deletion(-)
>>  create mode 100644 datapath/actions.h
>>
>> diff --git a/datapath/Modules.mk b/datapath/Modules.mk
>> index 90e158c..2e74f6e 100644
>> --- a/datapath/Modules.mk
>> +++ b/datapath/Modules.mk
>> @@ -23,6 +23,7 @@ openvswitch_sources = \
>>
>>  openvswitch_headers = \
>>         compat.h \
>> +       actions.h \
>>         datapath.h \
>>         flow.h \
>>         flow_netlink.h \
>> diff --git a/datapath/actions.c b/datapath/actions.c
>> index bccf397..9dd9063 100644
>> --- a/datapath/actions.c
>> +++ b/datapath/actions.c
>> @@ -39,6 +39,9 @@
>>  #include "mpls.h"
>>  #include "vlan.h"
>>  #include "vport.h"
>> +#include "actions.h"
>> +
>> +static DEFINE_PER_CPU(struct ovs_action_stack, ovs_action_stacks);
>>
>>  static void flow_key_clone(struct sk_buff *skb, struct sw_flow_key *new_key)
>>  {
>> @@ -949,3 +952,27 @@ out_loop:
>>
>>         return error;
>>  }
>> +
>> +void ovs_action_stacks_init(void)
>> +{
>> +       int i;
>> +
>> +       for_each_possible_cpu(i) {
>> +               struct ovs_action_stack *stack;
>> +
>> +               stack = &per_cpu(ovs_action_stacks, i);
>> +               ovs_action_stack_init(stack);
>> +       }
>> +}
>> +
>> +void ovs_action_stacks_exit(void)
>> +{
>> +       int i;
>> +
>> +       for_each_possible_cpu(i) {
>> +               struct ovs_action_stack *stack;
>> +
>> +               stack = &per_cpu(ovs_action_stacks, i);
>> +               BUG_ON(stack->top != 0);
>> +       }
>> +}
>> diff --git a/datapath/actions.h b/datapath/actions.h
>> new file mode 100644
>> index 0000000..e4601a6
>> --- /dev/null
>> +++ b/datapath/actions.h
>> @@ -0,0 +1,90 @@
>> +/* Copyright (c) 2007-2014 Nicira, Inc.
>> + *
>> + * This program is free software; you can redistribute it and/or
>> + * modify it under the terms of version 2 of the GNU General Public
>> + * License as published by the Free Software Foundation.
>> + *
>> + * This program is distributed in the hope that it will be useful, but
>> + * WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
>> + * General Public License for more details.
>> + *
>> + * You should have received a copy of the GNU General Public License
>> + * along with this program; if not, write to the Free Software
>> + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
>> + * 02110-1301, USA
>> + */
>> +
>> +#ifndef ACTION_H
>> +#define ACTION_H 1
>> +
>> +#include <linux/kernel.h>
>> +#include <linux/mutex.h>
>> +#include <linux/netdevice.h>
>> +#include <linux/skbuff.h>
>> +
>> +#include "compat.h"
>> +#include "flow.h"
>> +#include "flow_table.h"
>> +#include "vlan.h"
>> +#include "vport.h"
>> +
>> +#define OVS_ACTION_STACK_LIMIT 10
>> +
>> +struct ovs_deferred_action {
>> +       struct sk_buff *skb;
>> +       struct nlattr *actions;
>> +       int rem;
>> +
>> +       /* Store pkt_key clone during recirc */
>> +       struct sw_flow_key pkt_key;
>> +};
>> +
>> +struct ovs_action_stack {
>> +       /* Deffered action stack */
>> +       int top;
>> +       struct ovs_deferred_action stack[OVS_ACTION_STACK_LIMIT];
>> +};
>> +
>> +void ovs_action_stacks_init(void);
>> +void ovs_action_stacks_exit(void);
>> +int ovs_execute_actions(struct datapath *dp, struct sk_buff *skb);
>> +void ovs_process_action_stack(void);
>> +
>> +static inline void ovs_action_stack_init(struct ovs_action_stack *stack)
>> +{
>> +       stack->top = 0;
>> +}
>> +
>> +static inline struct ovs_deferred_action *
>> +ovs_action_stack_pop(struct ovs_action_stack *stack)
>> +{
>> +       if (stack->top) {
>> +               stack->top--;
>> +               return &stack->stack[stack->top];
>> +       }
>> +
>> +       return NULL;
>> +}
>> +
>> +static inline struct ovs_deferred_action *
>> +ovs_action_stack_push(struct ovs_action_stack *stack,
>> +                                       struct sk_buff *skb,
>> +                                       struct nlattr *actions, int rem)
>> +{
>> +       struct ovs_deferred_action *elem;
>> +
>> +       if (stack->top >= OVS_ACTION_STACK_LIMIT - 1)
>> +               return NULL;
>> +
>> +       elem = &stack->stack[stack->top];
>> +       elem->skb = skb;
>> +       elem->actions = actions;
>> +       elem->rem = rem;
>> +
>> +       stack->top++;
>> +
>> +       return elem;
>> +}
>> +
> Is there any need to expose stack API outside of action.c?
No, I will move them into action.c
>
>> +#endif /* actions.h */
>> diff --git a/datapath/datapath.c b/datapath/datapath.c
>> index e477c72..aa13817 100644
>> --- a/datapath/datapath.c
>> +++ b/datapath/datapath.c
>> @@ -61,6 +61,7 @@
>>  #include "vlan.h"
>>  #include "vport-internal_dev.h"
>>  #include "vport-netdev.h"
>> +#include "actions.h"
>>
>>  int ovs_net_id __read_mostly;
>>
>> @@ -2136,6 +2137,8 @@ static int __init dp_init(void)
>>         if (err < 0)
>>                 goto error_unreg_notifier;
>>
>> +       ovs_action_stacks_init();
>> +
>>         return 0;
>>
>>  error_unreg_notifier:
>> @@ -2158,6 +2161,7 @@ static void dp_cleanup(void)
>>         rcu_barrier();
>>         ovs_vport_exit();
>>         ovs_flow_exit();
>> +       ovs_action_stacks_exit();
>>  }
>>
>>  module_init(dp_init);
>> diff --git a/datapath/datapath.h b/datapath/datapath.h
>> index 4874ab5..73f4e14 100644
>> --- a/datapath/datapath.h
>> +++ b/datapath/datapath.h
>> @@ -31,6 +31,7 @@
>>  #include "flow_table.h"
>>  #include "vlan.h"
>>  #include "vport.h"
>> +#include "actions.h"
>>
>>  #define DP_MAX_PORTS           USHRT_MAX
>>  #define DP_VPORT_HASH_BUCKETS  1024
>> @@ -197,7 +198,6 @@ const char *ovs_dp_name(const struct datapath *dp);
>>  struct sk_buff *ovs_vport_cmd_build_info(struct vport *, u32 portid, u32 seq,
>>                                          u8 cmd);
>>
>> -int ovs_execute_actions(struct datapath *dp, struct sk_buff *skb);
>>  void ovs_dp_notify_wq(struct work_struct *work);
>>
>>  #define OVS_NLERR(fmt, ...)                                    \
>> --
>> 1.9.1
>>
>> _______________________________________________
>> dev mailing list
>> dev at openvswitch.org
>> http://openvswitch.org/mailman/listinfo/dev



More information about the dev mailing list