|
@@ -327,12 +327,16 @@ static void mlxsw_afa_resource_add(struct mlxsw_afa_block *block,
|
|
|
list_add(&resource->list, &block->resource_list);
|
|
|
}
|
|
|
|
|
|
+static void mlxsw_afa_resource_del(struct mlxsw_afa_resource *resource)
|
|
|
+{
|
|
|
+ list_del(&resource->list);
|
|
|
+}
|
|
|
+
|
|
|
static void mlxsw_afa_resources_destroy(struct mlxsw_afa_block *block)
|
|
|
{
|
|
|
struct mlxsw_afa_resource *resource, *tmp;
|
|
|
|
|
|
list_for_each_entry_safe(resource, tmp, &block->resource_list, list) {
|
|
|
- list_del(&resource->list);
|
|
|
resource->destructor(block, resource);
|
|
|
}
|
|
|
}
|
|
@@ -565,6 +569,7 @@ static void
|
|
|
mlxsw_afa_fwd_entry_ref_destroy(struct mlxsw_afa_block *block,
|
|
|
struct mlxsw_afa_fwd_entry_ref *fwd_entry_ref)
|
|
|
{
|
|
|
+ mlxsw_afa_resource_del(&fwd_entry_ref->resource);
|
|
|
mlxsw_afa_fwd_entry_put(block->afa, fwd_entry_ref->fwd_entry);
|
|
|
kfree(fwd_entry_ref);
|
|
|
}
|
|
@@ -614,6 +619,7 @@ static void
|
|
|
mlxsw_afa_counter_destroy(struct mlxsw_afa_block *block,
|
|
|
struct mlxsw_afa_counter *counter)
|
|
|
{
|
|
|
+ mlxsw_afa_resource_del(&counter->resource);
|
|
|
block->afa->ops->counter_index_put(block->afa->ops_priv,
|
|
|
counter->counter_index);
|
|
|
kfree(counter);
|
|
@@ -661,8 +667,8 @@ static char *mlxsw_afa_block_append_action(struct mlxsw_afa_block *block,
|
|
|
char *oneact;
|
|
|
char *actions;
|
|
|
|
|
|
- if (WARN_ON(block->finished))
|
|
|
- return NULL;
|
|
|
+ if (block->finished)
|
|
|
+ return ERR_PTR(-EINVAL);
|
|
|
if (block->cur_act_index + action_size >
|
|
|
block->afa->max_acts_per_set) {
|
|
|
struct mlxsw_afa_set *set;
|
|
@@ -672,7 +678,7 @@ static char *mlxsw_afa_block_append_action(struct mlxsw_afa_block *block,
|
|
|
*/
|
|
|
set = mlxsw_afa_set_create(false);
|
|
|
if (!set)
|
|
|
- return NULL;
|
|
|
+ return ERR_PTR(-ENOBUFS);
|
|
|
set->prev = block->cur_set;
|
|
|
block->cur_act_index = 0;
|
|
|
block->cur_set->next = set;
|
|
@@ -760,9 +766,9 @@ int mlxsw_afa_block_append_vlan_modify(struct mlxsw_afa_block *block,
|
|
|
MLXSW_AFA_VLAN_CODE,
|
|
|
MLXSW_AFA_VLAN_SIZE);
|
|
|
|
|
|
- if (!act) {
|
|
|
+ if (IS_ERR(act)) {
|
|
|
NL_SET_ERR_MSG_MOD(extack, "Cannot append vlan_modify action");
|
|
|
- return -ENOBUFS;
|
|
|
+ return PTR_ERR(act);
|
|
|
}
|
|
|
mlxsw_afa_vlan_pack(act, MLXSW_AFA_VLAN_VLAN_TAG_CMD_NOP,
|
|
|
MLXSW_AFA_VLAN_CMD_SET_OUTER, vid,
|
|
@@ -844,8 +850,8 @@ int mlxsw_afa_block_append_drop(struct mlxsw_afa_block *block)
|
|
|
MLXSW_AFA_TRAPDISC_CODE,
|
|
|
MLXSW_AFA_TRAPDISC_SIZE);
|
|
|
|
|
|
- if (!act)
|
|
|
- return -ENOBUFS;
|
|
|
+ if (IS_ERR(act))
|
|
|
+ return PTR_ERR(act);
|
|
|
mlxsw_afa_trapdisc_pack(act, MLXSW_AFA_TRAPDISC_TRAP_ACTION_NOP,
|
|
|
MLXSW_AFA_TRAPDISC_FORWARD_ACTION_DISCARD, 0);
|
|
|
return 0;
|
|
@@ -858,8 +864,8 @@ int mlxsw_afa_block_append_trap(struct mlxsw_afa_block *block, u16 trap_id)
|
|
|
MLXSW_AFA_TRAPDISC_CODE,
|
|
|
MLXSW_AFA_TRAPDISC_SIZE);
|
|
|
|
|
|
- if (!act)
|
|
|
- return -ENOBUFS;
|
|
|
+ if (IS_ERR(act))
|
|
|
+ return PTR_ERR(act);
|
|
|
mlxsw_afa_trapdisc_pack(act, MLXSW_AFA_TRAPDISC_TRAP_ACTION_TRAP,
|
|
|
MLXSW_AFA_TRAPDISC_FORWARD_ACTION_DISCARD,
|
|
|
trap_id);
|
|
@@ -874,8 +880,8 @@ int mlxsw_afa_block_append_trap_and_forward(struct mlxsw_afa_block *block,
|
|
|
MLXSW_AFA_TRAPDISC_CODE,
|
|
|
MLXSW_AFA_TRAPDISC_SIZE);
|
|
|
|
|
|
- if (!act)
|
|
|
- return -ENOBUFS;
|
|
|
+ if (IS_ERR(act))
|
|
|
+ return PTR_ERR(act);
|
|
|
mlxsw_afa_trapdisc_pack(act, MLXSW_AFA_TRAPDISC_TRAP_ACTION_TRAP,
|
|
|
MLXSW_AFA_TRAPDISC_FORWARD_ACTION_FORWARD,
|
|
|
trap_id);
|
|
@@ -894,6 +900,7 @@ static void
|
|
|
mlxsw_afa_mirror_destroy(struct mlxsw_afa_block *block,
|
|
|
struct mlxsw_afa_mirror *mirror)
|
|
|
{
|
|
|
+ mlxsw_afa_resource_del(&mirror->resource);
|
|
|
block->afa->ops->mirror_del(block->afa->ops_priv,
|
|
|
mirror->local_in_port,
|
|
|
mirror->span_id,
|
|
@@ -946,8 +953,8 @@ mlxsw_afa_block_append_allocated_mirror(struct mlxsw_afa_block *block,
|
|
|
char *act = mlxsw_afa_block_append_action(block,
|
|
|
MLXSW_AFA_TRAPDISC_CODE,
|
|
|
MLXSW_AFA_TRAPDISC_SIZE);
|
|
|
- if (!act)
|
|
|
- return -ENOBUFS;
|
|
|
+ if (IS_ERR(act))
|
|
|
+ return PTR_ERR(act);
|
|
|
mlxsw_afa_trapdisc_pack(act, MLXSW_AFA_TRAPDISC_TRAP_ACTION_NOP,
|
|
|
MLXSW_AFA_TRAPDISC_FORWARD_ACTION_FORWARD, 0);
|
|
|
mlxsw_afa_trapdisc_mirror_pack(act, true, mirror_agent);
|
|
@@ -1043,9 +1050,9 @@ int mlxsw_afa_block_append_fwd(struct mlxsw_afa_block *block,
|
|
|
|
|
|
act = mlxsw_afa_block_append_action(block, MLXSW_AFA_FORWARD_CODE,
|
|
|
MLXSW_AFA_FORWARD_SIZE);
|
|
|
- if (!act) {
|
|
|
- err = -ENOBUFS;
|
|
|
+ if (IS_ERR(act)) {
|
|
|
NL_SET_ERR_MSG_MOD(extack, "Cannot append forward action");
|
|
|
+ err = PTR_ERR(act);
|
|
|
goto err_append_action;
|
|
|
}
|
|
|
mlxsw_afa_forward_pack(act, MLXSW_AFA_FORWARD_TYPE_PBS,
|
|
@@ -1100,8 +1107,8 @@ int mlxsw_afa_block_append_allocated_counter(struct mlxsw_afa_block *block,
|
|
|
{
|
|
|
char *act = mlxsw_afa_block_append_action(block, MLXSW_AFA_POLCNT_CODE,
|
|
|
MLXSW_AFA_POLCNT_SIZE);
|
|
|
- if (!act)
|
|
|
- return -ENOBUFS;
|
|
|
+ if (IS_ERR(act))
|
|
|
+ return PTR_ERR(act);
|
|
|
mlxsw_afa_polcnt_pack(act, MLXSW_AFA_POLCNT_COUNTER_SET_TYPE_PACKETS_BYTES,
|
|
|
counter_index);
|
|
|
return 0;
|
|
@@ -1176,9 +1183,9 @@ int mlxsw_afa_block_append_fid_set(struct mlxsw_afa_block *block, u16 fid,
|
|
|
char *act = mlxsw_afa_block_append_action(block,
|
|
|
MLXSW_AFA_VIRFWD_CODE,
|
|
|
MLXSW_AFA_VIRFWD_SIZE);
|
|
|
- if (!act) {
|
|
|
+ if (IS_ERR(act)) {
|
|
|
NL_SET_ERR_MSG_MOD(extack, "Cannot append fid_set action");
|
|
|
- return -ENOBUFS;
|
|
|
+ return PTR_ERR(act);
|
|
|
}
|
|
|
mlxsw_afa_virfwd_pack(act, MLXSW_AFA_VIRFWD_FID_CMD_SET, fid);
|
|
|
return 0;
|
|
@@ -1248,8 +1255,8 @@ int mlxsw_afa_block_append_mcrouter(struct mlxsw_afa_block *block,
|
|
|
char *act = mlxsw_afa_block_append_action(block,
|
|
|
MLXSW_AFA_MCROUTER_CODE,
|
|
|
MLXSW_AFA_MCROUTER_SIZE);
|
|
|
- if (!act)
|
|
|
- return -ENOBUFS;
|
|
|
+ if (IS_ERR(act))
|
|
|
+ return PTR_ERR(act);
|
|
|
mlxsw_afa_mcrouter_pack(act, MLXSW_AFA_MCROUTER_RPF_ACTION_TRAP,
|
|
|
expected_irif, min_mtu, rmid_valid, kvdl_index);
|
|
|
return 0;
|