Skip to content

Commit

Permalink
net/sched: Fix actions list corruption when adding offloaded tc flows
Browse files Browse the repository at this point in the history
Prior to commit b3f55bd, the networking core doesn't wire an in-place
actions list the when the low level driver is called to offload the flow,
but all low level drivers do that (call tcf_exts_to_list()) in their
offloading "add" logic.

Now, the in-place list is set in the core which goes over the list in a loop,
but also by the hw driver when their offloading code is invoked indirectly:

	cls_xxx add flow -> tc_setup_cb_call -> tc_exts_setup_cb_egdev_call -> hw driver

which messes up the core list instance upon driver return. Fix that by avoiding
in-place list on the net core code that deals with adding flows.

Fixes: b3f55bd ('net: sched: introduce per-egress action device callbacks')
Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com>
Acked-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Or Gerlitz authored and David S. Miller committed Oct 24, 2017
1 parent 907aaa6 commit 9d452ce
Showing 1 changed file with 3 additions and 4 deletions.
7 changes: 3 additions & 4 deletions net/sched/cls_api.c
Original file line number Diff line number Diff line change
Expand Up @@ -1184,14 +1184,13 @@ static int tc_exts_setup_cb_egdev_call(struct tcf_exts *exts,
#ifdef CONFIG_NET_CLS_ACT
const struct tc_action *a;
struct net_device *dev;
LIST_HEAD(actions);
int ret;
int i, ret;

if (!tcf_exts_has_actions(exts))
return 0;

tcf_exts_to_list(exts, &actions);
list_for_each_entry(a, &actions, list) {
for (i = 0; i < exts->nr_actions; i++) {
a = exts->actions[i];
if (!a->ops->get_dev)
continue;
dev = a->ops->get_dev(a);
Expand Down

0 comments on commit 9d452ce

Please sign in to comment.