Commit 0a0a6800 authored by Peter Zijlstra's avatar Peter Zijlstra
Browse files
parent 8664645a
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -986,9 +986,14 @@ union irte_ga_hi {
};

struct irte_ga {
	union {
		struct {
			union irte_ga_lo lo;
			union irte_ga_hi hi;
		};
		u128 irte;
	};
};

struct irq_2_irte {
	u16 devid; /* Device ID for IRTE table */
+4 −6
Original line number Diff line number Diff line
@@ -3003,10 +3003,10 @@ static int alloc_irq_index(struct amd_iommu *iommu, u16 devid, int count,
static int modify_irte_ga(struct amd_iommu *iommu, u16 devid, int index,
			  struct irte_ga *irte, struct amd_ir_data *data)
{
	bool ret;
	struct irq_remap_table *table;
	unsigned long flags;
	struct irte_ga *entry;
	unsigned long flags;
	u128 old;

	table = get_irq_table(iommu, devid);
	if (!table)
@@ -3017,16 +3017,14 @@ static int modify_irte_ga(struct amd_iommu *iommu, u16 devid, int index,
	entry = (struct irte_ga *)table->table;
	entry = &entry[index];

	ret = cmpxchg_double(&entry->lo.val, &entry->hi.val,
			     entry->lo.val, entry->hi.val,
			     irte->lo.val, irte->hi.val);
	/*
	 * We use cmpxchg16 to atomically update the 128-bit IRTE,
	 * and it cannot be updated by the hardware or other processors
	 * behind us, so the return value of cmpxchg16 should be the
	 * same as the old value.
	 */
	WARN_ON(!ret);
	old = entry->irte;
	WARN_ON(!try_cmpxchg128(&entry->irte, &old, irte->irte));

	if (data)
		data->ref = entry;