diff mbox series

[ovs-dev] tc: Fix stats dump when using same meter table

Message ID 20220815094916.301466-1-simon.horman@corigine.com
State Superseded
Headers show
Series [ovs-dev] tc: Fix stats dump when using same meter table | expand

Checks

Context Check Description
ovsrobot/apply-robot warning apply and check: warning
ovsrobot/github-robot-_Build_and_Test success github build: passed
ovsrobot/intel-ovs-compilation success test: success

Commit Message

Simon Horman Aug. 15, 2022, 9:49 a.m. UTC
From: Tianyu Yuan <tianyu.yuan@corigine.com>

When we apply meter police on both directions of TCP traffic, the
dumped stats is shown same (as shown below). This issue is introduced
by modifying the stats update strategy.

...,in_port(6),eth(),eth_type(0x0800),ipv4(frag=no), packets:1488557,
bytes:2089059644, used:0.040s, actions:meter(0),9
...,in_port(9),eth(),eth_type(0x0800),ipv4(frag=no), packets:1488557,
bytes:2089059644, used:0.040s, actions:meter(0),6

In previous patch, after parsing police action, the flower stats will
be updated by dumped meter table stats, which will result in the issue
above.

Thus, the stats of meter table should not be used when dumping flow
stats. Ignore the stats update when police.index belongs to meter.

Fixes: a9b8cdde69de ("tc: Add support parsing tc police action")
Signed-off-by: Tianyu Yuan <tianyu.yuan@corigine.com>
Reviewed-by: Baowen Zheng <baowen.zheng@corigine.com>
Signed-off-by: Simon Horman <simon.horman@corigine.com>
---
 lib/tc.c | 5 +++++
 1 file changed, 5 insertions(+)

Comments

0-day Robot Aug. 15, 2022, 9:58 a.m. UTC | #1
References:  <20220815094916.301466-1-simon.horman@corigine.com>
 

Bleep bloop.  Greetings Simon Horman, I am a robot and I have tried out your patch.
Thanks for your contribution.

I encountered some error that I wasn't expecting.  See the details below.


checkpatch:
WARNING: Unexpected sign-offs from developers who are not authors or co-authors or committers: Simon Horman <simon.horman@corigine.com>
ERROR: Inappropriate bracing around statement
#55 FILE: lib/tc.c:1939:
    if (is_meter)

Lines checked: 63, Warnings: 1, Errors: 1


Please check this out.  If you feel there has been an error, please email aconole@redhat.com

Thanks,
0-day Robot
Eelco Chaudron Aug. 23, 2022, 11:16 a.m. UTC | #2
On 15 Aug 2022, at 11:49, Simon Horman wrote:

> From: Tianyu Yuan <tianyu.yuan@corigine.com>
>
> When we apply meter police on both directions of TCP traffic, the
> dumped stats is shown same (as shown below). This issue is introduced
> by modifying the stats update strategy.
>
> ...,in_port(6),eth(),eth_type(0x0800),ipv4(frag=no), packets:1488557,
> bytes:2089059644, used:0.040s, actions:meter(0),9
> ...,in_port(9),eth(),eth_type(0x0800),ipv4(frag=no), packets:1488557,
> bytes:2089059644, used:0.040s, actions:meter(0),6
>
> In previous patch, after parsing police action, the flower stats will
> be updated by dumped meter table stats, which will result in the issue
> above.
>
> Thus, the stats of meter table should not be used when dumping flow
> stats. Ignore the stats update when police.index belongs to meter.
>
> Fixes: a9b8cdde69de ("tc: Add support parsing tc police action")
> Signed-off-by: Tianyu Yuan <tianyu.yuan@corigine.com>
> Reviewed-by: Baowen Zheng <baowen.zheng@corigine.com>
> Signed-off-by: Simon Horman <simon.horman@corigine.com>


I did not do any testing, but here are some style comments.

//Eelco


> ---
>  lib/tc.c | 5 +++++
>  1 file changed, 5 insertions(+)
>
> diff --git a/lib/tc.c b/lib/tc.c
> index aaeb7708cc7b..6c9ca10d48af 100644
> --- a/lib/tc.c
> +++ b/lib/tc.c
> @@ -1883,6 +1883,8 @@ nl_parse_single_action(struct nlattr *action, struct tc_flower *flower,
>      struct nlattr *act_cookie;
>      const char *act_kind;
>      struct nlattr *action_attrs[ARRAY_SIZE(act_policy)];
> +    int act_index = flower->action_count;
> +    int is_meter = 0;

bool is_meter = False;

>      int err = 0;
>
>      if (!nl_parse_nested(action, act_policy, action_attrs,
> @@ -1920,6 +1922,7 @@ nl_parse_single_action(struct nlattr *action, struct tc_flower *flower,
>          nl_parse_act_ct(act_options, flower);
>      } else if (!strcmp(act_kind, "police")) {
>          nl_parse_act_police(act_options, flower);
> +        is_meter = tc_is_meter_index(flower->actions[act_index].police.index);

Should checking for the action type not be enough here?
i.e. action->type == TC_ACT_POLICE?

>      } else {
>          VLOG_ERR_RL(&error_rl, "unknown tc action kind: %s", act_kind);
>          err = EINVAL;
> @@ -1933,6 +1936,8 @@ nl_parse_single_action(struct nlattr *action, struct tc_flower *flower,
>          flower->act_cookie.data = nl_attr_get(act_cookie);
>          flower->act_cookie.len = nl_attr_get_size(act_cookie);
>      }
> +    if (is_meter)
> +        return 0;

if (is_meter) {
   return 0;
}

However, if the previous comment is true, all we need is

if (action->type == TC_ACT_POLICE) {
	/* ADD A COMMENT ON WHY WE SKIP HERE */
	return 0;
}

>
>      return nl_parse_action_stats(action_attrs[TCA_ACT_STATS],
>                                   &flower->stats_sw, &flower->stats_hw, NULL);
> -- 
> 2.30.2
diff mbox series

Patch

diff --git a/lib/tc.c b/lib/tc.c
index aaeb7708cc7b..6c9ca10d48af 100644
--- a/lib/tc.c
+++ b/lib/tc.c
@@ -1883,6 +1883,8 @@  nl_parse_single_action(struct nlattr *action, struct tc_flower *flower,
     struct nlattr *act_cookie;
     const char *act_kind;
     struct nlattr *action_attrs[ARRAY_SIZE(act_policy)];
+    int act_index = flower->action_count;
+    int is_meter = 0;
     int err = 0;
 
     if (!nl_parse_nested(action, act_policy, action_attrs,
@@ -1920,6 +1922,7 @@  nl_parse_single_action(struct nlattr *action, struct tc_flower *flower,
         nl_parse_act_ct(act_options, flower);
     } else if (!strcmp(act_kind, "police")) {
         nl_parse_act_police(act_options, flower);
+        is_meter = tc_is_meter_index(flower->actions[act_index].police.index);
     } else {
         VLOG_ERR_RL(&error_rl, "unknown tc action kind: %s", act_kind);
         err = EINVAL;
@@ -1933,6 +1936,8 @@  nl_parse_single_action(struct nlattr *action, struct tc_flower *flower,
         flower->act_cookie.data = nl_attr_get(act_cookie);
         flower->act_cookie.len = nl_attr_get_size(act_cookie);
     }
+    if (is_meter)
+        return 0;
 
     return nl_parse_action_stats(action_attrs[TCA_ACT_STATS],
                                  &flower->stats_sw, &flower->stats_hw, NULL);