aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/cmd.c2
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/main.c7
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/mlx4.h8
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/resource_tracker.c17
4 files changed, 26 insertions, 8 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx4/cmd.c b/drivers/net/ethernet/mellanox/mlx4/cmd.c
index 53b738b8a004..1bcead1fa2f6 100644
--- a/drivers/net/ethernet/mellanox/mlx4/cmd.c
+++ b/drivers/net/ethernet/mellanox/mlx4/cmd.c
@@ -1554,7 +1554,7 @@ int mlx4_multi_func_init(struct mlx4_dev *dev)
1554 return 0; 1554 return 0;
1555 1555
1556err_resource: 1556err_resource:
1557 mlx4_free_resource_tracker(dev); 1557 mlx4_free_resource_tracker(dev, RES_TR_FREE_ALL);
1558err_thread: 1558err_thread:
1559 flush_workqueue(priv->mfunc.master.comm_wq); 1559 flush_workqueue(priv->mfunc.master.comm_wq);
1560 destroy_workqueue(priv->mfunc.master.comm_wq); 1560 destroy_workqueue(priv->mfunc.master.comm_wq);
diff --git a/drivers/net/ethernet/mellanox/mlx4/main.c b/drivers/net/ethernet/mellanox/mlx4/main.c
index 8eed1f269323..2e94f76f8016 100644
--- a/drivers/net/ethernet/mellanox/mlx4/main.c
+++ b/drivers/net/ethernet/mellanox/mlx4/main.c
@@ -2069,6 +2069,10 @@ static void mlx4_remove_one(struct pci_dev *pdev)
2069 mlx4_CLOSE_PORT(dev, p); 2069 mlx4_CLOSE_PORT(dev, p);
2070 } 2070 }
2071 2071
2072 if (mlx4_is_master(dev))
2073 mlx4_free_resource_tracker(dev,
2074 RES_TR_FREE_SLAVES_ONLY);
2075
2072 mlx4_cleanup_counters_table(dev); 2076 mlx4_cleanup_counters_table(dev);
2073 mlx4_cleanup_mcg_table(dev); 2077 mlx4_cleanup_mcg_table(dev);
2074 mlx4_cleanup_qp_table(dev); 2078 mlx4_cleanup_qp_table(dev);
@@ -2081,7 +2085,8 @@ static void mlx4_remove_one(struct pci_dev *pdev)
2081 mlx4_cleanup_pd_table(dev); 2085 mlx4_cleanup_pd_table(dev);
2082 2086
2083 if (mlx4_is_master(dev)) 2087 if (mlx4_is_master(dev))
2084 mlx4_free_resource_tracker(dev); 2088 mlx4_free_resource_tracker(dev,
2089 RES_TR_FREE_STRUCTS_ONLY);
2085 2090
2086 iounmap(priv->kar); 2091 iounmap(priv->kar);
2087 mlx4_uar_free(dev, &priv->driver_uar); 2092 mlx4_uar_free(dev, &priv->driver_uar);
diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4.h b/drivers/net/ethernet/mellanox/mlx4/mlx4.h
index cd56f1aea4b5..8767fbfdce34 100644
--- a/drivers/net/ethernet/mellanox/mlx4/mlx4.h
+++ b/drivers/net/ethernet/mellanox/mlx4/mlx4.h
@@ -146,6 +146,11 @@ enum mlx4_alloc_mode {
146 RES_OP_MAP_ICM, 146 RES_OP_MAP_ICM,
147}; 147};
148 148
149enum mlx4_res_tracker_free_type {
150 RES_TR_FREE_ALL,
151 RES_TR_FREE_SLAVES_ONLY,
152 RES_TR_FREE_STRUCTS_ONLY,
153};
149 154
150/* 155/*
151 *Virtual HCR structures. 156 *Virtual HCR structures.
@@ -1027,7 +1032,8 @@ int mlx4_get_slave_from_resource_id(struct mlx4_dev *dev,
1027void mlx4_delete_all_resources_for_slave(struct mlx4_dev *dev, int slave_id); 1032void mlx4_delete_all_resources_for_slave(struct mlx4_dev *dev, int slave_id);
1028int mlx4_init_resource_tracker(struct mlx4_dev *dev); 1033int mlx4_init_resource_tracker(struct mlx4_dev *dev);
1029 1034
1030void mlx4_free_resource_tracker(struct mlx4_dev *dev); 1035void mlx4_free_resource_tracker(struct mlx4_dev *dev,
1036 enum mlx4_res_tracker_free_type type);
1031 1037
1032int mlx4_SET_PORT_wrapper(struct mlx4_dev *dev, int slave, 1038int mlx4_SET_PORT_wrapper(struct mlx4_dev *dev, int slave,
1033 struct mlx4_vhcr *vhcr, 1039 struct mlx4_vhcr *vhcr,
diff --git a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c
index bb09ed7a1484..549abfb5a397 100644
--- a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c
+++ b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c
@@ -224,16 +224,23 @@ int mlx4_init_resource_tracker(struct mlx4_dev *dev)
224 return 0 ; 224 return 0 ;
225} 225}
226 226
227void mlx4_free_resource_tracker(struct mlx4_dev *dev) 227void mlx4_free_resource_tracker(struct mlx4_dev *dev,
228 enum mlx4_res_tracker_free_type type)
228{ 229{
229 struct mlx4_priv *priv = mlx4_priv(dev); 230 struct mlx4_priv *priv = mlx4_priv(dev);
230 int i; 231 int i;
231 232
232 if (priv->mfunc.master.res_tracker.slave_list) { 233 if (priv->mfunc.master.res_tracker.slave_list) {
233 for (i = 0 ; i < dev->num_slaves; i++) 234 if (type != RES_TR_FREE_STRUCTS_ONLY)
234 mlx4_delete_all_resources_for_slave(dev, i); 235 for (i = 0 ; i < dev->num_slaves; i++)
235 236 if (type == RES_TR_FREE_ALL ||
236 kfree(priv->mfunc.master.res_tracker.slave_list); 237 dev->caps.function != i)
238 mlx4_delete_all_resources_for_slave(dev, i);
239
240 if (type != RES_TR_FREE_SLAVES_ONLY) {
241 kfree(priv->mfunc.master.res_tracker.slave_list);
242 priv->mfunc.master.res_tracker.slave_list = NULL;
243 }
237 } 244 }
238} 245}
239 246