kernel: backport a few upstream flow offloading fixes
[openwrt/staging/mkresin.git] / target / linux / generic / backport-5.10 / 610-v5.13-52-net-ethernet-mtk_eth_soc-missing-mutex.patch
1 From: Pablo Neira Ayuso <pablo@netfilter.org>
2 Date: Sun, 18 Apr 2021 23:11:44 +0200
3 Subject: [PATCH] net: ethernet: mtk_eth_soc: missing mutex
4
5 Patch 2ed37183abb7 ("netfilter: flowtable: separate replace, destroy and
6 stats to different workqueues") splits the workqueue per event type. Add
7 a mutex to serialize updates.
8
9 Fixes: 502e84e2382d ("net: ethernet: mtk_eth_soc: add flow offloading support")
10 Reported-by: Frank Wunderlich <frank-w@public-files.de>
11 Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
12 Signed-off-by: David S. Miller <davem@davemloft.net>
13 ---
14
15 --- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
16 +++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
17 @@ -392,6 +392,8 @@ mtk_flow_offload_stats(struct mtk_eth *e
18 return 0;
19 }
20
21 +static DEFINE_MUTEX(mtk_flow_offload_mutex);
22 +
23 static int
24 mtk_eth_setup_tc_block_cb(enum tc_setup_type type, void *type_data, void *cb_priv)
25 {
26 @@ -399,6 +401,7 @@ mtk_eth_setup_tc_block_cb(enum tc_setup_
27 struct net_device *dev = cb_priv;
28 struct mtk_mac *mac = netdev_priv(dev);
29 struct mtk_eth *eth = mac->hw;
30 + int err;
31
32 if (!tc_can_offload(dev))
33 return -EOPNOTSUPP;
34 @@ -406,18 +409,24 @@ mtk_eth_setup_tc_block_cb(enum tc_setup_
35 if (type != TC_SETUP_CLSFLOWER)
36 return -EOPNOTSUPP;
37
38 + mutex_lock(&mtk_flow_offload_mutex);
39 switch (cls->command) {
40 case FLOW_CLS_REPLACE:
41 - return mtk_flow_offload_replace(eth, cls);
42 + err = mtk_flow_offload_replace(eth, cls);
43 + break;
44 case FLOW_CLS_DESTROY:
45 - return mtk_flow_offload_destroy(eth, cls);
46 + err = mtk_flow_offload_destroy(eth, cls);
47 + break;
48 case FLOW_CLS_STATS:
49 - return mtk_flow_offload_stats(eth, cls);
50 + err = mtk_flow_offload_stats(eth, cls);
51 + break;
52 default:
53 - return -EOPNOTSUPP;
54 + err = -EOPNOTSUPP;
55 + break;
56 }
57 + mutex_unlock(&mtk_flow_offload_mutex);
58
59 - return 0;
60 + return err;
61 }
62
63 static int