mirror of
https://github.com/torvalds/linux.git
synced 2026-05-23 06:31:58 +02:00
dmaengine: idxd: device cmd should use dedicated lock
Create a dedicated lock for device command operations. Put the device command operation under finer grained locking instead of using the idxd->dev_lock. Suggested-by: Sanjay Kumar <sanjay.k.kumar@intel.com> Signed-off-by: Dave Jiang <dave.jiang@intel.com> Link: https://lore.kernel.org/r/161894525685.3210132.16160045731436382560.stgit@djiang5-desk3.ch.intel.com Signed-off-by: Vinod Koul <vkoul@kernel.org>
This commit is contained in:
parent
5b0c68c473
commit
53b2ee7f63
|
|
@ -465,13 +465,13 @@ int idxd_device_init_reset(struct idxd_device *idxd)
|
|||
memset(&cmd, 0, sizeof(cmd));
|
||||
cmd.cmd = IDXD_CMD_RESET_DEVICE;
|
||||
dev_dbg(dev, "%s: sending reset for init.\n", __func__);
|
||||
spin_lock_irqsave(&idxd->dev_lock, flags);
|
||||
spin_lock_irqsave(&idxd->cmd_lock, flags);
|
||||
iowrite32(cmd.bits, idxd->reg_base + IDXD_CMD_OFFSET);
|
||||
|
||||
while (ioread32(idxd->reg_base + IDXD_CMDSTS_OFFSET) &
|
||||
IDXD_CMDSTS_ACTIVE)
|
||||
cpu_relax();
|
||||
spin_unlock_irqrestore(&idxd->dev_lock, flags);
|
||||
spin_unlock_irqrestore(&idxd->cmd_lock, flags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -494,10 +494,10 @@ static void idxd_cmd_exec(struct idxd_device *idxd, int cmd_code, u32 operand,
|
|||
cmd.operand = operand;
|
||||
cmd.int_req = 1;
|
||||
|
||||
spin_lock_irqsave(&idxd->dev_lock, flags);
|
||||
spin_lock_irqsave(&idxd->cmd_lock, flags);
|
||||
wait_event_lock_irq(idxd->cmd_waitq,
|
||||
!test_bit(IDXD_FLAG_CMD_RUNNING, &idxd->flags),
|
||||
idxd->dev_lock);
|
||||
idxd->cmd_lock);
|
||||
|
||||
dev_dbg(&idxd->pdev->dev, "%s: sending cmd: %#x op: %#x\n",
|
||||
__func__, cmd_code, operand);
|
||||
|
|
@ -511,9 +511,9 @@ static void idxd_cmd_exec(struct idxd_device *idxd, int cmd_code, u32 operand,
|
|||
* After command submitted, release lock and go to sleep until
|
||||
* the command completes via interrupt.
|
||||
*/
|
||||
spin_unlock_irqrestore(&idxd->dev_lock, flags);
|
||||
spin_unlock_irqrestore(&idxd->cmd_lock, flags);
|
||||
wait_for_completion(&done);
|
||||
spin_lock_irqsave(&idxd->dev_lock, flags);
|
||||
spin_lock_irqsave(&idxd->cmd_lock, flags);
|
||||
if (status) {
|
||||
*status = ioread32(idxd->reg_base + IDXD_CMDSTS_OFFSET);
|
||||
idxd->cmd_status = *status & GENMASK(7, 0);
|
||||
|
|
@ -522,7 +522,7 @@ static void idxd_cmd_exec(struct idxd_device *idxd, int cmd_code, u32 operand,
|
|||
__clear_bit(IDXD_FLAG_CMD_RUNNING, &idxd->flags);
|
||||
/* Wake up other pending commands */
|
||||
wake_up(&idxd->cmd_waitq);
|
||||
spin_unlock_irqrestore(&idxd->dev_lock, flags);
|
||||
spin_unlock_irqrestore(&idxd->cmd_lock, flags);
|
||||
}
|
||||
|
||||
int idxd_device_enable(struct idxd_device *idxd)
|
||||
|
|
@ -667,13 +667,13 @@ int idxd_device_release_int_handle(struct idxd_device *idxd, int handle,
|
|||
|
||||
dev_dbg(dev, "cmd: %u operand: %#x\n", IDXD_CMD_RELEASE_INT_HANDLE, operand);
|
||||
|
||||
spin_lock_irqsave(&idxd->dev_lock, flags);
|
||||
spin_lock_irqsave(&idxd->cmd_lock, flags);
|
||||
iowrite32(cmd.bits, idxd->reg_base + IDXD_CMD_OFFSET);
|
||||
|
||||
while (ioread32(idxd->reg_base + IDXD_CMDSTS_OFFSET) & IDXD_CMDSTS_ACTIVE)
|
||||
cpu_relax();
|
||||
status = ioread32(idxd->reg_base + IDXD_CMDSTS_OFFSET);
|
||||
spin_unlock_irqrestore(&idxd->dev_lock, flags);
|
||||
spin_unlock_irqrestore(&idxd->cmd_lock, flags);
|
||||
|
||||
if ((status & IDXD_CMDSTS_ERR_MASK) != IDXD_CMDSTS_SUCCESS) {
|
||||
dev_dbg(dev, "release int handle failed: %#x\n", status);
|
||||
|
|
|
|||
|
|
@ -204,6 +204,7 @@ struct idxd_device {
|
|||
void __iomem *reg_base;
|
||||
|
||||
spinlock_t dev_lock; /* spinlock for device */
|
||||
spinlock_t cmd_lock; /* spinlock for device commands */
|
||||
struct completion *cmd_done;
|
||||
struct idxd_group **groups;
|
||||
struct idxd_wq **wqs;
|
||||
|
|
|
|||
|
|
@ -449,6 +449,7 @@ static struct idxd_device *idxd_alloc(struct pci_dev *pdev, struct idxd_driver_d
|
|||
}
|
||||
|
||||
spin_lock_init(&idxd->dev_lock);
|
||||
spin_lock_init(&idxd->cmd_lock);
|
||||
|
||||
return idxd;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user