aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/mellanox/mlx4/main.c
diff options
context:
space:
mode:
authorJack Morgenstein <jackm@dev.mellanox.co.il>2012-05-15 06:35:02 -0400
committerDavid S. Miller <davem@davemloft.net>2012-05-16 00:56:58 -0400
commitb8924951f633a0bb78972ef583d58ca8c26d8e73 (patch)
treef6be7601a92a408ae78aa18bea863d6f82a0e56c /drivers/net/ethernet/mellanox/mlx4/main.c
parent681372a7a37d4226261e2be2faf3aec5b9e022c2 (diff)
net/mlx4_core: Fix potential kernel Oops in res tracker during Dom0 driver unload
Currently the slave and master resources are deleted after master freed all bitmaps. If any resources were not properly cleaned up during the shutdown process, an Oops would result. Fix so that delete slave (only) resources during cleanup. Master resources are cleaned up during unload process, and need not separately be cleaned. Note that during cleanup, we need to split the resource-tracker freeing functionality. Before removing all the bitmaps, we free any leftover slave resources. However, we can only remove the resource tracker linked list after all bitmap frees, since some of the freeing functions (e.g., mlx4_cleanup_eq_table) use paravirtualized FW commands which expect the resource tracker linked list to be present. Found-by: Aviad Yehezkel <aviadye@mellanox.com> Signed-off-by: Jack Morgenstein <jackm@dev.mellanox.co.il> Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/mellanox/mlx4/main.c')
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/main.c7
1 files changed, 6 insertions, 1 deletions
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);