Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
Kernel
提交
2d7e73f0
K
Kernel
项目概览
openeuler
/
Kernel
1 年多 前同步成功
通知
8
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
Kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
2d7e73f0
编写于
10月 25, 2021
作者:
D
David S. Miller
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Revert "Merge branch 'dsa-rtnl'"
This reverts commit
965e6b26
, reversing changes made to
4d98bb0d
.
上级
12f241f2
变更
15
隐藏空白更改
内联
并排
Showing
15 changed file
with
74 addition
and
283 deletion
+74
-283
MAINTAINERS
MAINTAINERS
+0
-1
drivers/net/dsa/b53/b53_common.c
drivers/net/dsa/b53/b53_common.c
+6
-34
drivers/net/dsa/b53/b53_priv.h
drivers/net/dsa/b53/b53_priv.h
+0
-1
drivers/net/dsa/lantiq_gswip.c
drivers/net/dsa/lantiq_gswip.c
+5
-23
drivers/net/dsa/sja1105/sja1105.h
drivers/net/dsa/sja1105/sja1105.h
+0
-2
drivers/net/dsa/sja1105/sja1105_dynamic_config.c
drivers/net/dsa/sja1105/sja1105_dynamic_config.c
+23
-68
drivers/net/dsa/sja1105/sja1105_main.c
drivers/net/dsa/sja1105/sja1105_main.c
+0
-1
drivers/net/ethernet/mscc/ocelot.c
drivers/net/ethernet/mscc/ocelot.c
+12
-41
include/net/dsa.h
include/net/dsa.h
+0
-1
include/soc/mscc/ocelot.h
include/soc/mscc/ocelot.h
+0
-3
net/dsa/dsa2.c
net/dsa/dsa2.c
+0
-1
net/dsa/slave.c
net/dsa/slave.c
+2
-0
net/dsa/switch.c
net/dsa/switch.c
+24
-52
tools/testing/selftests/drivers/net/dsa/test_bridge_fdb_stress.sh
...sting/selftests/drivers/net/dsa/test_bridge_fdb_stress.sh
+0
-47
tools/testing/selftests/net/forwarding/lib.sh
tools/testing/selftests/net/forwarding/lib.sh
+2
-8
未找到文件。
MAINTAINERS
浏览文件 @
2d7e73f0
...
...
@@ -13056,7 +13056,6 @@ F: include/linux/dsa/
F: include/linux/platform_data/dsa.h
F: include/net/dsa.h
F: net/dsa/
F: tools/testing/selftests/drivers/net/dsa/
NETWORKING [GENERAL]
M: "David S. Miller" <davem@davemloft.net>
...
...
drivers/net/dsa/b53/b53_common.c
浏览文件 @
2d7e73f0
...
...
@@ -1544,7 +1544,6 @@ EXPORT_SYMBOL(b53_vlan_del);
/* Address Resolution Logic routines */
static
int
b53_arl_op_wait
(
struct
b53_device
*
dev
)
__must_hold
(
&
dev
->
arl_mutex
)
{
unsigned
int
timeout
=
10
;
u8
reg
;
...
...
@@ -1563,7 +1562,6 @@ static int b53_arl_op_wait(struct b53_device *dev)
}
static
int
b53_arl_rw_op
(
struct
b53_device
*
dev
,
unsigned
int
op
)
__must_hold
(
&
dev
->
arl_mutex
)
{
u8
reg
;
...
...
@@ -1587,7 +1585,6 @@ static int b53_arl_rw_op(struct b53_device *dev, unsigned int op)
static
int
b53_arl_read
(
struct
b53_device
*
dev
,
u64
mac
,
u16
vid
,
struct
b53_arl_entry
*
ent
,
u8
*
idx
)
__must_hold
(
&
dev
->
arl_mutex
)
{
DECLARE_BITMAP
(
free_bins
,
B53_ARLTBL_MAX_BIN_ENTRIES
);
unsigned
int
i
;
...
...
@@ -1633,7 +1630,6 @@ static int b53_arl_read(struct b53_device *dev, u64 mac,
static
int
b53_arl_op
(
struct
b53_device
*
dev
,
int
op
,
int
port
,
const
unsigned
char
*
addr
,
u16
vid
,
bool
is_valid
)
__must_hold
(
&
dev
->
arl_mutex
)
{
struct
b53_arl_entry
ent
;
u32
fwd_entry
;
...
...
@@ -1711,7 +1707,6 @@ int b53_fdb_add(struct dsa_switch *ds, int port,
const
unsigned
char
*
addr
,
u16
vid
)
{
struct
b53_device
*
priv
=
ds
->
priv
;
int
ret
;
/* 5325 and 5365 require some more massaging, but could
* be supported eventually
...
...
@@ -1719,11 +1714,7 @@ int b53_fdb_add(struct dsa_switch *ds, int port,
if
(
is5325
(
priv
)
||
is5365
(
priv
))
return
-
EOPNOTSUPP
;
mutex_lock
(
&
priv
->
arl_mutex
);
ret
=
b53_arl_op
(
priv
,
0
,
port
,
addr
,
vid
,
true
);
mutex_unlock
(
&
priv
->
arl_mutex
);
return
ret
;
return
b53_arl_op
(
priv
,
0
,
port
,
addr
,
vid
,
true
);
}
EXPORT_SYMBOL
(
b53_fdb_add
);
...
...
@@ -1731,18 +1722,12 @@ int b53_fdb_del(struct dsa_switch *ds, int port,
const
unsigned
char
*
addr
,
u16
vid
)
{
struct
b53_device
*
priv
=
ds
->
priv
;
int
ret
;
mutex_lock
(
&
priv
->
arl_mutex
);
ret
=
b53_arl_op
(
priv
,
0
,
port
,
addr
,
vid
,
false
);
mutex_unlock
(
&
priv
->
arl_mutex
);
return
ret
;
return
b53_arl_op
(
priv
,
0
,
port
,
addr
,
vid
,
false
);
}
EXPORT_SYMBOL
(
b53_fdb_del
);
static
int
b53_arl_search_wait
(
struct
b53_device
*
dev
)
__must_hold
(
&
dev
->
arl_mutex
)
{
unsigned
int
timeout
=
1000
;
u8
reg
;
...
...
@@ -1763,7 +1748,6 @@ static int b53_arl_search_wait(struct b53_device *dev)
static
void
b53_arl_search_rd
(
struct
b53_device
*
dev
,
u8
idx
,
struct
b53_arl_entry
*
ent
)
__must_hold
(
&
dev
->
arl_mutex
)
{
u64
mac_vid
;
u32
fwd_entry
;
...
...
@@ -1796,8 +1780,6 @@ int b53_fdb_dump(struct dsa_switch *ds, int port,
int
ret
;
u8
reg
;
mutex_lock
(
&
priv
->
arl_mutex
);
/* Start search operation */
reg
=
ARL_SRCH_STDN
;
b53_write8
(
priv
,
B53_ARLIO_PAGE
,
B53_ARL_SRCH_CTL
,
reg
);
...
...
@@ -1805,18 +1787,18 @@ int b53_fdb_dump(struct dsa_switch *ds, int port,
do
{
ret
=
b53_arl_search_wait
(
priv
);
if
(
ret
)
break
;
return
ret
;
b53_arl_search_rd
(
priv
,
0
,
&
results
[
0
]);
ret
=
b53_fdb_copy
(
port
,
&
results
[
0
],
cb
,
data
);
if
(
ret
)
break
;
return
ret
;
if
(
priv
->
num_arl_bins
>
2
)
{
b53_arl_search_rd
(
priv
,
1
,
&
results
[
1
]);
ret
=
b53_fdb_copy
(
port
,
&
results
[
1
],
cb
,
data
);
if
(
ret
)
break
;
return
ret
;
if
(
!
results
[
0
].
is_valid
&&
!
results
[
1
].
is_valid
)
break
;
...
...
@@ -1824,8 +1806,6 @@ int b53_fdb_dump(struct dsa_switch *ds, int port,
}
while
(
count
++
<
b53_max_arl_entries
(
priv
)
/
2
);
mutex_unlock
(
&
priv
->
arl_mutex
);
return
0
;
}
EXPORT_SYMBOL
(
b53_fdb_dump
);
...
...
@@ -1834,7 +1814,6 @@ int b53_mdb_add(struct dsa_switch *ds, int port,
const
struct
switchdev_obj_port_mdb
*
mdb
)
{
struct
b53_device
*
priv
=
ds
->
priv
;
int
ret
;
/* 5325 and 5365 require some more massaging, but could
* be supported eventually
...
...
@@ -1842,11 +1821,7 @@ int b53_mdb_add(struct dsa_switch *ds, int port,
if
(
is5325
(
priv
)
||
is5365
(
priv
))
return
-
EOPNOTSUPP
;
mutex_lock
(
&
priv
->
arl_mutex
);
ret
=
b53_arl_op
(
priv
,
0
,
port
,
mdb
->
addr
,
mdb
->
vid
,
true
);
mutex_unlock
(
&
priv
->
arl_mutex
);
return
ret
;
return
b53_arl_op
(
priv
,
0
,
port
,
mdb
->
addr
,
mdb
->
vid
,
true
);
}
EXPORT_SYMBOL
(
b53_mdb_add
);
...
...
@@ -1856,9 +1831,7 @@ int b53_mdb_del(struct dsa_switch *ds, int port,
struct
b53_device
*
priv
=
ds
->
priv
;
int
ret
;
mutex_lock
(
&
priv
->
arl_mutex
);
ret
=
b53_arl_op
(
priv
,
0
,
port
,
mdb
->
addr
,
mdb
->
vid
,
false
);
mutex_unlock
(
&
priv
->
arl_mutex
);
if
(
ret
)
dev_err
(
ds
->
dev
,
"failed to delete MDB entry
\n
"
);
...
...
@@ -2695,7 +2668,6 @@ struct b53_device *b53_switch_alloc(struct device *base,
mutex_init
(
&
dev
->
reg_mutex
);
mutex_init
(
&
dev
->
stats_mutex
);
mutex_init
(
&
dev
->
arl_mutex
);
return
dev
;
}
...
...
drivers/net/dsa/b53/b53_priv.h
浏览文件 @
2d7e73f0
...
...
@@ -107,7 +107,6 @@ struct b53_device {
struct
mutex
reg_mutex
;
struct
mutex
stats_mutex
;
struct
mutex
arl_mutex
;
const
struct
b53_io_ops
*
ops
;
/* chip specific data */
...
...
drivers/net/dsa/lantiq_gswip.c
浏览文件 @
2d7e73f0
...
...
@@ -276,7 +276,6 @@ struct gswip_priv {
int
num_gphy_fw
;
struct
gswip_gphy_fw
*
gphy_fw
;
u32
port_vlan_filter
;
struct
mutex
pce_table_lock
;
};
struct
gswip_pce_table_entry
{
...
...
@@ -524,14 +523,10 @@ static int gswip_pce_table_entry_read(struct gswip_priv *priv,
u16
addr_mode
=
tbl
->
key_mode
?
GSWIP_PCE_TBL_CTRL_OPMOD_KSRD
:
GSWIP_PCE_TBL_CTRL_OPMOD_ADRD
;
mutex_lock
(
&
priv
->
pce_table_lock
);
err
=
gswip_switch_r_timeout
(
priv
,
GSWIP_PCE_TBL_CTRL
,
GSWIP_PCE_TBL_CTRL_BAS
);
if
(
err
)
{
mutex_unlock
(
&
priv
->
pce_table_lock
);
if
(
err
)
return
err
;
}
gswip_switch_w
(
priv
,
tbl
->
index
,
GSWIP_PCE_TBL_ADDR
);
gswip_switch_mask
(
priv
,
GSWIP_PCE_TBL_CTRL_ADDR_MASK
|
...
...
@@ -541,10 +536,8 @@ static int gswip_pce_table_entry_read(struct gswip_priv *priv,
err
=
gswip_switch_r_timeout
(
priv
,
GSWIP_PCE_TBL_CTRL
,
GSWIP_PCE_TBL_CTRL_BAS
);
if
(
err
)
{
mutex_unlock
(
&
priv
->
pce_table_lock
);
if
(
err
)
return
err
;
}
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
tbl
->
key
);
i
++
)
tbl
->
key
[
i
]
=
gswip_switch_r
(
priv
,
GSWIP_PCE_TBL_KEY
(
i
));
...
...
@@ -560,8 +553,6 @@ static int gswip_pce_table_entry_read(struct gswip_priv *priv,
tbl
->
valid
=
!!
(
crtl
&
GSWIP_PCE_TBL_CTRL_VLD
);
tbl
->
gmap
=
(
crtl
&
GSWIP_PCE_TBL_CTRL_GMAP_MASK
)
>>
7
;
mutex_unlock
(
&
priv
->
pce_table_lock
);
return
0
;
}
...
...
@@ -574,14 +565,10 @@ static int gswip_pce_table_entry_write(struct gswip_priv *priv,
u16
addr_mode
=
tbl
->
key_mode
?
GSWIP_PCE_TBL_CTRL_OPMOD_KSWR
:
GSWIP_PCE_TBL_CTRL_OPMOD_ADWR
;
mutex_lock
(
&
priv
->
pce_table_lock
);
err
=
gswip_switch_r_timeout
(
priv
,
GSWIP_PCE_TBL_CTRL
,
GSWIP_PCE_TBL_CTRL_BAS
);
if
(
err
)
{
mutex_unlock
(
&
priv
->
pce_table_lock
);
if
(
err
)
return
err
;
}
gswip_switch_w
(
priv
,
tbl
->
index
,
GSWIP_PCE_TBL_ADDR
);
gswip_switch_mask
(
priv
,
GSWIP_PCE_TBL_CTRL_ADDR_MASK
|
...
...
@@ -613,12 +600,8 @@ static int gswip_pce_table_entry_write(struct gswip_priv *priv,
crtl
|=
GSWIP_PCE_TBL_CTRL_BAS
;
gswip_switch_w
(
priv
,
crtl
,
GSWIP_PCE_TBL_CTRL
);
err
=
gswip_switch_r_timeout
(
priv
,
GSWIP_PCE_TBL_CTRL
,
GSWIP_PCE_TBL_CTRL_BAS
);
mutex_unlock
(
&
priv
->
pce_table_lock
);
return
err
;
return
gswip_switch_r_timeout
(
priv
,
GSWIP_PCE_TBL_CTRL
,
GSWIP_PCE_TBL_CTRL_BAS
);
}
/* Add the LAN port into a bridge with the CPU port by
...
...
@@ -2121,7 +2104,6 @@ static int gswip_probe(struct platform_device *pdev)
priv
->
ds
->
priv
=
priv
;
priv
->
ds
->
ops
=
priv
->
hw_info
->
ops
;
priv
->
dev
=
dev
;
mutex_init
(
&
priv
->
pce_table_lock
);
version
=
gswip_switch_r
(
priv
,
GSWIP_VERSION
);
np
=
dev
->
of_node
;
...
...
drivers/net/dsa/sja1105/sja1105.h
浏览文件 @
2d7e73f0
...
...
@@ -261,8 +261,6 @@ struct sja1105_private {
* the switch doesn't confuse them with one another.
*/
struct
mutex
mgmt_lock
;
/* Serializes access to the dynamic config interface */
struct
mutex
dynamic_config_lock
;
struct
devlink_region
**
regions
;
struct
sja1105_cbs_entry
*
cbs
;
struct
mii_bus
*
mdio_base_t1
;
...
...
drivers/net/dsa/sja1105/sja1105_dynamic_config.c
浏览文件 @
2d7e73f0
...
...
@@ -1170,56 +1170,6 @@ const struct sja1105_dynamic_table_ops sja1110_dyn_ops[BLK_IDX_MAX_DYN] = {
},
};
#define SJA1105_DYNAMIC_CONFIG_SLEEP_US 10
#define SJA1105_DYNAMIC_CONFIG_TIMEOUT_US 100000
static
int
sja1105_dynamic_config_poll_valid
(
struct
sja1105_private
*
priv
,
struct
sja1105_dyn_cmd
*
cmd
,
const
struct
sja1105_dynamic_table_ops
*
ops
)
{
u8
packed_buf
[
SJA1105_MAX_DYN_CMD_SIZE
]
=
{};
int
rc
;
/* We don't _need_ to read the full entry, just the command area which
* is a fixed SJA1105_SIZE_DYN_CMD. But our cmd_packing() API expects a
* buffer that contains the full entry too. Additionally, our API
* doesn't really know how many bytes into the buffer does the command
* area really begin. So just read back the whole entry.
*/
rc
=
sja1105_xfer_buf
(
priv
,
SPI_READ
,
ops
->
addr
,
packed_buf
,
ops
->
packed_size
);
if
(
rc
)
return
rc
;
/* Unpack the command structure, and return it to the caller in case it
* needs to perform further checks on it (VALIDENT).
*/
memset
(
cmd
,
0
,
sizeof
(
*
cmd
));
ops
->
cmd_packing
(
packed_buf
,
cmd
,
UNPACK
);
/* Hardware hasn't cleared VALID => still working on it */
return
cmd
->
valid
?
-
EAGAIN
:
0
;
}
/* Poll the dynamic config entry's control area until the hardware has
* cleared the VALID bit, which means we have confirmation that it has
* finished processing the command.
*/
static
int
sja1105_dynamic_config_wait_complete
(
struct
sja1105_private
*
priv
,
struct
sja1105_dyn_cmd
*
cmd
,
const
struct
sja1105_dynamic_table_ops
*
ops
)
{
int
rc
;
return
read_poll_timeout
(
sja1105_dynamic_config_poll_valid
,
rc
,
rc
!=
-
EAGAIN
,
SJA1105_DYNAMIC_CONFIG_SLEEP_US
,
SJA1105_DYNAMIC_CONFIG_TIMEOUT_US
,
false
,
priv
,
cmd
,
ops
);
}
/* Provides read access to the settings through the dynamic interface
* of the switch.
* @blk_idx is used as key to select from the sja1105_dynamic_table_ops.
...
...
@@ -1246,6 +1196,7 @@ int sja1105_dynamic_config_read(struct sja1105_private *priv,
struct
sja1105_dyn_cmd
cmd
=
{
0
};
/* SPI payload buffer */
u8
packed_buf
[
SJA1105_MAX_DYN_CMD_SIZE
]
=
{
0
};
int
retries
=
3
;
int
rc
;
if
(
blk_idx
>=
BLK_IDX_MAX_DYN
)
...
...
@@ -1283,21 +1234,33 @@ int sja1105_dynamic_config_read(struct sja1105_private *priv,
ops
->
entry_packing
(
packed_buf
,
entry
,
PACK
);
/* Send SPI write operation: read config table entry */
mutex_lock
(
&
priv
->
dynamic_config_lock
);
rc
=
sja1105_xfer_buf
(
priv
,
SPI_WRITE
,
ops
->
addr
,
packed_buf
,
ops
->
packed_size
);
if
(
rc
<
0
)
{
mutex_unlock
(
&
priv
->
dynamic_config_lock
);
return
rc
;
}
rc
=
sja1105_dynamic_config_wait_complete
(
priv
,
&
cmd
,
ops
);
mutex_unlock
(
&
priv
->
dynamic_config_lock
);
if
(
rc
<
0
)
return
rc
;
if
(
!
cmd
.
valident
&&
!
(
ops
->
access
&
OP_VALID_ANYWAY
))
return
-
ENOENT
;
/* Loop until we have confirmation that hardware has finished
* processing the command and has cleared the VALID field
*/
do
{
memset
(
packed_buf
,
0
,
ops
->
packed_size
);
/* Retrieve the read operation's result */
rc
=
sja1105_xfer_buf
(
priv
,
SPI_READ
,
ops
->
addr
,
packed_buf
,
ops
->
packed_size
);
if
(
rc
<
0
)
return
rc
;
cmd
=
(
struct
sja1105_dyn_cmd
)
{
0
};
ops
->
cmd_packing
(
packed_buf
,
&
cmd
,
UNPACK
);
if
(
!
cmd
.
valident
&&
!
(
ops
->
access
&
OP_VALID_ANYWAY
))
return
-
ENOENT
;
cpu_relax
();
}
while
(
cmd
.
valid
&&
--
retries
);
if
(
cmd
.
valid
)
return
-
ETIMEDOUT
;
/* Don't dereference possibly NULL pointer - maybe caller
* only wanted to see whether the entry existed or not.
...
...
@@ -1353,16 +1316,8 @@ int sja1105_dynamic_config_write(struct sja1105_private *priv,
ops
->
entry_packing
(
packed_buf
,
entry
,
PACK
);
/* Send SPI write operation: read config table entry */
mutex_lock
(
&
priv
->
dynamic_config_lock
);
rc
=
sja1105_xfer_buf
(
priv
,
SPI_WRITE
,
ops
->
addr
,
packed_buf
,
ops
->
packed_size
);
if
(
rc
<
0
)
{
mutex_unlock
(
&
priv
->
dynamic_config_lock
);
return
rc
;
}
rc
=
sja1105_dynamic_config_wait_complete
(
priv
,
&
cmd
,
ops
);
mutex_unlock
(
&
priv
->
dynamic_config_lock
);
if
(
rc
<
0
)
return
rc
;
...
...
drivers/net/dsa/sja1105/sja1105_main.c
浏览文件 @
2d7e73f0
...
...
@@ -3365,7 +3365,6 @@ static int sja1105_probe(struct spi_device *spi)
priv
->
ds
=
ds
;
mutex_init
(
&
priv
->
ptp_data
.
lock
);
mutex_init
(
&
priv
->
dynamic_config_lock
);
mutex_init
(
&
priv
->
mgmt_lock
);
rc
=
sja1105_parse_dt
(
priv
);
...
...
drivers/net/ethernet/mscc/ocelot.c
浏览文件 @
2d7e73f0
...
...
@@ -21,13 +21,11 @@ struct ocelot_mact_entry {
};
static
inline
u32
ocelot_mact_read_macaccess
(
struct
ocelot
*
ocelot
)
__must_hold
(
&
ocelot
->
mact_lock
)
{
return
ocelot_read
(
ocelot
,
ANA_TABLES_MACACCESS
);
}
static
inline
int
ocelot_mact_wait_for_completion
(
struct
ocelot
*
ocelot
)
__must_hold
(
&
ocelot
->
mact_lock
)
{
u32
val
;
...
...
@@ -41,7 +39,6 @@ static inline int ocelot_mact_wait_for_completion(struct ocelot *ocelot)
static
void
ocelot_mact_select
(
struct
ocelot
*
ocelot
,
const
unsigned
char
mac
[
ETH_ALEN
],
unsigned
int
vid
)
__must_hold
(
&
ocelot
->
mact_lock
)
{
u32
macl
=
0
,
mach
=
0
;
...
...
@@ -70,7 +67,6 @@ int ocelot_mact_learn(struct ocelot *ocelot, int port,
ANA_TABLES_MACACCESS_ENTRYTYPE
(
type
)
|
ANA_TABLES_MACACCESS_MAC_TABLE_CMD
(
MACACCESS_CMD_LEARN
);
unsigned
int
mc_ports
;
int
err
;
/* Set MAC_CPU_COPY if the CPU port is used by a multicast entry */
if
(
type
==
ENTRYTYPE_MACv4
)
...
...
@@ -83,28 +79,18 @@ int ocelot_mact_learn(struct ocelot *ocelot, int port,
if
(
mc_ports
&
BIT
(
ocelot
->
num_phys_ports
))
cmd
|=
ANA_TABLES_MACACCESS_MAC_CPU_COPY
;
mutex_lock
(
&
ocelot
->
mact_lock
);
ocelot_mact_select
(
ocelot
,
mac
,
vid
);
/* Issue a write command */
ocelot_write
(
ocelot
,
cmd
,
ANA_TABLES_MACACCESS
);
err
=
ocelot_mact_wait_for_completion
(
ocelot
);
mutex_unlock
(
&
ocelot
->
mact_lock
);
return
err
;
return
ocelot_mact_wait_for_completion
(
ocelot
);
}
EXPORT_SYMBOL
(
ocelot_mact_learn
);
int
ocelot_mact_forget
(
struct
ocelot
*
ocelot
,
const
unsigned
char
mac
[
ETH_ALEN
],
unsigned
int
vid
)
{
int
err
;
mutex_lock
(
&
ocelot
->
mact_lock
);
ocelot_mact_select
(
ocelot
,
mac
,
vid
);
/* Issue a forget command */
...
...
@@ -112,11 +98,7 @@ int ocelot_mact_forget(struct ocelot *ocelot,
ANA_TABLES_MACACCESS_MAC_TABLE_CMD
(
MACACCESS_CMD_FORGET
),
ANA_TABLES_MACACCESS
);
err
=
ocelot_mact_wait_for_completion
(
ocelot
);
mutex_unlock
(
&
ocelot
->
mact_lock
);
return
err
;
return
ocelot_mact_wait_for_completion
(
ocelot
);
}
EXPORT_SYMBOL
(
ocelot_mact_forget
);
...
...
@@ -132,9 +114,7 @@ static void ocelot_mact_init(struct ocelot *ocelot)
|
ANA_AGENCTRL_LEARN_IGNORE_VLAN
,
ANA_AGENCTRL
);
/* Clear the MAC table. We are not concurrent with anyone, so
* holding &ocelot->mact_lock is pointless.
*/
/* Clear the MAC table */
ocelot_write
(
ocelot
,
MACACCESS_CMD_INIT
,
ANA_TABLES_MACACCESS
);
}
...
...
@@ -1192,7 +1172,6 @@ EXPORT_SYMBOL(ocelot_port_fdb_do_dump);
static
int
ocelot_mact_read
(
struct
ocelot
*
ocelot
,
int
port
,
int
row
,
int
col
,
struct
ocelot_mact_entry
*
entry
)
__must_hold
(
&
ocelot
->
mact_lock
)
{
u32
val
,
dst
,
macl
,
mach
;
char
mac
[
ETH_ALEN
];
...
...
@@ -1241,40 +1220,33 @@ static int ocelot_mact_read(struct ocelot *ocelot, int port, int row, int col,
int
ocelot_fdb_dump
(
struct
ocelot
*
ocelot
,
int
port
,
dsa_fdb_dump_cb_t
*
cb
,
void
*
data
)
{
int
err
=
0
;
int
i
,
j
;
/* We could take the lock just around ocelot_mact_read, but doing so
* thousands of times in a row seems rather pointless and inefficient.
*/
mutex_lock
(
&
ocelot
->
mact_lock
);
/* Loop through all the mac tables entries. */
for
(
i
=
0
;
i
<
ocelot
->
num_mact_rows
;
i
++
)
{
for
(
j
=
0
;
j
<
4
;
j
++
)
{
struct
ocelot_mact_entry
entry
;
bool
is_static
;
int
ret
;
err
=
ocelot_mact_read
(
ocelot
,
port
,
i
,
j
,
&
entry
);
ret
=
ocelot_mact_read
(
ocelot
,
port
,
i
,
j
,
&
entry
);
/* If the entry is invalid (wrong port, invalid...),
* skip it.
*/
if
(
err
==
-
EINVAL
)
if
(
ret
==
-
EINVAL
)
continue
;
else
if
(
err
)
break
;
else
if
(
ret
)
return
ret
;
is_static
=
(
entry
.
type
==
ENTRYTYPE_LOCKED
);
err
=
cb
(
entry
.
mac
,
entry
.
vid
,
is_static
,
data
);
if
(
err
)
break
;
ret
=
cb
(
entry
.
mac
,
entry
.
vid
,
is_static
,
data
);
if
(
ret
)
return
ret
;
}
}
mutex_unlock
(
&
ocelot
->
mact_lock
);
return
err
;
return
0
;
}
EXPORT_SYMBOL
(
ocelot_fdb_dump
);
...
...
@@ -2259,7 +2231,6 @@ int ocelot_init(struct ocelot *ocelot)
mutex_init
(
&
ocelot
->
stats_lock
);
mutex_init
(
&
ocelot
->
ptp_lock
);
mutex_init
(
&
ocelot
->
mact_lock
);
spin_lock_init
(
&
ocelot
->
ptp_clock_lock
);
spin_lock_init
(
&
ocelot
->
ts_id_lock
);
snprintf
(
queue_name
,
sizeof
(
queue_name
),
"%s-stats"
,
...
...
include/net/dsa.h
浏览文件 @
2d7e73f0
...
...
@@ -287,7 +287,6 @@ struct dsa_port {
/* List of MAC addresses that must be forwarded on this port.
* These are only valid on CPU ports and DSA links.
*/
struct
mutex
addr_lists_lock
;
struct
list_head
fdbs
;
struct
list_head
mdbs
;
...
...
include/soc/mscc/ocelot.h
浏览文件 @
2d7e73f0
...
...
@@ -675,9 +675,6 @@ struct ocelot {
struct
delayed_work
stats_work
;
struct
workqueue_struct
*
stats_queue
;
/* Lock for serializing access to the MAC table */
struct
mutex
mact_lock
;
struct
workqueue_struct
*
owq
;
u8
ptp
:
1
;
...
...
net/dsa/dsa2.c
浏览文件 @
2d7e73f0
...
...
@@ -433,7 +433,6 @@ static int dsa_port_setup(struct dsa_port *dp)
if
(
dp
->
setup
)
return
0
;
mutex_init
(
&
dp
->
addr_lists_lock
);
INIT_LIST_HEAD
(
&
dp
->
fdbs
);
INIT_LIST_HEAD
(
&
dp
->
mdbs
);
...
...
net/dsa/slave.c
浏览文件 @
2d7e73f0
...
...
@@ -2413,6 +2413,7 @@ static void dsa_slave_switchdev_event_work(struct work_struct *work)
dp
=
dsa_to_port
(
ds
,
switchdev_work
->
port
);
rtnl_lock
();
switch
(
switchdev_work
->
event
)
{
case
SWITCHDEV_FDB_ADD_TO_DEVICE
:
if
(
switchdev_work
->
host_addr
)
...
...
@@ -2447,6 +2448,7 @@ static void dsa_slave_switchdev_event_work(struct work_struct *work)
break
;
}
rtnl_unlock
();
dev_put
(
switchdev_work
->
dev
);
kfree
(
switchdev_work
);
...
...
net/dsa/switch.c
浏览文件 @
2d7e73f0
...
...
@@ -215,30 +215,26 @@ static int dsa_port_do_mdb_add(struct dsa_port *dp,
struct
dsa_switch
*
ds
=
dp
->
ds
;
struct
dsa_mac_addr
*
a
;
int
port
=
dp
->
index
;
int
err
=
0
;
int
err
;
/* No need to bother with refcounting for user ports */
if
(
!
(
dsa_port_is_cpu
(
dp
)
||
dsa_port_is_dsa
(
dp
)))
return
ds
->
ops
->
port_mdb_add
(
ds
,
port
,
mdb
);
mutex_lock
(
&
dp
->
addr_lists_lock
);
a
=
dsa_mac_addr_find
(
&
dp
->
mdbs
,
mdb
->
addr
,
mdb
->
vid
);
if
(
a
)
{
refcount_inc
(
&
a
->
refcount
);
goto
out
;
return
0
;
}
a
=
kzalloc
(
sizeof
(
*
a
),
GFP_KERNEL
);
if
(
!
a
)
{
err
=
-
ENOMEM
;
goto
out
;
}
if
(
!
a
)
return
-
ENOMEM
;
err
=
ds
->
ops
->
port_mdb_add
(
ds
,
port
,
mdb
);
if
(
err
)
{
kfree
(
a
);
goto
out
;
return
err
;
}
ether_addr_copy
(
a
->
addr
,
mdb
->
addr
);
...
...
@@ -246,10 +242,7 @@ static int dsa_port_do_mdb_add(struct dsa_port *dp,
refcount_set
(
&
a
->
refcount
,
1
);
list_add_tail
(
&
a
->
list
,
&
dp
->
mdbs
);
out:
mutex_unlock
(
&
dp
->
addr_lists_lock
);
return
err
;
return
0
;
}
static
int
dsa_port_do_mdb_del
(
struct
dsa_port
*
dp
,
...
...
@@ -258,36 +251,29 @@ static int dsa_port_do_mdb_del(struct dsa_port *dp,
struct
dsa_switch
*
ds
=
dp
->
ds
;
struct
dsa_mac_addr
*
a
;
int
port
=
dp
->
index
;
int
err
=
0
;
int
err
;
/* No need to bother with refcounting for user ports */
if
(
!
(
dsa_port_is_cpu
(
dp
)
||
dsa_port_is_dsa
(
dp
)))
return
ds
->
ops
->
port_mdb_del
(
ds
,
port
,
mdb
);
mutex_lock
(
&
dp
->
addr_lists_lock
);
a
=
dsa_mac_addr_find
(
&
dp
->
mdbs
,
mdb
->
addr
,
mdb
->
vid
);
if
(
!
a
)
{
err
=
-
ENOENT
;
goto
out
;
}
if
(
!
a
)
return
-
ENOENT
;
if
(
!
refcount_dec_and_test
(
&
a
->
refcount
))
goto
out
;
return
0
;
err
=
ds
->
ops
->
port_mdb_del
(
ds
,
port
,
mdb
);
if
(
err
)
{
refcount_inc
(
&
a
->
refcount
);
goto
out
;
return
err
;
}
list_del
(
&
a
->
list
);
kfree
(
a
);
out:
mutex_unlock
(
&
dp
->
addr_lists_lock
);
return
err
;
return
0
;
}
static
int
dsa_port_do_fdb_add
(
struct
dsa_port
*
dp
,
const
unsigned
char
*
addr
,
...
...
@@ -296,30 +282,26 @@ static int dsa_port_do_fdb_add(struct dsa_port *dp, const unsigned char *addr,
struct
dsa_switch
*
ds
=
dp
->
ds
;
struct
dsa_mac_addr
*
a
;
int
port
=
dp
->
index
;
int
err
=
0
;
int
err
;
/* No need to bother with refcounting for user ports */
if
(
!
(
dsa_port_is_cpu
(
dp
)
||
dsa_port_is_dsa
(
dp
)))
return
ds
->
ops
->
port_fdb_add
(
ds
,
port
,
addr
,
vid
);
mutex_lock
(
&
dp
->
addr_lists_lock
);
a
=
dsa_mac_addr_find
(
&
dp
->
fdbs
,
addr
,
vid
);
if
(
a
)
{
refcount_inc
(
&
a
->
refcount
);
goto
out
;
return
0
;
}
a
=
kzalloc
(
sizeof
(
*
a
),
GFP_KERNEL
);
if
(
!
a
)
{
err
=
-
ENOMEM
;
goto
out
;
}
if
(
!
a
)
return
-
ENOMEM
;
err
=
ds
->
ops
->
port_fdb_add
(
ds
,
port
,
addr
,
vid
);
if
(
err
)
{
kfree
(
a
);
goto
out
;
return
err
;
}
ether_addr_copy
(
a
->
addr
,
addr
);
...
...
@@ -327,10 +309,7 @@ static int dsa_port_do_fdb_add(struct dsa_port *dp, const unsigned char *addr,
refcount_set
(
&
a
->
refcount
,
1
);
list_add_tail
(
&
a
->
list
,
&
dp
->
fdbs
);
out:
mutex_unlock
(
&
dp
->
addr_lists_lock
);
return
err
;
return
0
;
}
static
int
dsa_port_do_fdb_del
(
struct
dsa_port
*
dp
,
const
unsigned
char
*
addr
,
...
...
@@ -339,36 +318,29 @@ static int dsa_port_do_fdb_del(struct dsa_port *dp, const unsigned char *addr,
struct
dsa_switch
*
ds
=
dp
->
ds
;
struct
dsa_mac_addr
*
a
;
int
port
=
dp
->
index
;
int
err
=
0
;
int
err
;
/* No need to bother with refcounting for user ports */
if
(
!
(
dsa_port_is_cpu
(
dp
)
||
dsa_port_is_dsa
(
dp
)))
return
ds
->
ops
->
port_fdb_del
(
ds
,
port
,
addr
,
vid
);
mutex_lock
(
&
dp
->
addr_lists_lock
);
a
=
dsa_mac_addr_find
(
&
dp
->
fdbs
,
addr
,
vid
);
if
(
!
a
)
{
err
=
-
ENOENT
;
goto
out
;
}
if
(
!
a
)
return
-
ENOENT
;
if
(
!
refcount_dec_and_test
(
&
a
->
refcount
))
goto
out
;
return
0
;
err
=
ds
->
ops
->
port_fdb_del
(
ds
,
port
,
addr
,
vid
);
if
(
err
)
{
refcount_inc
(
&
a
->
refcount
);
goto
out
;
return
err
;
}
list_del
(
&
a
->
list
);
kfree
(
a
);
out:
mutex_unlock
(
&
dp
->
addr_lists_lock
);
return
err
;
return
0
;
}
static
int
dsa_switch_host_fdb_add
(
struct
dsa_switch
*
ds
,
...
...
tools/testing/selftests/drivers/net/dsa/test_bridge_fdb_stress.sh
已删除
100755 → 0
浏览文件 @
12f241f2
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
# Bridge FDB entries can be offloaded to DSA switches without holding the
# rtnl_mutex. Traditionally this mutex has conferred drivers implicit
# serialization, which means their code paths are not well tested in the
# presence of concurrency.
# This test creates a background task that stresses the FDB by adding and
# deleting an entry many times in a row without the rtnl_mutex held.
# It then tests the driver resistance to concurrency by calling .ndo_fdb_dump
# (with rtnl_mutex held) from a foreground task.
# Since either the FDB dump or the additions/removals can fail, but the
# additions and removals are performed in deferred as opposed to process
# context, we cannot simply check for user space error codes.
WAIT_TIME
=
1
NUM_NETIFS
=
1
REQUIRE_JQ
=
"no"
REQUIRE_MZ
=
"no"
NETIF_CREATE
=
"no"
lib_dir
=
$(
dirname
$0
)
/../../../net/forwarding
source
$lib_dir
/lib.sh
cleanup
()
{
echo
"Cleaning up"
kill
$pid
&&
wait
$pid
&> /dev/null
ip
link
del br0
echo
"Please check kernel log for errors"
}
trap
'cleanup'
EXIT
eth
=
${
NETIFS
[p1]
}
ip
link
del br0 2&>1
>
/dev/null
||
:
ip
link
add br0
type
bridge
&&
ip
link set
$eth
master br0
(
while
:
;
do
bridge fdb add 00:01:02:03:04:05 dev
$eth
master static
bridge fdb del 00:01:02:03:04:05 dev
$eth
master static
done
)
&
pid
=
$!
for
i
in
$(
seq
1 50
)
;
do
bridge fdb show
>
/dev/null
sleep
3
echo
"
$((${
i
}
*
2
))
% complete..."
done
tools/testing/selftests/net/forwarding/lib.sh
浏览文件 @
2d7e73f0
...
...
@@ -23,8 +23,6 @@ MC_CLI=${MC_CLI:=smcroutectl}
PING_TIMEOUT
=
${
PING_TIMEOUT
:
=5
}
WAIT_TIMEOUT
=
${
WAIT_TIMEOUT
:
=20
}
INTERFACE_TIMEOUT
=
${
INTERFACE_TIMEOUT
:
=600
}
REQUIRE_JQ
=
${
REQUIRE_JQ
:
=yes
}
REQUIRE_MZ
=
${
REQUIRE_MZ
:
=yes
}
relative_path
=
"
${
BASH_SOURCE
%/*
}
"
if
[[
"
$relative_path
"
==
"
${
BASH_SOURCE
}
"
]]
;
then
...
...
@@ -143,12 +141,8 @@ require_command()
fi
}
if
[[
"
$REQUIRE_JQ
"
=
"yes"
]]
;
then
require_command jq
fi
if
[[
"
$REQUIRE_MZ
"
=
"yes"
]]
;
then
require_command
$MZ
fi
require_command jq
require_command
$MZ
if
[[
!
-v
NUM_NETIFS
]]
;
then
echo
"SKIP: importer does not define
\"
NUM_NETIFS
\"
"
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录