Commit caf91cdf authored by Vinicius Costa Gomes's avatar Vinicius Costa Gomes Committed by Vinod Koul
Browse files

dmaengine: idxd: Fix lockdep warnings when calling idxd_device_config()



Move the check for IDXD_FLAG_CONFIGURABLE and the locking to "inside"
idxd_device_config(), as this is common to all callers, and the one
that wasn't holding the lock was an error (that was causing the
lockdep warning).

Suggested-by: default avatarDave Jiang <dave.jiang@intel.com>
Reviewed-by: default avatarDave Jiang <dave.jiang@intel.com>
Signed-off-by: default avatarVinicius Costa Gomes <vinicius.gomes@intel.com>
Link: https://patch.msgid.link/20260121-idxd-fix-flr-on-kernel-queues-v3-v3-1-7ed70658a9d1@intel.com


Signed-off-by: default avatarVinod Koul <vkoul@kernel.org>
parent 77b19d05
Loading
Loading
Loading
Loading
+7 −10
Original line number Diff line number Diff line
@@ -1125,7 +1125,11 @@ int idxd_device_config(struct idxd_device *idxd)
{
	int rc;

	lockdep_assert_held(&idxd->dev_lock);
	guard(spinlock)(&idxd->dev_lock);

	if (!test_bit(IDXD_FLAG_CONFIGURABLE, &idxd->flags))
		return 0;

	rc = idxd_wqs_setup(idxd);
	if (rc < 0)
		return rc;
@@ -1454,11 +1458,7 @@ int idxd_drv_enable_wq(struct idxd_wq *wq)
		}
	}

	rc = 0;
	spin_lock(&idxd->dev_lock);
	if (test_bit(IDXD_FLAG_CONFIGURABLE, &idxd->flags))
	rc = idxd_device_config(idxd);
	spin_unlock(&idxd->dev_lock);
	if (rc < 0) {
		dev_dbg(dev, "Writing wq %d config failed: %d\n", wq->id, rc);
		goto err;
@@ -1554,10 +1554,7 @@ int idxd_device_drv_probe(struct idxd_dev *idxd_dev)
	}

	/* Device configuration */
	spin_lock(&idxd->dev_lock);
	if (test_bit(IDXD_FLAG_CONFIGURABLE, &idxd->flags))
	rc = idxd_device_config(idxd);
	spin_unlock(&idxd->dev_lock);
	if (rc < 0)
		return -ENXIO;

+4 −6
Original line number Diff line number Diff line
@@ -1104,13 +1104,11 @@ static void idxd_reset_done(struct pci_dev *pdev)
	idxd_device_config_restore(idxd, idxd->idxd_saved);

	/* Re-configure IDXD device if allowed. */
	if (test_bit(IDXD_FLAG_CONFIGURABLE, &idxd->flags)) {
	rc = idxd_device_config(idxd);
	if (rc < 0) {
		dev_err(dev, "HALT: %s config fails\n", idxd_name);
		goto out;
	}
	}

	/* Bind IDXD device to driver. */
	rc = idxd_bind(&idxd_drv.drv, idxd_name);