mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 22:21:40 +00:00
x86,intel_iommu: Replace cmpxchg_double()
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Reviewed-by: Lu Baolu <baolu.lu@linux.intel.com> Reviewed-by: Arnd Bergmann <arnd@arndb.de> Reviewed-by: Mark Rutland <mark.rutland@arm.com> Tested-by: Mark Rutland <mark.rutland@arm.com> Link: https://lore.kernel.org/r/20230531132323.855976804@infradead.org
This commit is contained in:
parent
0a0a6800b0
commit
b1fe7f2cda
@ -175,18 +175,14 @@ static int modify_irte(struct irq_2_iommu *irq_iommu,
|
||||
irte = &iommu->ir_table->base[index];
|
||||
|
||||
if ((irte->pst == 1) || (irte_modified->pst == 1)) {
|
||||
bool ret;
|
||||
|
||||
ret = cmpxchg_double(&irte->low, &irte->high,
|
||||
irte->low, irte->high,
|
||||
irte_modified->low, irte_modified->high);
|
||||
/*
|
||||
* 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);
|
||||
u128 old = irte->irte;
|
||||
WARN_ON(!try_cmpxchg128(&irte->irte, &old, irte_modified->irte));
|
||||
} else {
|
||||
WRITE_ONCE(irte->low, irte_modified->low);
|
||||
WRITE_ONCE(irte->high, irte_modified->high);
|
||||
|
@ -201,6 +201,8 @@ static inline void detect_intel_iommu(void)
|
||||
#endif /* CONFIG_DMAR_TABLE */
|
||||
|
||||
struct irte {
|
||||
union {
|
||||
struct {
|
||||
union {
|
||||
/* Shared between remapped and posted mode*/
|
||||
struct {
|
||||
@ -265,6 +267,11 @@ struct irte {
|
||||
__u64 high;
|
||||
};
|
||||
};
|
||||
#ifdef CONFIG_IRQ_REMAP
|
||||
__u128 irte;
|
||||
#endif
|
||||
};
|
||||
};
|
||||
|
||||
static inline void dmar_copy_shared_irte(struct irte *dst, struct irte *src)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user