vDPA/ifcvf: alloc the mgmt_dev before the adapter
authorZhu Lingshan <lingshan.zhu@intel.com>
Fri, 25 Nov 2022 14:57:15 +0000 (22:57 +0800)
committerMichael S. Tsirkin <mst@redhat.com>
Tue, 21 Feb 2023 00:26:54 +0000 (19:26 -0500)
This commit reverses the order of allocating the
management device and the adapter. So that it would
be possible to move the allocation of the adapter
to dev_add().

Signed-off-by: Zhu Lingshan <lingshan.zhu@intel.com>
Cc: stable@vger.kernel.org
Message-Id: <20221125145724.1129962-4-lingshan.zhu@intel.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
drivers/vdpa/ifcvf/ifcvf_main.c

index 7383918..860f72b 100644 (file)
@@ -831,22 +831,30 @@ static int ifcvf_probe(struct pci_dev *pdev, const struct pci_device_id *id)
        }
 
        pci_set_master(pdev);
+       ifcvf_mgmt_dev = kzalloc(sizeof(struct ifcvf_vdpa_mgmt_dev), GFP_KERNEL);
+       if (!ifcvf_mgmt_dev) {
+               IFCVF_ERR(pdev, "Failed to alloc memory for the vDPA management device\n");
+               return -ENOMEM;
+       }
 
        adapter = vdpa_alloc_device(struct ifcvf_adapter, vdpa,
                                    dev, &ifc_vdpa_ops, 1, 1, NULL, false);
        if (IS_ERR(adapter)) {
                IFCVF_ERR(pdev, "Failed to allocate vDPA structure");
-               return PTR_ERR(adapter);
+               ret = PTR_ERR(adapter);
+               goto err;
        }
 
+       adapter->pdev = pdev;
+       adapter->vdpa.dma_dev = &pdev->dev;
+       adapter->vdpa.mdev = &ifcvf_mgmt_dev->mdev;
+       ifcvf_mgmt_dev->adapter = adapter;
+
        vf = &adapter->vf;
        vf->dev_type = get_dev_type(pdev);
        vf->base = pcim_iomap_table(pdev);
        vf->pdev = pdev;
 
-       adapter->pdev = pdev;
-       adapter->vdpa.dma_dev = &pdev->dev;
-
        ret = ifcvf_init_hw(vf, pdev);
        if (ret) {
                IFCVF_ERR(pdev, "Failed to init IFCVF hw\n");
@@ -859,16 +867,6 @@ static int ifcvf_probe(struct pci_dev *pdev, const struct pci_device_id *id)
        vf->hw_features = ifcvf_get_hw_features(vf);
        vf->config_size = ifcvf_get_config_size(vf);
 
-       ifcvf_mgmt_dev = kzalloc(sizeof(struct ifcvf_vdpa_mgmt_dev), GFP_KERNEL);
-       if (!ifcvf_mgmt_dev) {
-               IFCVF_ERR(pdev, "Failed to alloc memory for the vDPA management device\n");
-               return -ENOMEM;
-       }
-
-       ifcvf_mgmt_dev->mdev.ops = &ifcvf_vdpa_mgmt_dev_ops;
-       ifcvf_mgmt_dev->mdev.device = dev;
-       ifcvf_mgmt_dev->adapter = adapter;
-
        dev_type = get_dev_type(pdev);
        switch (dev_type) {
        case VIRTIO_ID_NET:
@@ -883,12 +881,11 @@ static int ifcvf_probe(struct pci_dev *pdev, const struct pci_device_id *id)
                goto err;
        }
 
+       ifcvf_mgmt_dev->mdev.ops = &ifcvf_vdpa_mgmt_dev_ops;
+       ifcvf_mgmt_dev->mdev.device = dev;
        ifcvf_mgmt_dev->mdev.max_supported_vqs = vf->nr_vring;
        ifcvf_mgmt_dev->mdev.supported_features = vf->hw_features;
 
-       adapter->vdpa.mdev = &ifcvf_mgmt_dev->mdev;
-
-
        ret = vdpa_mgmtdev_register(&ifcvf_mgmt_dev->mdev);
        if (ret) {
                IFCVF_ERR(pdev,