diff --git a/lib/idxd/idxd_user.c b/lib/idxd/idxd_user.c index 9e4e406db..27ff4e1a1 100644 --- a/lib/idxd/idxd_user.c +++ b/lib/idxd/idxd_user.c @@ -180,6 +180,18 @@ idxd_map_pci_bars(struct spdk_idxd_device *idxd) return 0; } +static void +idxd_disable_dev(struct spdk_idxd_device *idxd) +{ + int rc; + + _idxd_write_4(idxd, IDXD_CMD_OFFSET, IDXD_DISABLE_DEV << IDXD_CMD_SHIFT); + rc = idxd_wait_cmd(idxd, IDXD_REGISTER_TIMEOUT_US); + if (rc < 0) { + SPDK_ERRLOG("Error disabling device %u\n", rc); + } +} + static int idxd_reset_dev(struct spdk_idxd_device *idxd) { @@ -427,6 +439,8 @@ user_idxd_device_destruct(struct spdk_idxd_device *idxd) { struct spdk_user_idxd_device *user_idxd = __user_idxd(idxd); + idxd_disable_dev(idxd); + idxd_unmap_pci_bar(idxd, IDXD_MMIO_BAR); idxd_unmap_pci_bar(idxd, IDXD_WQ_BAR); free(idxd->groups);