From: Knut Omang Date: Fri, 28 Oct 2016 03:29:28 +0000 (+0200) Subject: sif: Move sif_dfs_register beyond base init X-Git-Tag: v4.1.12-92~36^2~18 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=31531a7d510f0d3f38b0c352666e925d18dd38aa;p=users%2Fjedix%2Flinux-maple.git sif: Move sif_dfs_register beyond base init The debugfs setup must be initialized prior to PQP operation, but must also be deinitialized before base table takedown, otherwise we are exposed to faults due to a race condition between a user accessing debugfs tables and driver unload. This commit moves the dfs init/deinit from sif_probe to sif_hw_init to achieve this order. Orabug: 24971465 Signed-off-by: Knut Omang --- diff --git a/drivers/infiniband/hw/sif/sif_hwi.c b/drivers/infiniband/hw/sif/sif_hwi.c index 007facc1894fa..664fb91408d9a 100644 --- a/drivers/infiniband/hw/sif/sif_hwi.c +++ b/drivers/infiniband/hw/sif/sif_hwi.c @@ -449,6 +449,10 @@ int sif_hw_init(struct sif_dev *sdev) if (ret) goto base_failed; + ret = sif_dfs_register(sdev); + if (ret) + goto pfail_dfs; + /* Allocate collect buffers for kernel usage */ ret = sif_hw_kernel_cb_init(sdev); if (ret) @@ -508,6 +512,8 @@ pd_alloc_failed: pd_init_failed: sif_hw_kernel_cb_fini(sdev); cb_alloc_failed: + sif_dfs_unregister(sdev); +pfail_dfs: sif_base_deinit(sdev); base_failed: sif_chip_deinit(sdev); @@ -532,6 +538,7 @@ void sif_hw_deinit(struct sif_dev *sdev) dealloc_pd(sdev->pd, false); sif_deinit_pd(sdev); sif_hw_kernel_cb_fini(sdev); + sif_dfs_unregister(sdev); sif_base_deinit(sdev); sif_chip_deinit(sdev); } diff --git a/drivers/infiniband/hw/sif/sif_main.c b/drivers/infiniband/hw/sif/sif_main.c index 8be965d50073e..d4f70ec4eca62 100644 --- a/drivers/infiniband/hw/sif/sif_main.c +++ b/drivers/infiniband/hw/sif/sif_main.c @@ -335,10 +335,6 @@ static int sif_probe(struct pci_dev *pdev, /* Type UMEM means no override - initialize */ sdev->mt_override = SIFMT_UMEM; - err = sif_dfs_register(sdev); - if (err) - goto pfail_dfs; - /* PSIF initialization */ err = sif_hw_init(sdev); if (err) @@ -409,8 +405,6 @@ pfail_dma_inv_mr: fwa_reg_failed: sif_hw_deinit(sdev); pfail_psif_base: - sif_dfs_unregister(sdev); -pfail_dfs: sif_bar_deinit(pdev); pfail_bar: pci_disable_pcie_error_reporting(pdev); @@ -440,7 +434,6 @@ static void sif_remove(struct pci_dev *dev) sif_dealloc_mr(sdev, sdev->dma_inv_mr); sif_fwa_unregister(sdev); sif_hw_deinit(sdev); - sif_dfs_unregister(sdev); sif_bar_deinit(dev); pci_clear_master(dev); pci_disable_device(dev);