On 22/09/2021 03:12, fengchengwen wrote:
On 2021/9/17 23:24, Kevin Laatz wrote:
When a suitable device is found during the PCI probe, create a dmadev
instance for each HW queue. HW definitions required are also included.

Signed-off-by: Bruce Richardson <bruce.richard...@intel.com>
Signed-off-by: Kevin Laatz <kevin.la...@intel.com>
Reviewed-by: Conor Walsh <conor.wa...@intel.com>

---
v4: rebase changes
---
  drivers/dma/idxd/idxd_hw_defs.h  |  71 ++++++++
  drivers/dma/idxd/idxd_internal.h |  16 ++
  drivers/dma/idxd/idxd_pci.c      | 278 ++++++++++++++++++++++++++++++-
  3 files changed, 362 insertions(+), 3 deletions(-)
  create mode 100644 drivers/dma/idxd/idxd_hw_defs.h

[snip]
+
+static int
+idxd_dmadev_destroy(const char *name)
+{
+       int ret;
+       uint8_t err_code;
+       struct rte_dma_dev *dmadev;
+       struct idxd_dmadev *idxd;
+       int dev_id = rte_dma_get_dev_id(name);
+
+       if (!name) {
+               IDXD_PMD_ERR("Invalid device name");
+               return -EINVAL;
+       }
+
+       if (dev_id < 0) {
+               IDXD_PMD_ERR("Invalid device ID");
+               return -EINVAL;
+       }
+
+       dmadev = &rte_dma_devices[dev_id];
+       if (!dmadev) {
+               IDXD_PMD_ERR("Invalid device name (%s)", name);
+               return -EINVAL;
+       }
+
+       idxd = dmadev->dev_private;
+       if (!idxd) {
+               IDXD_PMD_ERR("Error getting dev_private");
+               return -EINVAL;
+       }
+
+       /* disable the device */
+       err_code = idxd_pci_dev_command(idxd, idxd_disable_dev);
+       if (err_code) {
+               IDXD_PMD_ERR("Error disabling device: code %#x", err_code);
+               return err_code;
+       }
+       IDXD_PMD_DEBUG("IDXD Device disabled OK");
Recommended: move the above disable idxd device to rte_dma_close() ops.
when create: mark state as READY
when destroy: direct call rte_dma_pmd_release(name), the lib will call 
rte_dma_close().

+
+       /* free device memory */
+       IDXD_PMD_DEBUG("Freeing device driver memory");
+       dmadev->dev_private = NULL;
The dmalib managed dev_private, so that driver could not do free again.

+       rte_free(idxd->batch_idx_ring);
+       rte_free(idxd->desc_ring);
Please move above free ops to rte_dma_close() ops.

Will fix, thanks

Reply via email to