Commit b7623816 authored by Daode Huang's avatar Daode Huang Committed by David S. Miller

net: hns: add spin lock for tcam table operation

This patch adds spin lock for tcam table operation,
there maybe a race condition happens when more than
one thread try to change the tcam talbe entries.
Signed-off-by: default avatarDaode Huang <huangdaode@hisilicon.com>
Signed-off-by: default avatarYisen Zhuang <Yisen.Zhuang@huawei.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 379d3954
...@@ -860,6 +860,8 @@ static void hns_dsaf_single_line_tbl_cfg( ...@@ -860,6 +860,8 @@ static void hns_dsaf_single_line_tbl_cfg(
struct dsaf_device *dsaf_dev, struct dsaf_device *dsaf_dev,
u32 address, struct dsaf_tbl_line_cfg *ptbl_line) u32 address, struct dsaf_tbl_line_cfg *ptbl_line)
{ {
spin_lock_bh(&dsaf_dev->tcam_lock);
/*Write Addr*/ /*Write Addr*/
hns_dsaf_tbl_line_addr_cfg(dsaf_dev, address); hns_dsaf_tbl_line_addr_cfg(dsaf_dev, address);
...@@ -868,6 +870,8 @@ static void hns_dsaf_single_line_tbl_cfg( ...@@ -868,6 +870,8 @@ static void hns_dsaf_single_line_tbl_cfg(
/*Write Plus*/ /*Write Plus*/
hns_dsaf_tbl_line_pul(dsaf_dev); hns_dsaf_tbl_line_pul(dsaf_dev);
spin_unlock_bh(&dsaf_dev->tcam_lock);
} }
/** /**
...@@ -881,6 +885,8 @@ static void hns_dsaf_tcam_uc_cfg( ...@@ -881,6 +885,8 @@ static void hns_dsaf_tcam_uc_cfg(
struct dsaf_tbl_tcam_data *ptbl_tcam_data, struct dsaf_tbl_tcam_data *ptbl_tcam_data,
struct dsaf_tbl_tcam_ucast_cfg *ptbl_tcam_ucast) struct dsaf_tbl_tcam_ucast_cfg *ptbl_tcam_ucast)
{ {
spin_lock_bh(&dsaf_dev->tcam_lock);
/*Write Addr*/ /*Write Addr*/
hns_dsaf_tbl_tcam_addr_cfg(dsaf_dev, address); hns_dsaf_tbl_tcam_addr_cfg(dsaf_dev, address);
/*Write Tcam Data*/ /*Write Tcam Data*/
...@@ -889,6 +895,8 @@ static void hns_dsaf_tcam_uc_cfg( ...@@ -889,6 +895,8 @@ static void hns_dsaf_tcam_uc_cfg(
hns_dsaf_tbl_tcam_ucast_cfg(dsaf_dev, ptbl_tcam_ucast); hns_dsaf_tbl_tcam_ucast_cfg(dsaf_dev, ptbl_tcam_ucast);
/*Write Plus*/ /*Write Plus*/
hns_dsaf_tbl_tcam_data_ucast_pul(dsaf_dev); hns_dsaf_tbl_tcam_data_ucast_pul(dsaf_dev);
spin_unlock_bh(&dsaf_dev->tcam_lock);
} }
/** /**
...@@ -903,6 +911,8 @@ static void hns_dsaf_tcam_mc_cfg( ...@@ -903,6 +911,8 @@ static void hns_dsaf_tcam_mc_cfg(
struct dsaf_tbl_tcam_data *ptbl_tcam_data, struct dsaf_tbl_tcam_data *ptbl_tcam_data,
struct dsaf_tbl_tcam_mcast_cfg *ptbl_tcam_mcast) struct dsaf_tbl_tcam_mcast_cfg *ptbl_tcam_mcast)
{ {
spin_lock_bh(&dsaf_dev->tcam_lock);
/*Write Addr*/ /*Write Addr*/
hns_dsaf_tbl_tcam_addr_cfg(dsaf_dev, address); hns_dsaf_tbl_tcam_addr_cfg(dsaf_dev, address);
/*Write Tcam Data*/ /*Write Tcam Data*/
...@@ -911,6 +921,8 @@ static void hns_dsaf_tcam_mc_cfg( ...@@ -911,6 +921,8 @@ static void hns_dsaf_tcam_mc_cfg(
hns_dsaf_tbl_tcam_mcast_cfg(dsaf_dev, ptbl_tcam_mcast); hns_dsaf_tbl_tcam_mcast_cfg(dsaf_dev, ptbl_tcam_mcast);
/*Write Plus*/ /*Write Plus*/
hns_dsaf_tbl_tcam_data_mcast_pul(dsaf_dev); hns_dsaf_tbl_tcam_data_mcast_pul(dsaf_dev);
spin_unlock_bh(&dsaf_dev->tcam_lock);
} }
/** /**
...@@ -920,6 +932,8 @@ static void hns_dsaf_tcam_mc_cfg( ...@@ -920,6 +932,8 @@ static void hns_dsaf_tcam_mc_cfg(
*/ */
static void hns_dsaf_tcam_mc_invld(struct dsaf_device *dsaf_dev, u32 address) static void hns_dsaf_tcam_mc_invld(struct dsaf_device *dsaf_dev, u32 address)
{ {
spin_lock_bh(&dsaf_dev->tcam_lock);
/*Write Addr*/ /*Write Addr*/
hns_dsaf_tbl_tcam_addr_cfg(dsaf_dev, address); hns_dsaf_tbl_tcam_addr_cfg(dsaf_dev, address);
...@@ -932,6 +946,8 @@ static void hns_dsaf_tcam_mc_invld(struct dsaf_device *dsaf_dev, u32 address) ...@@ -932,6 +946,8 @@ static void hns_dsaf_tcam_mc_invld(struct dsaf_device *dsaf_dev, u32 address)
/*Write Plus*/ /*Write Plus*/
hns_dsaf_tbl_tcam_mcast_pul(dsaf_dev); hns_dsaf_tbl_tcam_mcast_pul(dsaf_dev);
spin_unlock_bh(&dsaf_dev->tcam_lock);
} }
/** /**
...@@ -949,6 +965,8 @@ static void hns_dsaf_tcam_uc_get( ...@@ -949,6 +965,8 @@ static void hns_dsaf_tcam_uc_get(
u32 tcam_read_data0; u32 tcam_read_data0;
u32 tcam_read_data4; u32 tcam_read_data4;
spin_lock_bh(&dsaf_dev->tcam_lock);
/*Write Addr*/ /*Write Addr*/
hns_dsaf_tbl_tcam_addr_cfg(dsaf_dev, address); hns_dsaf_tbl_tcam_addr_cfg(dsaf_dev, address);
...@@ -981,6 +999,8 @@ static void hns_dsaf_tcam_uc_get( ...@@ -981,6 +999,8 @@ static void hns_dsaf_tcam_uc_get(
DSAF_TBL_UCAST_CFG1_OUT_PORT_S); DSAF_TBL_UCAST_CFG1_OUT_PORT_S);
ptbl_tcam_ucast->tbl_ucast_dvc ptbl_tcam_ucast->tbl_ucast_dvc
= dsaf_get_bit(tcam_read_data0, DSAF_TBL_UCAST_CFG1_DVC_S); = dsaf_get_bit(tcam_read_data0, DSAF_TBL_UCAST_CFG1_DVC_S);
spin_unlock_bh(&dsaf_dev->tcam_lock);
} }
/** /**
...@@ -997,6 +1017,8 @@ static void hns_dsaf_tcam_mc_get( ...@@ -997,6 +1017,8 @@ static void hns_dsaf_tcam_mc_get(
{ {
u32 data_tmp; u32 data_tmp;
spin_lock_bh(&dsaf_dev->tcam_lock);
/*Write Addr*/ /*Write Addr*/
hns_dsaf_tbl_tcam_addr_cfg(dsaf_dev, address); hns_dsaf_tbl_tcam_addr_cfg(dsaf_dev, address);
...@@ -1027,6 +1049,8 @@ static void hns_dsaf_tcam_mc_get( ...@@ -1027,6 +1049,8 @@ static void hns_dsaf_tcam_mc_get(
ptbl_tcam_mcast->tbl_mcast_port_msk[4] = ptbl_tcam_mcast->tbl_mcast_port_msk[4] =
dsaf_get_field(data_tmp, DSAF_TBL_MCAST_CFG4_VM128_112_M, dsaf_get_field(data_tmp, DSAF_TBL_MCAST_CFG4_VM128_112_M,
DSAF_TBL_MCAST_CFG4_VM128_112_S); DSAF_TBL_MCAST_CFG4_VM128_112_S);
spin_unlock_bh(&dsaf_dev->tcam_lock);
} }
/** /**
...@@ -1351,6 +1375,7 @@ static int hns_dsaf_init(struct dsaf_device *dsaf_dev) ...@@ -1351,6 +1375,7 @@ static int hns_dsaf_init(struct dsaf_device *dsaf_dev)
if (HNS_DSAF_IS_DEBUG(dsaf_dev)) if (HNS_DSAF_IS_DEBUG(dsaf_dev))
return 0; return 0;
spin_lock_init(&dsaf_dev->tcam_lock);
ret = hns_dsaf_init_hw(dsaf_dev); ret = hns_dsaf_init_hw(dsaf_dev);
if (ret) if (ret)
return ret; return ret;
......
...@@ -322,6 +322,8 @@ struct dsaf_device { ...@@ -322,6 +322,8 @@ struct dsaf_device {
struct dsaf_hw_stats hw_stats[DSAF_NODE_NUM]; struct dsaf_hw_stats hw_stats[DSAF_NODE_NUM];
struct dsaf_int_stat int_stat; struct dsaf_int_stat int_stat;
/* make sure tcam table config spinlock */
spinlock_t tcam_lock;
}; };
static inline void *hns_dsaf_dev_priv(const struct dsaf_device *dsaf_dev) static inline void *hns_dsaf_dev_priv(const struct dsaf_device *dsaf_dev)
......
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