On Mon, Jul 05, 2021 at 01:04:11PM +0800, Jason Wang wrote: > > +static int ifcvf_probe(struct pci_dev *pdev, const struct pci_device_id *id) > > +{ > > + struct ifcvf_vdpa_mgmt_dev *ifcvf_mgmt_dev; > > + struct device *dev = &pdev->dev; > > + struct ifcvf_adapter *adapter; > > > adapter is not used. It's used in error handling below. It's not *initialized*. > > > + u32 dev_type; > > + int ret; > > + > > + 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; > > + } > > + > > + dev_type = get_dev_type(pdev); > > + switch (dev_type) { > > + case VIRTIO_ID_NET: > > + ifcvf_mgmt_dev->mdev.id_table = id_table_net; > > + break; > > + case VIRTIO_ID_BLOCK: > > + ifcvf_mgmt_dev->mdev.id_table = id_table_blk; > > + break; > > + default: > > + IFCVF_ERR(pdev, "VIRTIO ID %u not supported\n", dev_type); > > + ret = -EOPNOTSUPP; > > + goto err; > > + } > > + > > + ifcvf_mgmt_dev->mdev.ops = &ifcvf_vdpa_mgmt_dev_ops; > > + ifcvf_mgmt_dev->mdev.device = dev; > > + ifcvf_mgmt_dev->pdev = pdev; > > + > > + ret = pcim_enable_device(pdev); > > + if (ret) { > > + IFCVF_ERR(pdev, "Failed to enable device\n"); > > + goto err; > > + } > > + > > + ret = pcim_iomap_regions(pdev, BIT(0) | BIT(2) | BIT(4), > > + IFCVF_DRIVER_NAME); > > + if (ret) { > > + IFCVF_ERR(pdev, "Failed to request MMIO region\n"); > > + goto err; > > + } > > + > > + ret = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(64)); > > + if (ret) { > > + IFCVF_ERR(pdev, "No usable DMA configuration\n"); > > + goto err; > > + } > > + > > + ret = devm_add_action_or_reset(dev, ifcvf_free_irq_vectors, pdev); > > + if (ret) { > > + IFCVF_ERR(pdev, > > + "Failed for adding devres for freeing irq vectors\n"); > > + goto err; > > + } > > + > > + pci_set_master(pdev); > > + > > + ret = vdpa_mgmtdev_register(&ifcvf_mgmt_dev->mdev); > > + if (ret) { > > + IFCVF_ERR(pdev, > > + "Failed to initialize the management interfaces\n"); > > goto err; > > } > > @@ -533,14 +610,21 @@ static int ifcvf_probe(struct pci_dev *pdev, const struct pci_device_id *id) > > err: > > put_device(&adapter->vdpa.dev); > > + kfree(ifcvf_mgmt_dev); > > return ret; > > }