]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
iommu/vt-d: Use try_cmpxchg64() in intel_pasid_get_entry()
authorUros Bizjak <ubizjak@gmail.com>
Wed, 22 May 2024 08:26:48 +0000 (10:26 +0200)
committerJoerg Roedel <jroedel@suse.de>
Tue, 25 Jun 2024 12:20:53 +0000 (14:20 +0200)
Use try_cmpxchg64() instead of cmpxchg64 (*ptr, old, new) != old in
intel_pasid_get_entry().  cmpxchg returns success in ZF flag, so
this change saves a compare after cmpxchg (and related move
instruction in front of cmpxchg).

Signed-off-by: Uros Bizjak <ubizjak@gmail.com>
Cc: David Woodhouse <dwmw2@infradead.org>
Cc: Lu Baolu <baolu.lu@linux.intel.com>
Cc: Joerg Roedel <joro@8bytes.org>
Cc: Will Deacon <will@kernel.org>
Cc: Robin Murphy <robin.murphy@arm.com>
Reviewed-by: Lu Baolu <baolu.lu@linux.intel.com>
Link: https://lore.kernel.org/r/20240522082729.971123-2-ubizjak@gmail.com
Signed-off-by: Joerg Roedel <jroedel@suse.de>
drivers/iommu/intel/pasid.c

index abce19e2ad6f4e55d7b7b662a4dda5ebef6cef29..9bf45bc4b9672ec89265001695d97d49d5b9b986 100644 (file)
@@ -146,6 +146,8 @@ static struct pasid_entry *intel_pasid_get_entry(struct device *dev, u32 pasid)
 retry:
        entries = get_pasid_table_from_pde(&dir[dir_index]);
        if (!entries) {
+               u64 tmp;
+
                entries = iommu_alloc_page_node(info->iommu->node, GFP_ATOMIC);
                if (!entries)
                        return NULL;
@@ -156,8 +158,9 @@ retry:
                 * clear. However, this entry might be populated by others
                 * while we are preparing it. Use theirs with a retry.
                 */
-               if (cmpxchg64(&dir[dir_index].val, 0ULL,
-                             (u64)virt_to_phys(entries) | PASID_PTE_PRESENT)) {
+               tmp = 0ULL;
+               if (!try_cmpxchg64(&dir[dir_index].val, &tmp,
+                                  (u64)virt_to_phys(entries) | PASID_PTE_PRESENT)) {
                        iommu_free_page(entries);
                        goto retry;
                }