Commit c0f47c28 authored by Oz Shlomo's avatar Oz Shlomo Committed by David S. Miller

net/sched: cls_api: Fix flow action initialization

The cited commit refactored the flow action initialization sequence to
use an interface method when translating tc action instances to flow
offload objects. The refactored version skips the initialization of the
generic flow action attributes for tc actions, such as pedit, that allocate
more than one offload entry. This can cause potential issues for drivers
mapping flow action ids.

Populate the generic flow action fields for all the flow action entries.

Fixes: c54e1d92 ("flow_offload: add ops to tc_action_ops for flow action setup")
Signed-off-by: default avatarOz Shlomo <ozsh@nvidia.com>
Reviewed-by: default avatarRoi Dayan <roid@nvidia.com>

----
v1 -> v2:
 - coalese the generic flow action fields initialization to a single loop
Reviewed-by: default avatarBaowen Zheng <baowen.zheng@corigine.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 3b15b3e9
...@@ -3533,7 +3533,7 @@ int tc_setup_action(struct flow_action *flow_action, ...@@ -3533,7 +3533,7 @@ int tc_setup_action(struct flow_action *flow_action,
struct tc_action *actions[], struct tc_action *actions[],
struct netlink_ext_ack *extack) struct netlink_ext_ack *extack)
{ {
int i, j, index, err = 0; int i, j, k, index, err = 0;
struct tc_action *act; struct tc_action *act;
BUILD_BUG_ON(TCA_ACT_HW_STATS_ANY != FLOW_ACTION_HW_STATS_ANY); BUILD_BUG_ON(TCA_ACT_HW_STATS_ANY != FLOW_ACTION_HW_STATS_ANY);
...@@ -3553,14 +3553,18 @@ int tc_setup_action(struct flow_action *flow_action, ...@@ -3553,14 +3553,18 @@ int tc_setup_action(struct flow_action *flow_action,
if (err) if (err)
goto err_out_locked; goto err_out_locked;
entry->hw_stats = tc_act_hw_stats(act->hw_stats);
entry->hw_index = act->tcfa_index;
index = 0; index = 0;
err = tc_setup_offload_act(act, entry, &index, extack); err = tc_setup_offload_act(act, entry, &index, extack);
if (!err) if (err)
j += index;
else
goto err_out_locked; goto err_out_locked;
for (k = 0; k < index ; k++) {
entry[k].hw_stats = tc_act_hw_stats(act->hw_stats);
entry[k].hw_index = act->tcfa_index;
}
j += index;
spin_unlock_bh(&act->tcfa_lock); spin_unlock_bh(&act->tcfa_lock);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment