diff mbox series

[ovs-dev] tc: Use skip_hw flag when probing tc features

Message ID 20200803105806.215737-1-roid@mellanox.com
State Changes Requested
Headers show
Series [ovs-dev] tc: Use skip_hw flag when probing tc features | expand

Commit Message

Roi Dayan Aug. 3, 2020, 10:58 a.m. UTC
There is no need to pass tc rules to hw when just probing
for tc features. this will avoid redundant errors from hw drivers
that may happen.

Signed-off-by: Roi Dayan <roid@mellanox.com>
---
 lib/netdev-offload-tc.c |  2 ++
 lib/tc.c                | 13 ++++++-------
 lib/tc.h                |  8 ++++++++
 3 files changed, 16 insertions(+), 7 deletions(-)

Comments

Simon Horman Aug. 3, 2020, 2:53 p.m. UTC | #1
On Mon, Aug 03, 2020 at 01:58:06PM +0300, Roi Dayan wrote:
> There is no need to pass tc rules to hw when just probing
> for tc features. this will avoid redundant errors from hw drivers
> that may happen.
> 
> Signed-off-by: Roi Dayan <roid@mellanox.com>

Thanks, this looks fine to me.

I'll let it sit for a day or so to see if anyone has any comments.
Ilya Maximets Aug. 3, 2020, 11:44 p.m. UTC | #2
On 8/3/20 12:58 PM, Roi Dayan wrote:
> There is no need to pass tc rules to hw when just probing
> for tc features. this will avoid redundant errors from hw drivers
> that may happen.

That makes sense.  Thanks!
Few comments inline.

> 
> Signed-off-by: Roi Dayan <roid@mellanox.com>
> ---
>  lib/netdev-offload-tc.c |  2 ++
>  lib/tc.c                | 13 ++++++-------
>  lib/tc.h                |  8 ++++++++
>  3 files changed, 16 insertions(+), 7 deletions(-)
> 
> diff --git a/lib/netdev-offload-tc.c b/lib/netdev-offload-tc.c
> index 2c9c6f4cae8b..18ff380f9861 100644
> --- a/lib/netdev-offload-tc.c
> +++ b/lib/netdev-offload-tc.c
> @@ -1918,6 +1918,7 @@ probe_multi_mask_per_prio(int ifindex)
>  
>      memset(&flower, 0, sizeof flower);
>  
> +    flower.tc_policy = TC_POLICY_SKIP_HW;
>      flower.key.eth_type = htons(ETH_P_IP);
>      flower.mask.eth_type = OVS_BE16_MAX;
>      memset(&flower.key.dst_mac, 0x11, sizeof flower.key.dst_mac);
> @@ -1965,6 +1966,7 @@ probe_tc_block_support(int ifindex)
>  
>      memset(&flower, 0, sizeof flower);
>  
> +    flower.tc_policy = TC_POLICY_SKIP_HW;
>      flower.key.eth_type = htons(ETH_P_IP);
>      flower.mask.eth_type = OVS_BE16_MAX;
>      memset(&flower.key.dst_mac, 0x11, sizeof flower.key.dst_mac);
> diff --git a/lib/tc.c b/lib/tc.c
> index c96d095381d7..8761304c92bb 100644
> --- a/lib/tc.c
> +++ b/lib/tc.c
> @@ -65,12 +65,6 @@ VLOG_DEFINE_THIS_MODULE(tc);
>  
>  static struct vlog_rate_limit error_rl = VLOG_RATE_LIMIT_INIT(60, 5);
>  
> -enum tc_offload_policy {
> -    TC_POLICY_NONE,
> -    TC_POLICY_SKIP_SW,
> -    TC_POLICY_SKIP_HW
> -};
> -
>  static enum tc_offload_policy tc_policy = TC_POLICY_NONE;
>  
>  struct tc_pedit_key_ex {
> @@ -2757,6 +2751,7 @@ nl_msg_put_flower_options(struct ofpbuf *request, struct tc_flower *flower)
>      bool is_vlan = eth_type_vlan(flower->key.eth_type);
>      bool is_qinq = is_vlan && eth_type_vlan(flower->key.encap_eth_type[0]);
>      bool is_mpls = eth_type_mpls(flower->key.eth_type);
> +    enum tc_offload_policy policy = flower->tc_policy;
>      int err;
>  
>      /* need to parse acts first as some acts require changing the matching
> @@ -2882,7 +2877,11 @@ nl_msg_put_flower_options(struct ofpbuf *request, struct tc_flower *flower)
>          }
>      }
>  
> -    nl_msg_put_u32(request, TCA_FLOWER_FLAGS, tc_get_tc_cls_policy(tc_policy));
> +    if (policy == TC_POLICY_NONE) {
> +        policy = tc_policy;
> +    }
> +
> +    nl_msg_put_u32(request, TCA_FLOWER_FLAGS, tc_get_tc_cls_policy(policy));
>  
>      if (flower->tunnel) {
>          nl_msg_put_flower_tunnel(request, flower);
> diff --git a/lib/tc.h b/lib/tc.h
> index 028eed5d0658..78f433ceef77 100644
> --- a/lib/tc.h
> +++ b/lib/tc.h
> @@ -312,6 +312,12 @@ is_tcf_id_eq(struct tcf_id *id1, struct tcf_id *id2)
>             && id1->chain == id2->chain;
>  }
>  
> +enum tc_offload_policy {
> +    TC_POLICY_NONE,

Since now the code actually depends on this value to be zero, it might be
good to explicitly set it, or have a build assertion.  This will protect us
from possible issues if someone will try to modify this enum later.
i.e.
    TC_POLICY_NONE = 0,

> +    TC_POLICY_SKIP_SW,
> +    TC_POLICY_SKIP_HW
> +};
> +
>  struct tc_flower {
>      struct tc_flower_key key;
>      struct tc_flower_key mask;
> @@ -337,6 +343,8 @@ struct tc_flower {
>      bool needs_full_ip_proto_mask;
>  
>      enum tc_offloaded_state offloaded_state;
> +    /* used to force skip_hw when probing tc features */

I see that there is a comment below in this file that doesn't follow OVS coding
style, but, please, use the OVS-style comments for a new code, i.e. start with
a capital letter and end with a period.

> +    enum tc_offload_policy tc_policy;
>  };
>  
>  /* assert that if we overflow with a masked write of uint32_t to the last byte
>
Roi Dayan Aug. 4, 2020, 6:43 a.m. UTC | #3
On 2020-08-04 2:44 AM, Ilya Maximets wrote:
> On 8/3/20 12:58 PM, Roi Dayan wrote:
>> There is no need to pass tc rules to hw when just probing
>> for tc features. this will avoid redundant errors from hw drivers
>> that may happen.
> 
> That makes sense.  Thanks!
> Few comments inline.
> 
>>
>> Signed-off-by: Roi Dayan <roid@mellanox.com>
>> ---
>>  lib/netdev-offload-tc.c |  2 ++
>>  lib/tc.c                | 13 ++++++-------
>>  lib/tc.h                |  8 ++++++++
>>  3 files changed, 16 insertions(+), 7 deletions(-)
>>
>> diff --git a/lib/netdev-offload-tc.c b/lib/netdev-offload-tc.c
>> index 2c9c6f4cae8b..18ff380f9861 100644
>> --- a/lib/netdev-offload-tc.c
>> +++ b/lib/netdev-offload-tc.c
>> @@ -1918,6 +1918,7 @@ probe_multi_mask_per_prio(int ifindex)
>>  
>>      memset(&flower, 0, sizeof flower);
>>  
>> +    flower.tc_policy = TC_POLICY_SKIP_HW;
>>      flower.key.eth_type = htons(ETH_P_IP);
>>      flower.mask.eth_type = OVS_BE16_MAX;
>>      memset(&flower.key.dst_mac, 0x11, sizeof flower.key.dst_mac);
>> @@ -1965,6 +1966,7 @@ probe_tc_block_support(int ifindex)
>>  
>>      memset(&flower, 0, sizeof flower);
>>  
>> +    flower.tc_policy = TC_POLICY_SKIP_HW;
>>      flower.key.eth_type = htons(ETH_P_IP);
>>      flower.mask.eth_type = OVS_BE16_MAX;
>>      memset(&flower.key.dst_mac, 0x11, sizeof flower.key.dst_mac);
>> diff --git a/lib/tc.c b/lib/tc.c
>> index c96d095381d7..8761304c92bb 100644
>> --- a/lib/tc.c
>> +++ b/lib/tc.c
>> @@ -65,12 +65,6 @@ VLOG_DEFINE_THIS_MODULE(tc);
>>  
>>  static struct vlog_rate_limit error_rl = VLOG_RATE_LIMIT_INIT(60, 5);
>>  
>> -enum tc_offload_policy {
>> -    TC_POLICY_NONE,
>> -    TC_POLICY_SKIP_SW,
>> -    TC_POLICY_SKIP_HW
>> -};
>> -
>>  static enum tc_offload_policy tc_policy = TC_POLICY_NONE;
>>  
>>  struct tc_pedit_key_ex {
>> @@ -2757,6 +2751,7 @@ nl_msg_put_flower_options(struct ofpbuf *request, struct tc_flower *flower)
>>      bool is_vlan = eth_type_vlan(flower->key.eth_type);
>>      bool is_qinq = is_vlan && eth_type_vlan(flower->key.encap_eth_type[0]);
>>      bool is_mpls = eth_type_mpls(flower->key.eth_type);
>> +    enum tc_offload_policy policy = flower->tc_policy;
>>      int err;
>>  
>>      /* need to parse acts first as some acts require changing the matching
>> @@ -2882,7 +2877,11 @@ nl_msg_put_flower_options(struct ofpbuf *request, struct tc_flower *flower)
>>          }
>>      }
>>  
>> -    nl_msg_put_u32(request, TCA_FLOWER_FLAGS, tc_get_tc_cls_policy(tc_policy));
>> +    if (policy == TC_POLICY_NONE) {
>> +        policy = tc_policy;
>> +    }
>> +
>> +    nl_msg_put_u32(request, TCA_FLOWER_FLAGS, tc_get_tc_cls_policy(policy));
>>  
>>      if (flower->tunnel) {
>>          nl_msg_put_flower_tunnel(request, flower);
>> diff --git a/lib/tc.h b/lib/tc.h
>> index 028eed5d0658..78f433ceef77 100644
>> --- a/lib/tc.h
>> +++ b/lib/tc.h
>> @@ -312,6 +312,12 @@ is_tcf_id_eq(struct tcf_id *id1, struct tcf_id *id2)
>>             && id1->chain == id2->chain;
>>  }
>>  
>> +enum tc_offload_policy {
>> +    TC_POLICY_NONE,
> 
> Since now the code actually depends on this value to be zero, it might be
> good to explicitly set it, or have a build assertion.  This will protect us
> from possible issues if someone will try to modify this enum later.
> i.e.
>     TC_POLICY_NONE = 0,
> 

great. I did both.

>> +    TC_POLICY_SKIP_SW,
>> +    TC_POLICY_SKIP_HW
>> +};
>> +
>>  struct tc_flower {
>>      struct tc_flower_key key;
>>      struct tc_flower_key mask;
>> @@ -337,6 +343,8 @@ struct tc_flower {
>>      bool needs_full_ip_proto_mask;
>>  
>>      enum tc_offloaded_state offloaded_state;
>> +    /* used to force skip_hw when probing tc features */
> 
> I see that there is a comment below in this file that doesn't follow OVS coding
> style, but, please, use the OVS-style comments for a new code, i.e. start with
> a capital letter and end with a period.
> 

fixed. sent v2.

>> +    enum tc_offload_policy tc_policy;
>>  };
>>  
>>  /* assert that if we overflow with a masked write of uint32_t to the last byte
>>
>
diff mbox series

Patch

diff --git a/lib/netdev-offload-tc.c b/lib/netdev-offload-tc.c
index 2c9c6f4cae8b..18ff380f9861 100644
--- a/lib/netdev-offload-tc.c
+++ b/lib/netdev-offload-tc.c
@@ -1918,6 +1918,7 @@  probe_multi_mask_per_prio(int ifindex)
 
     memset(&flower, 0, sizeof flower);
 
+    flower.tc_policy = TC_POLICY_SKIP_HW;
     flower.key.eth_type = htons(ETH_P_IP);
     flower.mask.eth_type = OVS_BE16_MAX;
     memset(&flower.key.dst_mac, 0x11, sizeof flower.key.dst_mac);
@@ -1965,6 +1966,7 @@  probe_tc_block_support(int ifindex)
 
     memset(&flower, 0, sizeof flower);
 
+    flower.tc_policy = TC_POLICY_SKIP_HW;
     flower.key.eth_type = htons(ETH_P_IP);
     flower.mask.eth_type = OVS_BE16_MAX;
     memset(&flower.key.dst_mac, 0x11, sizeof flower.key.dst_mac);
diff --git a/lib/tc.c b/lib/tc.c
index c96d095381d7..8761304c92bb 100644
--- a/lib/tc.c
+++ b/lib/tc.c
@@ -65,12 +65,6 @@  VLOG_DEFINE_THIS_MODULE(tc);
 
 static struct vlog_rate_limit error_rl = VLOG_RATE_LIMIT_INIT(60, 5);
 
-enum tc_offload_policy {
-    TC_POLICY_NONE,
-    TC_POLICY_SKIP_SW,
-    TC_POLICY_SKIP_HW
-};
-
 static enum tc_offload_policy tc_policy = TC_POLICY_NONE;
 
 struct tc_pedit_key_ex {
@@ -2757,6 +2751,7 @@  nl_msg_put_flower_options(struct ofpbuf *request, struct tc_flower *flower)
     bool is_vlan = eth_type_vlan(flower->key.eth_type);
     bool is_qinq = is_vlan && eth_type_vlan(flower->key.encap_eth_type[0]);
     bool is_mpls = eth_type_mpls(flower->key.eth_type);
+    enum tc_offload_policy policy = flower->tc_policy;
     int err;
 
     /* need to parse acts first as some acts require changing the matching
@@ -2882,7 +2877,11 @@  nl_msg_put_flower_options(struct ofpbuf *request, struct tc_flower *flower)
         }
     }
 
-    nl_msg_put_u32(request, TCA_FLOWER_FLAGS, tc_get_tc_cls_policy(tc_policy));
+    if (policy == TC_POLICY_NONE) {
+        policy = tc_policy;
+    }
+
+    nl_msg_put_u32(request, TCA_FLOWER_FLAGS, tc_get_tc_cls_policy(policy));
 
     if (flower->tunnel) {
         nl_msg_put_flower_tunnel(request, flower);
diff --git a/lib/tc.h b/lib/tc.h
index 028eed5d0658..78f433ceef77 100644
--- a/lib/tc.h
+++ b/lib/tc.h
@@ -312,6 +312,12 @@  is_tcf_id_eq(struct tcf_id *id1, struct tcf_id *id2)
            && id1->chain == id2->chain;
 }
 
+enum tc_offload_policy {
+    TC_POLICY_NONE,
+    TC_POLICY_SKIP_SW,
+    TC_POLICY_SKIP_HW
+};
+
 struct tc_flower {
     struct tc_flower_key key;
     struct tc_flower_key mask;
@@ -337,6 +343,8 @@  struct tc_flower {
     bool needs_full_ip_proto_mask;
 
     enum tc_offloaded_state offloaded_state;
+    /* used to force skip_hw when probing tc features */
+    enum tc_offload_policy tc_policy;
 };
 
 /* assert that if we overflow with a masked write of uint32_t to the last byte