On 5 Apr 2024, at 15:43, Ilya Maximets wrote:
> On 4/5/24 15:08, Ilya Maximets wrote: >> On 4/5/24 15:01, Eric Garver wrote: >>> On Fri, Apr 05, 2024 at 11:39:58AM +0200, Eelco Chaudron wrote: >>>> >>>> >>>> On 3 Apr 2024, at 16:35, Eric Garver wrote: >>>> >>>>> Kernel support has been added for this action. As such, we need to probe >>>>> the datapath for support. >>>>> >>>>> Signed-off-by: Eric Garver <e...@garver.life> >>>>> --- >>>>> include/linux/openvswitch.h | 2 +- >>>>> lib/dpif.c | 6 ++- >>>>> lib/dpif.h | 2 +- >>>>> ofproto/ofproto-dpif.c | 77 ++++++++++++++++++++++++++++++++++--- >>>>> ofproto/ofproto-dpif.h | 4 +- >>>>> 5 files changed, 81 insertions(+), 10 deletions(-) >>>>> >>>>> diff --git a/include/linux/openvswitch.h b/include/linux/openvswitch.h >>>>> index d18754c84f62..d9fb991ef234 100644 >>>>> --- a/include/linux/openvswitch.h >>>>> +++ b/include/linux/openvswitch.h >>>>> @@ -1086,11 +1086,11 @@ enum ovs_action_attr { >>>>> OVS_ACTION_ATTR_CHECK_PKT_LEN, /* Nested OVS_CHECK_PKT_LEN_ATTR_*. */ >>>>> OVS_ACTION_ATTR_ADD_MPLS, /* struct ovs_action_add_mpls. */ >>>>> OVS_ACTION_ATTR_DEC_TTL, /* Nested OVS_DEC_TTL_ATTR_*. */ >>>>> + OVS_ACTION_ATTR_DROP, /* u32 xlate_error. */ >>>>> >>>>> #ifndef __KERNEL__ >>>>> OVS_ACTION_ATTR_TUNNEL_PUSH, /* struct ovs_action_push_tnl*/ >>>>> OVS_ACTION_ATTR_TUNNEL_POP, /* u32 port number. */ >>>>> - OVS_ACTION_ATTR_DROP, /* u32 xlate_error. */ >>>>> OVS_ACTION_ATTR_LB_OUTPUT, /* u32 bond-id. */ >>>>> #endif >>>>> __OVS_ACTION_ATTR_MAX, /* Nothing past this will be accepted >>>>> diff --git a/lib/dpif.c b/lib/dpif.c >>>>> index 0f480bec48d0..23eb18495a66 100644 >>>>> --- a/lib/dpif.c >>>>> +++ b/lib/dpif.c >>>>> @@ -28,6 +28,7 @@ >>>>> #include "dpctl.h" >>>>> #include "dpif-netdev.h" >>>>> #include "flow.h" >>>>> +#include "netdev-offload.h" >>>>> #include "netdev-provider.h" >>>>> #include "netdev.h" >>>>> #include "netlink.h" >>>>> @@ -1935,9 +1936,10 @@ dpif_supports_tnl_push_pop(const struct dpif *dpif) >>>>> } >>>>> >>>>> bool >>>>> -dpif_supports_explicit_drop_action(const struct dpif *dpif) >>>>> +dpif_may_support_explicit_drop_action(const struct dpif *dpif) >>>>> { >>>>> - return dpif_is_netdev(dpif); >>>>> + /* TC does not support offloading this action. */ >>>>> + return dpif_is_netdev(dpif) || !netdev_is_flow_api_enabled(); >>>>> } >>>>> >>>>> bool >>>>> diff --git a/lib/dpif.h b/lib/dpif.h >>>>> index 0f2dc2ef3c55..a764e8a592bd 100644 >>>>> --- a/lib/dpif.h >>>>> +++ b/lib/dpif.h >>>>> @@ -940,7 +940,7 @@ int dpif_get_pmds_for_port(const struct dpif * dpif, >>>>> odp_port_t port_no, >>>>> >>>>> char *dpif_get_dp_version(const struct dpif *); >>>>> bool dpif_supports_tnl_push_pop(const struct dpif *); >>>>> -bool dpif_supports_explicit_drop_action(const struct dpif *); >>>>> +bool dpif_may_support_explicit_drop_action(const struct dpif *); >>>>> bool dpif_synced_dp_layers(struct dpif *); >>>>> >>>>> /* Log functions. */ >>>>> diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c >>>>> index c4e2e867ecdc..32d037be607c 100644 >>>>> --- a/ofproto/ofproto-dpif.c >>>>> +++ b/ofproto/ofproto-dpif.c >>>>> @@ -221,6 +221,7 @@ static void ct_zone_config_init(struct dpif_backer >>>>> *backer); >>>>> static void ct_zone_config_uninit(struct dpif_backer *backer); >>>>> static void ct_zone_timeout_policy_sweep(struct dpif_backer *backer); >>>>> static void ct_zone_limits_commit(struct dpif_backer *backer); >>>>> +static bool recheck_support_explicit_drop_action(struct dpif_backer >>>>> *backer); >>>>> >>>>> static inline struct ofproto_dpif * >>>>> ofproto_dpif_cast(const struct ofproto *ofproto) >>>>> @@ -391,6 +392,10 @@ type_run(const char *type) >>>>> udpif_set_threads(backer->udpif, n_handlers, n_revalidators); >>>>> } >>>>> >>>>> + if (recheck_support_explicit_drop_action(backer)) { >>>>> + backer->need_revalidate = REV_RECONFIGURE; >>>>> + } >>>>> + >>>>> if (backer->need_revalidate) { >>>>> struct ofproto_dpif *ofproto; >>>>> struct simap_node *node; >>>>> @@ -855,7 +860,11 @@ ovs_native_tunneling_is_on(struct ofproto_dpif >>>>> *ofproto) >>>>> bool >>>>> ovs_explicit_drop_action_supported(struct ofproto_dpif *ofproto) >>>>> { >>>>> - return ofproto->backer->rt_support.explicit_drop_action; >>>>> + bool value; >>>>> + >>>>> + >>>>> atomic_read_relaxed(&ofproto->backer->rt_support.explicit_drop_action, >>>>> + &value); >>>>> + return value; >>>>> } >>>>> >>>>> bool >>>>> @@ -1379,6 +1388,40 @@ check_ct_timeout_policy(struct dpif_backer *backer) >>>>> return !error; >>>>> } >>>>> >>>>> +/* Tests whether backer's datapath supports the OVS_ACTION_ATTR_DROP >>>>> action. */ >>>>> +static bool >>>>> +check_drop_action(struct dpif_backer *backer) >>>>> +{ >>>>> + struct odputil_keybuf keybuf; >>>>> + uint8_t actbuf[NL_A_U32_SIZE]; >>>>> + struct ofpbuf actions; >>>>> + struct ofpbuf key; >>>>> + bool supported; >>>>> + >>>>> + struct flow flow = { >>>>> + .dl_type = CONSTANT_HTONS(0x1234), /* bogus */ >>>>> + }; >>>>> + struct odp_flow_key_parms odp_parms = { >>>>> + .flow = &flow, >>>>> + .probe = true, >>>>> + }; >>>>> + >>>>> + ofpbuf_use_stack(&key, &keybuf, sizeof keybuf); >>>>> + odp_flow_key_from_flow(&odp_parms, &key); >>>>> + >>>>> + ofpbuf_use_stack(&actions, &actbuf, sizeof actbuf); >>>>> + nl_msg_put_u32(&actions, OVS_ACTION_ATTR_DROP, XLATE_OK); >>>>> + >>>>> + supported = dpif_may_support_explicit_drop_action(backer->dpif) && >>>>> + dpif_probe_feature(backer->dpif, "drop", &key, &actions, >>>>> NULL); >>>>> + >>>>> + VLOG_INFO("%s: Datapath %s explicit drop action", >>>>> + dpif_name(backer->dpif), >>>>> + (supported) ? "supports" : "does not support"); >>>>> + >>>>> + return supported; >>>>> +} >>>>> + >>>>> /* Tests whether 'backer''s datapath supports the all-zero SNAT case. */ >>>>> static bool >>>>> dpif_supports_ct_zero_snat(struct dpif_backer *backer) >>>>> @@ -1649,8 +1692,8 @@ check_support(struct dpif_backer *backer) >>>>> backer->rt_support.max_hash_alg = check_max_dp_hash_alg(backer); >>>>> backer->rt_support.check_pkt_len = check_check_pkt_len(backer); >>>>> backer->rt_support.ct_timeout = check_ct_timeout_policy(backer); >>>>> - backer->rt_support.explicit_drop_action = >>>>> - dpif_supports_explicit_drop_action(backer->dpif); >>>>> + atomic_store_relaxed(&backer->rt_support.explicit_drop_action, >>>>> + check_drop_action(backer)); >>>>> backer->rt_support.lb_output_action = >>>>> dpif_supports_lb_output_action(backer->dpif); >>>>> backer->rt_support.ct_zero_snat = dpif_supports_ct_zero_snat(backer); >>>>> @@ -1667,6 +1710,28 @@ check_support(struct dpif_backer *backer) >>>>> backer->rt_support.odp.nd_ext = check_nd_extensions(backer); >>>>> } >>>>> >>>>> +/* TC does not support offloading the explicit drop action. As such we >>>>> need to >>>>> + * re-probe the datapath if hw-offload has been modified. >>>>> + * Note: We don't support true --> false transition as that requires a >>>>> restart. >>>>> + * See netdev_set_flow_api_enabled(). */ >>>>> +static bool >>>>> +recheck_support_explicit_drop_action(struct dpif_backer *backer) >>>>> +{ >>>>> + bool explicit_drop_action; >>>>> + >>>>> + atomic_read_relaxed(&backer->rt_support.explicit_drop_action, >>>>> + &explicit_drop_action); >>>>> + >>>>> + if (explicit_drop_action >>>>> + && !dpif_may_support_explicit_drop_action(backer->dpif)) { >>>>> + ovs_assert(!check_drop_action(backer)); >>>> >>>> If we only call this for the log message, would just adding the log >>>> message here not be better? >>>> It avoids the installation of a flow, >> >> We're not going to install the flow, because there is a check for >> dpif_may_support_explicit_drop_action() in the check_drop_action(). >>>> and I have not thought this through, but it might confuse the revalidator. >> >> So, the revalidator will not be confused. >> >>> >>> So you and Ilya would rather I insert a VLOG_INFO() here? That's fine >>> with me. >> >> I'd keep as is, unless Eelco has a strong opinion towards the log. >> >>> >>> Can we agree on the message before I post another revision? >>> >>> VLOG_INFO("%s: Datapath supports explicit drop action, " >>> "but disabled due to hw-offload=true.", >>> dpif_name(backer->dpif)) >>> >>> Is that agreeable? > > In case Eelco prefers a solution with the log, I'd suggest to > just log "%s: Datapath no longer supports explicit drop action". > The reasoning is the same as before, this module doesn't know > why exactly dpif_may_support_explicit_drop_action() now returns > 'false' and shouldn't make assumptions that it is because of > hardware offload. And it should be simple enough to correlate > this message with enabling of the hardware offload. I once again forgot this is for enabling TC only (not disabling), so let’s keep the patch as is. Acked-by: Eelco Chaudron <echau...@redhat.com> Cheers, Eelco _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev