net: ethernet: mtk_eth_soc: missing mutex

Patch 2ed37183ab ("netfilter: flowtable: separate replace, destroy and
stats to different workqueues") splits the workqueue per event type. Add
a mutex to serialize updates.

Fixes: 502e84e238 ("net: ethernet: mtk_eth_soc: add flow offloading support")
Reported-by: Frank Wunderlich <frank-w@public-files.de>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Pablo Neira Ayuso 2021-04-18 23:11:44 +02:00 committed by David S. Miller
parent 0e389028ad
commit 014d029876
1 changed files with 14 additions and 5 deletions

View File

@ -391,6 +391,8 @@ mtk_flow_offload_stats(struct mtk_eth *eth, struct flow_cls_offload *f)
return 0;
}
static DEFINE_MUTEX(mtk_flow_offload_mutex);
static int
mtk_eth_setup_tc_block_cb(enum tc_setup_type type, void *type_data, void *cb_priv)
{
@ -398,6 +400,7 @@ mtk_eth_setup_tc_block_cb(enum tc_setup_type type, void *type_data, void *cb_pri
struct net_device *dev = cb_priv;
struct mtk_mac *mac = netdev_priv(dev);
struct mtk_eth *eth = mac->hw;
int err;
if (!tc_can_offload(dev))
return -EOPNOTSUPP;
@ -405,18 +408,24 @@ mtk_eth_setup_tc_block_cb(enum tc_setup_type type, void *type_data, void *cb_pri
if (type != TC_SETUP_CLSFLOWER)
return -EOPNOTSUPP;
mutex_lock(&mtk_flow_offload_mutex);
switch (cls->command) {
case FLOW_CLS_REPLACE:
return mtk_flow_offload_replace(eth, cls);
err = mtk_flow_offload_replace(eth, cls);
break;
case FLOW_CLS_DESTROY:
return mtk_flow_offload_destroy(eth, cls);
err = mtk_flow_offload_destroy(eth, cls);
break;
case FLOW_CLS_STATS:
return mtk_flow_offload_stats(eth, cls);
err = mtk_flow_offload_stats(eth, cls);
break;
default:
return -EOPNOTSUPP;
err = -EOPNOTSUPP;
break;
}
mutex_unlock(&mtk_flow_offload_mutex);
return 0;
return err;
}
static int