iommu/iova: Avoid false sharing on fq_timer_on
In commit14bd9a607f
("iommu/iova: Separate atomic variables to improve performance") Jinyu Qi identified that the atomic_cmpxchg() in queue_iova() was causing a performance loss and moved critical fields so that the false sharing would not impact them. However, avoiding the false sharing in the first place seems easy. We should attempt the atomic_cmpxchg() no more than 100 times per second. Adding an atomic_read() will keep the cache line mostly shared. This false sharing came with commit9a005a800a
("iommu/iova: Add flush timer"). Signed-off-by: Eric Dumazet <edumazet@google.com> Fixes:9a005a800a
('iommu/iova: Add flush timer') Cc: Jinyu Qi <jinyuqi@huawei.com> Cc: Joerg Roedel <jroedel@suse.de> Acked-by: Robin Murphy <robin.murphy@arm.com> Signed-off-by: Joerg Roedel <jroedel@suse.de>
This commit is contained in:
parent
c8fb436b3b
commit
0d87308cca
|
@ -577,7 +577,9 @@ void queue_iova(struct iova_domain *iovad,
|
||||||
|
|
||||||
spin_unlock_irqrestore(&fq->lock, flags);
|
spin_unlock_irqrestore(&fq->lock, flags);
|
||||||
|
|
||||||
if (atomic_cmpxchg(&iovad->fq_timer_on, 0, 1) == 0)
|
/* Avoid false sharing as much as possible. */
|
||||||
|
if (!atomic_read(&iovad->fq_timer_on) &&
|
||||||
|
!atomic_cmpxchg(&iovad->fq_timer_on, 0, 1))
|
||||||
mod_timer(&iovad->fq_timer,
|
mod_timer(&iovad->fq_timer,
|
||||||
jiffies + msecs_to_jiffies(IOVA_FQ_TIMEOUT));
|
jiffies + msecs_to_jiffies(IOVA_FQ_TIMEOUT));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue