Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f1ca1512 authored by Joerg Roedel's avatar Joerg Roedel
Browse files

iommu/amd: Make sure iommu->need_sync contains correct value



The value is only set to true but never set back to false,
which causes to many completion-wait commands to be sent to
hardware. Fix it with this patch.

Cc: stable@kernel.org
Signed-off-by: default avatarJoerg Roedel <joerg.roedel@amd.com>
parent c6a389f1
Loading
Loading
Loading
Loading
+10 −3
Original line number Diff line number Diff line
@@ -605,7 +605,9 @@ static void build_inv_all(struct iommu_cmd *cmd)
 * Writes the command to the IOMMUs command buffer and informs the
 * hardware about the new command.
 */
static int iommu_queue_command(struct amd_iommu *iommu, struct iommu_cmd *cmd)
static int iommu_queue_command_sync(struct amd_iommu *iommu,
				    struct iommu_cmd *cmd,
				    bool sync)
{
	u32 left, tail, head, next_tail;
	unsigned long flags;
@@ -639,13 +641,18 @@ static int iommu_queue_command(struct amd_iommu *iommu, struct iommu_cmd *cmd)
	copy_cmd_to_buffer(iommu, cmd, tail);

	/* We need to sync now to make sure all commands are processed */
	iommu->need_sync = true;
	iommu->need_sync = sync;

	spin_unlock_irqrestore(&iommu->lock, flags);

	return 0;
}

static int iommu_queue_command(struct amd_iommu *iommu, struct iommu_cmd *cmd)
{
	return iommu_queue_command_sync(iommu, cmd, true);
}

/*
 * This function queues a completion wait command into the command
 * buffer of an IOMMU
@@ -661,7 +668,7 @@ static int iommu_completion_wait(struct amd_iommu *iommu)

	build_completion_wait(&cmd, (u64)&sem);

	ret = iommu_queue_command(iommu, &cmd);
	ret = iommu_queue_command_sync(iommu, &cmd, false);
	if (ret)
		return ret;