[ovs-dev] [PATCH V3 05/24] datapath: Set OvS recirc_id from tc chain index
Yi-Hung Wei
yihung.wei at gmail.com
Mon Sep 28 21:46:07 UTC 2020
On Wed, Sep 16, 2020 at 10:33 AM Greg Rose <gvrose8192 at gmail.com> wrote:
>
> From: Paul Blakey <paulb at mellanox.com>
>
> Upstream commit:
> commit 95a7233c452a58a4c2310c456c73997853b2ec46
> Author: Paul Blakey <paulb at mellanox.com>
> Date: Wed Sep 4 16:56:37 2019 +0300
>
> net: openvswitch: Set OvS recirc_id from tc chain index
>
> Offloaded OvS datapath rules are translated one to one to tc rules,
> for example the following simplified OvS rule:
>
> recirc_id(0),in_port(dev1),eth_type(0x0800),ct_state(-trk) actions:ct(),recirc(2)
>
> Will be translated to the following tc rule:
>
> $ tc filter add dev dev1 ingress \
> prio 1 chain 0 proto ip \
> flower tcp ct_state -trk \
> action ct pipe \
> action goto chain 2
>
> Received packets will first travel though tc, and if they aren't stolen
> by it, like in the above rule, they will continue to OvS datapath.
> Since we already did some actions (action ct in this case) which might
> modify the packets, and updated action stats, we would like to continue
> the proccessing with the correct recirc_id in OvS (here recirc_id(2))
> where we left off.
>
> To support this, introduce a new skb extension for tc, which
> will be used for translating tc chain to ovs recirc_id to
> handle these miss cases. Last tc chain index will be set
> by tc goto chain action and read by OvS datapath.
>
> Signed-off-by: Paul Blakey <paulb at mellanox.com>
> Signed-off-by: Vlad Buslov <vladbu at mellanox.com>
> Acked-by: Jiri Pirko <jiri at mellanox.com>
> Acked-by: Pravin B Shelar <pshelar at ovn.org>
> Signed-off-by: David S. Miller <davem at davemloft.net>
>
> Backport the local datapath changes from this patch and add compat
> layer fixup for the DECLARE_STATIC_KEY_FALSE macro.
>
> Cc: Paul Blakey <paulb at mellanox.com>
> Signed-off-by: Greg Rose <gvrose8192 at gmail.com>
> ---
> acinclude.m4 | 3 ++
> datapath/datapath.c | 34 ++++++++++++++++---
> datapath/datapath.h | 2 ++
> datapath/flow.c | 13 +++++++
> .../linux/compat/include/linux/static_key.h | 7 ++++
> 5 files changed, 55 insertions(+), 4 deletions(-)
>
> diff --git a/acinclude.m4 b/acinclude.m4
> index 84f344da0..3d56510a0 100644
> --- a/acinclude.m4
> +++ b/acinclude.m4
> @@ -631,6 +631,9 @@ AC_DEFUN([OVS_CHECK_LINUX_COMPAT], [
> [OVS_DEFINE([HAVE_UPSTREAM_STATIC_KEY])])
> OVS_GREP_IFELSE([$KSRC/include/linux/jump_label.h], [DEFINE_STATIC_KEY_FALSE],
> [OVS_DEFINE([HAVE_DEFINE_STATIC_KEY])])
> + OVS_GREP_IFELSE([$KSRC/include/linux/jump_label.h],
> + [DECLARE_STATIC_KEY_FALSE],
> + [OVS_DEFINE([HAVE_DECLARE_STATIC_KEY])])
>
> OVS_GREP_IFELSE([$KSRC/include/linux/etherdevice.h], [eth_hw_addr_random])
> OVS_GREP_IFELSE([$KSRC/include/linux/etherdevice.h], [ether_addr_copy])
> diff --git a/datapath/datapath.c b/datapath/datapath.c
> index c8c21d774..36f1e7894 100644
> --- a/datapath/datapath.c
> +++ b/datapath/datapath.c
> @@ -1635,10 +1635,34 @@ static void ovs_dp_reset_user_features(struct sk_buff *skb, struct genl_info *in
> dp->user_features = 0;
> }
>
> -static void ovs_dp_change(struct datapath *dp, struct nlattr *a[])
> +DEFINE_STATIC_KEY_FALSE(tc_recirc_sharing_support);
> +
> +static int ovs_dp_change(struct datapath *dp, struct nlattr *a[])
> {
> - if (a[OVS_DP_ATTR_USER_FEATURES])
> - dp->user_features = nla_get_u32(a[OVS_DP_ATTR_USER_FEATURES]);
> + u32 user_features = 0;
> +
> + if (a[OVS_DP_ATTR_USER_FEATURES]) {
> + user_features = nla_get_u32(a[OVS_DP_ATTR_USER_FEATURES]);
> +
> + if (user_features & ~(OVS_DP_F_VPORT_PIDS |
> + OVS_DP_F_UNALIGNED |
> + OVS_DP_F_TC_RECIRC_SHARING))
> + return -EOPNOTSUPP;
> +
> +#if !IS_ENABLED(CONFIG_NET_TC_SKB_EXT)
> + if (user_features & OVS_DP_F_TC_RECIRC_SHARING)
> + return -EOPNOTSUPP;
> +#endif
> + }
> +
> + dp->user_features = user_features;
> +
> + if (dp->user_features & OVS_DP_F_TC_RECIRC_SHARING)
> + static_branch_enable(&tc_recirc_sharing_support);
> + else
> + static_branch_disable(&tc_recirc_sharing_support);
> +
> + return 0;
> }
>
> static int ovs_dp_cmd_new(struct sk_buff *skb, struct genl_info *info)
> @@ -1700,7 +1724,9 @@ static int ovs_dp_cmd_new(struct sk_buff *skb, struct genl_info *info)
> parms.port_no = OVSP_LOCAL;
> parms.upcall_portids = a[OVS_DP_ATTR_UPCALL_PID];
>
> - ovs_dp_change(dp, a);
> + err = ovs_dp_change(dp, a);
> + if (err)
> + goto err_destroy_meters;
>
> /* So far only local changes have been made, now need the lock. */
> ovs_lock();
Hi Greg,
In the upstream commit, it also updates ovs_dp_cmd_set() which seems
to be missing in this patch. Can you double check that?
@@ -1736,7 +1762,9 @@ static int ovs_dp_cmd_set(struct sk_buff *skb,
struct genl_info *info)
if (IS_ERR(dp))
goto err_unlock_free;
- ovs_dp_change(dp, info->attrs);
+ err = ovs_dp_change(dp, info->attrs);
+ if (err)
+ goto err_unlock_free;
Thanks,
-Yi-Hung
More information about the dev
mailing list