diff options
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/cmd.c | 2 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/main.c | 7 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/mlx4.h | 8 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/resource_tracker.c | 17 |
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 | ||
| 1556 | err_resource: | 1556 | err_resource: |
| 1557 | mlx4_free_resource_tracker(dev); | 1557 | mlx4_free_resource_tracker(dev, RES_TR_FREE_ALL); |
| 1558 | err_thread: | 1558 | err_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 | ||
| 149 | enum 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, | |||
| 1027 | void mlx4_delete_all_resources_for_slave(struct mlx4_dev *dev, int slave_id); | 1032 | void mlx4_delete_all_resources_for_slave(struct mlx4_dev *dev, int slave_id); |
| 1028 | int mlx4_init_resource_tracker(struct mlx4_dev *dev); | 1033 | int mlx4_init_resource_tracker(struct mlx4_dev *dev); |
| 1029 | 1034 | ||
| 1030 | void mlx4_free_resource_tracker(struct mlx4_dev *dev); | 1035 | void mlx4_free_resource_tracker(struct mlx4_dev *dev, |
| 1036 | enum mlx4_res_tracker_free_type type); | ||
| 1031 | 1037 | ||
| 1032 | int mlx4_SET_PORT_wrapper(struct mlx4_dev *dev, int slave, | 1038 | int 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 | ||
| 227 | void mlx4_free_resource_tracker(struct mlx4_dev *dev) | 227 | void 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 | ||
