File tree Expand file tree Collapse file tree 1 file changed +5
-2
lines changed Expand file tree Collapse file tree 1 file changed +5
-2
lines changed Original file line number Diff line number Diff line change @@ -146,6 +146,8 @@ static struct pasid_entry *intel_pasid_get_entry(struct device *dev, u32 pasid)
146
146
retry :
147
147
entries = get_pasid_table_from_pde (& dir [dir_index ]);
148
148
if (!entries ) {
149
+ u64 tmp ;
150
+
149
151
entries = iommu_alloc_page_node (info -> iommu -> node , GFP_ATOMIC );
150
152
if (!entries )
151
153
return NULL ;
@@ -156,8 +158,9 @@ static struct pasid_entry *intel_pasid_get_entry(struct device *dev, u32 pasid)
156
158
* clear. However, this entry might be populated by others
157
159
* while we are preparing it. Use theirs with a retry.
158
160
*/
159
- if (cmpxchg64 (& dir [dir_index ].val , 0ULL ,
160
- (u64 )virt_to_phys (entries ) | PASID_PTE_PRESENT )) {
161
+ tmp = 0ULL ;
162
+ if (!try_cmpxchg64 (& dir [dir_index ].val , & tmp ,
163
+ (u64 )virt_to_phys (entries ) | PASID_PTE_PRESENT )) {
161
164
iommu_free_page (entries );
162
165
goto retry ;
163
166
}
You can’t perform that action at this time.
0 commit comments