On 7 Jul 2023, at 13:03, Ilya Maximets wrote:
> On 7/6/23 11:30, Eelco Chaudron wrote:
>>
>>
>> On 30 Jun 2023, at 21:05, Eric Garver wrote:
>>
>> Hi Eric,
>>
>> I guess some description here would be good. Maybe add some info that this
>> is added due to kernel support being added.
>>
>>
>> In general, the patch looks good, and I would ack it. However, there is a
>> potential issue with TC hardware offload. If the patch gets applied as is,
>> and the kernel fix gets in, the additional DROP actions get added, but they
>> will not be offloaded to hardware and are only visible as kernel dp entries.
>>
>> I guess this might not be a real problem. However, people who upgrade OVS
>> with tc offload might get confused why they now get these drop rules in the
>> kernel dp. To solve this, we could simply skip adding them if hardware
>> offload is enabled. So the behavior stays the same. Something like this (not
>> tested, and we probably need to add dpif_is_netlink()):
>>
>>
>> diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c
>> index 29f4daa63..bc39e45bd 100644
>> --- a/ofproto/ofproto-dpif-xlate.c
>> +++ b/ofproto/ofproto-dpif-xlate.c
>> @@ -34,12 +34,14 @@
>> #include "csum.h"
>> #include "dp-packet.h"
>> #include "dpif.h"
>> +#include "dpif-netdev.h"
>> #include "in-band.h"
>> #include "lacp.h"
>> #include "learn.h"
>> #include "mac-learning.h"
>> #include "mcast-snooping.h"
>> #include "multipath.h"
>> +#include "netdev-offload.h"
>> #include "netdev-vport.h"
>> #include "netlink.h"
>> #include "nx-match.h"
>> @@ -8199,7 +8201,8 @@ exit:
>>
>> /* Install drop action if datapath supports explicit drop action. */
>> if (xin->odp_actions && !xin->odp_actions->size &&
>> - ovs_explicit_drop_action_supported(ctx.xbridge->ofproto)) {
>> + ovs_explicit_drop_action_supported(ctx.xbridge->ofproto) &&
>> + /* Do not add drop actions if TC hardware offload is enabled, as
>> + * as TC does not support offloading the drop action. */
>> + (!netdev_is_flow_api_enabled() || dpif_is_netdev(xbridge->dpif))) {
>
> I'd argue that the check should not be here. We should not set the
> baker.rt_support flag in the first place instead.
Yes, that was my initial thought also, but what if hw offload gets enabled
later? We might need some re-evaluation at that stage. I know the docs say you
have to restart ovs when you enable HW offload, but that is not always
happening in practice.
>> put_drop_action(xin->odp_actions, ctx.error);
>> }
>>
>> I do not see a way for TC to support this as is in the kernel. We probably
>> need some new kind of drop reason supported TC action.
>>
>> I know other people are exploring to see if this explicit drop action can be
>> used for other, more user-level things. If this is true this TC part needs
>> some proper fixing or we end up with rules not being offloaded.
>>
>> Added some more people, who might have some opinions on TC offload / ideas
>> on how to add SKB_DROP_REASON support to TC.
>>
>> Cheers,
>>
>>
>> Eelco
>>
>>> Signed-off-by: Eric Garver <e...@garver.life>
>>> ---
>>> include/linux/openvswitch.h | 2 +-
>>> lib/dpif.c | 6 ------
>>> lib/dpif.h | 1 -
>>> ofproto/ofproto-dpif.c | 34 ++++++++++++++++++++++++++++++++--
>>> 4 files changed, 33 insertions(+), 10 deletions(-)
>>>
>>> diff --git a/include/linux/openvswitch.h b/include/linux/openvswitch.h
>>> index a265e05ad253..fce6456f47c8 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 d328bf288de0..dc02ec912693 100644
>>> --- a/lib/dpif.c
>>> +++ b/lib/dpif.c
>>> @@ -1928,12 +1928,6 @@ dpif_supports_tnl_push_pop(const struct dpif *dpif)
>>> return dpif_is_netdev(dpif);
>>> }
>>>
>>> -bool
>>> -dpif_supports_explicit_drop_action(const struct dpif *dpif)
>>> -{
>>> - return dpif_is_netdev(dpif);
>>> -}
>>> -
>>> bool
>>> dpif_supports_lb_output_action(const struct dpif *dpif)
>>> {
>>> diff --git a/lib/dpif.h b/lib/dpif.h
>>> index 129cbf6a1d5f..fc1719f88b4f 100644
>>> --- a/lib/dpif.h
>>> +++ b/lib/dpif.h
>>> @@ -938,7 +938,6 @@ 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_synced_dp_layers(struct dpif *);
>>>
>>> /* Log functions. */
>>> diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c
>>> index fad7342b0b02..c490a3c1da48 100644
>>> --- a/ofproto/ofproto-dpif.c
>>> +++ b/ofproto/ofproto-dpif.c
>>> @@ -1375,6 +1375,37 @@ 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;
>>> + struct flow flow;
>>> + bool supported;
>>> +
>>> + struct odp_flow_key_parms odp_parms = {
>>> + .flow = &flow,
>>> + .probe = true,
>>> + };
>>> +
>>> + memset(&flow, 0, sizeof flow);
>>> + 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_probe_feature(backer->dpif, "drop", &key, &actions,
>>> NULL);
>>> +
>>> + VLOG_INFO("%s: Datapath %s 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)
>>> @@ -1627,8 +1658,7 @@ 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);
>>> + 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);
>>> --
>>> 2.39.0
>>>
>>> _______________________________________________
>>> dev mailing list
>>> d...@openvswitch.org
>>> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>>
_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev