[ovs-dev] [PATCH] datapath: Remove checks for preinitialized flow.

Pravin Shelar pshelar at nicira.com
Mon Mar 18 23:13:03 UTC 2013


On Mon, Mar 18, 2013 at 2:20 PM, Jesse Gross <jesse at nicira.com> wrote:
> Header caching used to store a precomputed flow along with the skb
> but no longer exists.  There were a few remaining checks for those
> flows, which this removes.  It simplifies the code slightly and brings
> us closer to upstream.
>
> Signed-off-by: Jesse Gross <jesse at nicira.com>
Looks good.

Acked-by: Pravin B Shelar <pshelar at nicira.com>
> ---
>  datapath/datapath.c           |   50 +++++++++++++++++++----------------------
>  datapath/vport-internal_dev.c |    3 +--
>  datapath/vport.c              |    3 ---
>  datapath/vport.h              |    3 +--
>  4 files changed, 25 insertions(+), 34 deletions(-)
>
> diff --git a/datapath/datapath.c b/datapath/datapath.c
> index a40ff47..b5eb232 100644
> --- a/datapath/datapath.c
> +++ b/datapath/datapath.c
> @@ -201,41 +201,37 @@ void ovs_dp_process_received_packet(struct vport *p, struct sk_buff *skb)
>         struct datapath *dp = p->dp;
>         struct sw_flow *flow;
>         struct dp_stats_percpu *stats;
> +       struct sw_flow_key key;
>         u64 *stats_counter;
>         int error;
> +       int key_len;
>
>         stats = this_cpu_ptr(dp->stats_percpu);
>
> -       if (!OVS_CB(skb)->flow) {
> -               struct sw_flow_key key;
> -               int key_len;
> -
> -               /* Extract flow from 'skb' into 'key'. */
> -               error = ovs_flow_extract(skb, p->port_no, &key, &key_len);
> -               if (unlikely(error)) {
> -                       kfree_skb(skb);
> -                       return;
> -               }
> -
> -               /* Look up flow. */
> -               flow = ovs_flow_tbl_lookup(rcu_dereference(dp->table),
> -                                          &key, key_len);
> -               if (unlikely(!flow)) {
> -                       struct dp_upcall_info upcall;
> -
> -                       upcall.cmd = OVS_PACKET_CMD_MISS;
> -                       upcall.key = &key;
> -                       upcall.userdata = NULL;
> -                       upcall.portid = p->upcall_portid;
> -                       ovs_dp_upcall(dp, skb, &upcall);
> -                       consume_skb(skb);
> -                       stats_counter = &stats->n_missed;
> -                       goto out;
> -               }
> +       /* Extract flow from 'skb' into 'key'. */
> +       error = ovs_flow_extract(skb, p->port_no, &key, &key_len);
> +       if (unlikely(error)) {
> +               kfree_skb(skb);
> +               return;
> +       }
>
> -               OVS_CB(skb)->flow = flow;
> +       /* Look up flow. */
> +       flow = ovs_flow_tbl_lookup(rcu_dereference(dp->table), &key, key_len);
> +       if (unlikely(!flow)) {
> +               struct dp_upcall_info upcall;
> +
> +               upcall.cmd = OVS_PACKET_CMD_MISS;
> +               upcall.key = &key;
> +               upcall.userdata = NULL;
> +               upcall.portid = p->upcall_portid;
> +               ovs_dp_upcall(dp, skb, &upcall);
> +               consume_skb(skb);
> +               stats_counter = &stats->n_missed;
> +               goto out;
>         }
>
> +       OVS_CB(skb)->flow = flow;
> +
>         stats_counter = &stats->n_hit;
>         ovs_flow_used(OVS_CB(skb)->flow, skb);
>         ovs_execute_actions(dp, skb);
> diff --git a/datapath/vport-internal_dev.c b/datapath/vport-internal_dev.c
> index 78f1a52..003e880 100644
> --- a/datapath/vport-internal_dev.c
> +++ b/datapath/vport-internal_dev.c
> @@ -92,7 +92,6 @@ static int internal_dev_xmit(struct sk_buff *skb, struct net_device *netdev)
>         }
>
>         vlan_copy_skb_tci(skb);
> -       OVS_CB(skb)->flow = NULL;
>
>         rcu_read_lock();
>         ovs_vport_receive(internal_dev_priv(netdev)->vport, skb);
> @@ -289,7 +288,7 @@ static int internal_dev_recv(struct vport *vport, struct sk_buff *skb)
>
>  const struct vport_ops ovs_internal_vport_ops = {
>         .type           = OVS_VPORT_TYPE_INTERNAL,
> -       .flags          = VPORT_F_REQUIRED | VPORT_F_FLOW,
> +       .flags          = VPORT_F_REQUIRED,
>         .create         = internal_dev_create,
>         .destroy        = internal_dev_destroy,
>         .get_name       = ovs_netdev_get_name,
> diff --git a/datapath/vport.c b/datapath/vport.c
> index 012af59..d458a95 100644
> --- a/datapath/vport.c
> +++ b/datapath/vport.c
> @@ -415,9 +415,6 @@ void ovs_vport_receive(struct vport *vport, struct sk_buff *skb)
>         stats->rx_bytes += skb->len;
>         u64_stats_update_end(&stats->sync);
>
> -       if (!(vport->ops->flags & VPORT_F_FLOW))
> -               OVS_CB(skb)->flow = NULL;
> -
>         if (!(vport->ops->flags & VPORT_F_TUN_ID))
>                 OVS_CB(skb)->tun_key = NULL;
>
> diff --git a/datapath/vport.h b/datapath/vport.h
> index d33f99e..074c6ee 100644
> --- a/datapath/vport.h
> +++ b/datapath/vport.h
> @@ -106,8 +106,7 @@ struct vport {
>  };
>
>  #define VPORT_F_REQUIRED       (1 << 0) /* If init fails, module loading fails. */
> -#define VPORT_F_FLOW           (1 << 1) /* Sets OVS_CB(skb)->flow. */
> -#define VPORT_F_TUN_ID         (1 << 2) /* Sets OVS_CB(skb)->tun_id. */
> +#define VPORT_F_TUN_ID         (1 << 1) /* Sets OVS_CB(skb)->tun_id. */
>
>  /**
>   * struct vport_parms - parameters for creating a new vport
> --
> 1.7.10.4
>
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev



More information about the dev mailing list