aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVlad Buslov <vladbu@mellanox.com>2018-02-06 03:52:19 -0500
committerSaeed Mahameed <saeedm@mellanox.com>2018-02-20 15:53:00 -0500
commit9238e380e823a39983ee8d6b6ee8d1a9c4ba8a65 (patch)
tree6f65fff261bafdc22a73b564d4d3a454dee184b3
parent26a0f6e82997d5c8345782b55d3a7894421f777f (diff)
net/mlx5: Fix error handling when adding flow rules
If building match list or adding existing fg fails when node is locked, function returned without unlocking it. This happened if node version changed or adding existing fg returned with EAGAIN after jumping to search_again_locked label. Fixes: bd71b08ec2ee ("net/mlx5: Support multiple updates of steering rules in parallel") Signed-off-by: Vlad Buslov <vladbu@mellanox.com> Reviewed-by: Maor Gottlieb <maorg@mellanox.com> Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/fs_core.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
index 6caa4a7ad869..31fc2cfac3b3 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
@@ -1759,8 +1759,11 @@ search_again_locked:
1759 1759
1760 /* Collect all fgs which has a matching match_criteria */ 1760 /* Collect all fgs which has a matching match_criteria */
1761 err = build_match_list(&match_head, ft, spec); 1761 err = build_match_list(&match_head, ft, spec);
1762 if (err) 1762 if (err) {
1763 if (take_write)
1764 up_write_ref_node(&ft->node);
1763 return ERR_PTR(err); 1765 return ERR_PTR(err);
1766 }
1764 1767
1765 if (!take_write) 1768 if (!take_write)
1766 up_read_ref_node(&ft->node); 1769 up_read_ref_node(&ft->node);
@@ -1769,8 +1772,11 @@ search_again_locked:
1769 dest_num, version); 1772 dest_num, version);
1770 free_match_list(&match_head); 1773 free_match_list(&match_head);
1771 if (!IS_ERR(rule) || 1774 if (!IS_ERR(rule) ||
1772 (PTR_ERR(rule) != -ENOENT && PTR_ERR(rule) != -EAGAIN)) 1775 (PTR_ERR(rule) != -ENOENT && PTR_ERR(rule) != -EAGAIN)) {
1776 if (take_write)
1777 up_write_ref_node(&ft->node);
1773 return rule; 1778 return rule;
1779 }
1774 1780
1775 if (!take_write) { 1781 if (!take_write) {
1776 nested_down_write_ref_node(&ft->node, FS_LOCK_GRANDPARENT); 1782 nested_down_write_ref_node(&ft->node, FS_LOCK_GRANDPARENT);