| 982 | } |
| 983 | |
| 984 | int32_t |
| 985 | mlx5_l3t_clear_entry(struct mlx5_l3t_tbl *tbl, uint32_t idx) |
| 986 | { |
| 987 | struct mlx5_l3t_level_tbl *g_tbl, *m_tbl; |
| 988 | struct mlx5_l3t_entry_word *w_e_tbl; |
| 989 | struct mlx5_l3t_entry_dword *dw_e_tbl; |
| 990 | struct mlx5_l3t_entry_qword *qw_e_tbl; |
| 991 | struct mlx5_l3t_entry_ptr *ptr_e_tbl; |
| 992 | void *e_tbl; |
| 993 | uint32_t entry_idx; |
| 994 | uint64_t ref_cnt; |
| 995 | int32_t ret = -1; |
| 996 | |
| 997 | rte_spinlock_lock(&tbl->sl); |
| 998 | g_tbl = tbl->tbl; |
| 999 | if (!g_tbl) |
| 1000 | goto out; |
| 1001 | m_tbl = g_tbl->tbl[(idx >> MLX5_L3T_GT_OFFSET) & MLX5_L3T_GT_MASK]; |
| 1002 | if (!m_tbl) |
| 1003 | goto out; |
| 1004 | e_tbl = m_tbl->tbl[(idx >> MLX5_L3T_MT_OFFSET) & MLX5_L3T_MT_MASK]; |
| 1005 | if (!e_tbl) |
| 1006 | goto out; |
| 1007 | entry_idx = idx & MLX5_L3T_ET_MASK; |
| 1008 | switch (tbl->type) { |
| 1009 | case MLX5_L3T_TYPE_WORD: |
| 1010 | w_e_tbl = (struct mlx5_l3t_entry_word *)e_tbl; |
| 1011 | MLX5_ASSERT(w_e_tbl->entry[entry_idx].ref_cnt); |
| 1012 | ret = --w_e_tbl->entry[entry_idx].ref_cnt; |
| 1013 | if (ret) |
| 1014 | goto out; |
| 1015 | w_e_tbl->entry[entry_idx].data = 0; |
| 1016 | ref_cnt = --w_e_tbl->ref_cnt; |
| 1017 | break; |
| 1018 | case MLX5_L3T_TYPE_DWORD: |
| 1019 | dw_e_tbl = (struct mlx5_l3t_entry_dword *)e_tbl; |
| 1020 | MLX5_ASSERT(dw_e_tbl->entry[entry_idx].ref_cnt); |
| 1021 | ret = --dw_e_tbl->entry[entry_idx].ref_cnt; |
| 1022 | if (ret) |
| 1023 | goto out; |
| 1024 | dw_e_tbl->entry[entry_idx].data = 0; |
| 1025 | ref_cnt = --dw_e_tbl->ref_cnt; |
| 1026 | break; |
| 1027 | case MLX5_L3T_TYPE_QWORD: |
| 1028 | qw_e_tbl = (struct mlx5_l3t_entry_qword *)e_tbl; |
| 1029 | MLX5_ASSERT(qw_e_tbl->entry[entry_idx].ref_cnt); |
| 1030 | ret = --qw_e_tbl->entry[entry_idx].ref_cnt; |
| 1031 | if (ret) |
| 1032 | goto out; |
| 1033 | qw_e_tbl->entry[entry_idx].data = 0; |
| 1034 | ref_cnt = --qw_e_tbl->ref_cnt; |
| 1035 | break; |
| 1036 | default: |
| 1037 | ptr_e_tbl = (struct mlx5_l3t_entry_ptr *)e_tbl; |
| 1038 | MLX5_ASSERT(ptr_e_tbl->entry[entry_idx].ref_cnt); |
| 1039 | ret = --ptr_e_tbl->entry[entry_idx].ref_cnt; |
| 1040 | if (ret) |
| 1041 | goto out; |
no test coverage detected