struct bnxt_filter_info *filter;
int ret = 0;
+ bnxt_acquire_flow_lock(bp);
ret = bnxt_flow_args_validate(attr, pattern, actions, error);
- if (ret != 0)
+ if (ret != 0) {
+ bnxt_release_flow_lock(bp);
return ret;
+ }
filter = bnxt_get_unused_filter(bp);
if (filter == NULL) {
PMD_DRV_LOG(ERR, "Not enough resources for a new flow.\n");
+ bnxt_release_flow_lock(bp);
return -ENOMEM;
}
/* No need to hold on to this filter if we are just validating flow */
filter->fw_l2_filter_id = UINT64_MAX;
bnxt_free_filter(bp, filter);
+ bnxt_release_flow_lock(bp);
return ret;
}
return flow;
}
+ bnxt_acquire_flow_lock(bp);
ret = bnxt_flow_args_validate(attr, pattern, actions, error);
if (ret != 0) {
PMD_DRV_LOG(ERR, "Not a validate flow.\n");
}
PMD_DRV_LOG(ERR, "Successfully created flow.\n");
STAILQ_INSERT_TAIL(&vnic->flow_list, flow, next);
+ bnxt_release_flow_lock(bp);
return flow;
}
if (!ret) {
"Failed to create flow.");
rte_free(flow);
flow = NULL;
+ bnxt_release_flow_lock(bp);
return flow;
}
struct rte_flow_error *error)
{
struct bnxt *bp = dev->data->dev_private;
- struct bnxt_filter_info *filter = flow->filter;
- struct bnxt_vnic_info *vnic = flow->vnic;
+ struct bnxt_filter_info *filter;
+ struct bnxt_vnic_info *vnic;
int ret = 0;
+ bnxt_acquire_flow_lock(bp);
+ if (!flow) {
+ rte_flow_error_set(error, EINVAL,
+ RTE_FLOW_ERROR_TYPE_HANDLE, NULL,
+ "Invalid flow: failed to destroy flow.");
+ bnxt_release_flow_lock(bp);
+ return -EINVAL;
+ }
+
+ filter = flow->filter;
+ vnic = flow->vnic;
+
if (!filter) {
- ret = -EINVAL;
- goto done;
+ rte_flow_error_set(error, EINVAL,
+ RTE_FLOW_ERROR_TYPE_HANDLE, NULL,
+ "Invalid flow: failed to destroy flow.");
+ bnxt_release_flow_lock(bp);
+ return -EINVAL;
}
if (filter->filter_type == HWRM_CFA_TUNNEL_REDIRECT_FILTER &&
ret = bnxt_handle_tunnel_redirect_destroy(bp,
filter,
error);
- if (!ret)
+ if (!ret) {
goto done;
- else
+ } else {
+ bnxt_release_flow_lock(bp);
return ret;
+ }
}
ret = bnxt_match_filter(bp, filter);
"Failed to destroy flow.");
}
+ bnxt_release_flow_lock(bp);
return ret;
}
unsigned int i;
int ret = 0;
+ bnxt_acquire_flow_lock(bp);
for (i = 0; i < bp->max_vnics; i++) {
vnic = &bp->vnic_info[i];
if (vnic->fw_vnic_id == INVALID_VNIC_ID)
bnxt_handle_tunnel_redirect_destroy(bp,
filter,
error);
- if (!ret)
+ if (!ret) {
goto done;
- else
+ } else {
+ bnxt_release_flow_lock(bp);
return ret;
+ }
}
if (filter->filter_type == HWRM_CFA_EM_FILTER)
RTE_FLOW_ERROR_TYPE_HANDLE,
NULL,
"Failed to flush flow in HW.");
+ bnxt_release_flow_lock(bp);
return -rte_errno;
}
done:
}
}
+ bnxt_release_flow_lock(bp);
return ret;
}