]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
sif: Move sif_dfs_register beyond base init
authorKnut Omang <knut.omang@oracle.com>
Fri, 28 Oct 2016 03:29:28 +0000 (05:29 +0200)
committerKnut Omang <knut.omang@oracle.com>
Fri, 11 Nov 2016 16:36:54 +0000 (17:36 +0100)
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 <knut.omang@oracle.com>
drivers/infiniband/hw/sif/sif_hwi.c
drivers/infiniband/hw/sif/sif_main.c

index 007facc1894fa8349191c6b13c79a6ea5c0a9a4e..664fb91408d9ab6a2cb6e2bfd20807b4b95dd7c8 100644 (file)
@@ -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);
 }
index 8be965d50073ebf5f3c7abcdd1c453ab83f394d2..d4f70ec4eca625c9f3e6d37592423808a88185fb 100644 (file)
@@ -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);