Re: [PATCH 2/3] iommu/vt-d: Use try_cmpxchg64() in intel_pasid_get_entry()

From: Baolu Lu
Date: Thu May 23 2024 - 21:10:14 EST


On 5/23/24 9:57 PM, Uros Bizjak wrote:
On Thu, May 23, 2024 at 3:44 PM Baolu Lu<baolu.lu@xxxxxxxxxxxxxxx> wrote:
On 2024/5/23 21:34, Uros Bizjak wrote:
+ if (!try_cmpxchg64(&dir[dir_index].val, &tmp,
+ (u64)virt_to_phys(entries) | PASID_PTE_PRESENT)) {
Above change will cause a dead loop during boot. It should be
No, it is correct as written:

if (cmpxchg64(*ptr, 0, new))

can be written as:

if (cmpxchg64(*ptr, 0, new) != 0)

this is equivalent to:

tmp = 0ULL;
if (!try_cmpxchg64(*ptr, &tmp, new))
The return value of both cmpxchg64() and try_cmpxchg64() is the old
value that was loaded from the memory location, right?
Actually, try_cmpxchg() returns true if successful and false if it fails.

Oh! I misunderstood this.


tmp = 0ULL;
if (!try_cmpxchg64(*ptr, &tmp, new))

The logic in the above snippet can be interpreted as:

if we fail to compare *ptr with 0, then:

iommu_free_page(entries);
goto retry;

as intended in the original code.

Okay, it's fine.

Best regards,
baolu