vdpa: ifcvf: free config irq in ifcvf_free_irq()
authorJason Wang <jasowang@redhat.com>
Thu, 23 Jul 2020 09:12:54 +0000 (17:12 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 3 Sep 2020 09:29:29 +0000 (11:29 +0200)
[ Upstream commit 2b9f28d5e8efad34f472542315911c5ee9a65b6c ]

We don't free config irq in ifcvf_free_irq() which will trigger a
BUG() in pci core since we try to free the vectors that has an
action. Fixing this by recording the config irq in ifcvf_hw structure
and free it in ifcvf_free_irq().

Fixes: e7991f376a4d ("ifcvf: implement config interrupt in IFCVF")
Cc: Zhu Lingshan <lingshan.zhu@intel.com>
Signed-off-by: Jason Wang <jasowang@redhat.com>
Link: https://lore.kernel.org/r/20200723091254.20617-2-jasowang@redhat.com
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Reviewed-by: Zhu Lingshan <lingshan.zhu@intel.com>
Fixes: e7991f376a4d ("ifcvf: implement config interrupt in IFCVF")
Cc: Zhu Lingshan <a class="moz-txt-link-rfc2396E" href="mailto:lingshan.zhu@intel.com">&lt;lingshan.zhu@intel.com&gt;</a>
Signed-off-by: Jason Wang <a class="moz-txt-link-rfc2396E" href="mailto:jasowang@redhat.com">&lt;jasowang@redhat.com&gt;</a>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/vdpa/ifcvf/ifcvf_base.h
drivers/vdpa/ifcvf/ifcvf_main.c

index f4554412e607fb0d5200363269c0690efae04531..29efa75cdfce5bb568448ce5906df164b035ea43 100644 (file)
@@ -84,7 +84,7 @@ struct ifcvf_hw {
        void __iomem * const *base;
        char config_msix_name[256];
        struct vdpa_callback config_cb;
-
+       unsigned int config_irq;
 };
 
 struct ifcvf_adapter {
index ae7110955a44d49a02255e798345680fb14c6eb1..7a6d899e541df42dfe0a062b531396824fd25c38 100644 (file)
@@ -53,6 +53,7 @@ static void ifcvf_free_irq(struct ifcvf_adapter *adapter, int queues)
        for (i = 0; i < queues; i++)
                devm_free_irq(&pdev->dev, vf->vring[i].irq, &vf->vring[i]);
 
+       devm_free_irq(&pdev->dev, vf->config_irq, vf);
        ifcvf_free_irq_vectors(pdev);
 }
 
@@ -72,8 +73,8 @@ static int ifcvf_request_irq(struct ifcvf_adapter *adapter)
        snprintf(vf->config_msix_name, 256, "ifcvf[%s]-config\n",
                 pci_name(pdev));
        vector = 0;
-       irq = pci_irq_vector(pdev, vector);
-       ret = devm_request_irq(&pdev->dev, irq,
+       vf->config_irq = pci_irq_vector(pdev, vector);
+       ret = devm_request_irq(&pdev->dev, vf->config_irq,
                               ifcvf_config_changed, 0,
                               vf->config_msix_name, vf);
        if (ret) {