drm/amdkfd: Use atomic64_t type for pdd->tlb_seq
authorPhilip Yang <Philip.Yang@amd.com>
Sat, 26 Mar 2022 00:17:28 +0000 (20:17 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 1 Apr 2022 03:05:54 +0000 (23:05 -0400)
To support multi-thread update page table.

Signed-off-by: Philip Yang <Philip.Yang@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdkfd/kfd_priv.h
drivers/gpu/drm/amd/amdkfd/kfd_process.c

index 945982a..e1b7e6a 100644 (file)
@@ -705,7 +705,7 @@ struct kfd_process_device {
        /* VM context for GPUVM allocations */
        struct file *drm_file;
        void *drm_priv;
-       uint64_t tlb_seq;
+       atomic64_t tlb_seq;
 
        /* GPUVM allocations storage */
        struct idr alloc_idr;
index ac8123c..9e82d7a 100644 (file)
@@ -1560,7 +1560,7 @@ int kfd_process_device_init_vm(struct kfd_process_device *pdd,
                return ret;
        }
        pdd->drm_priv = drm_file->private_data;
-       pdd->tlb_seq = 0;
+       atomic64_set(&pdd->tlb_seq, 0);
 
        ret = kfd_process_device_reserve_ib_mem(pdd);
        if (ret)
@@ -1954,10 +1954,14 @@ void kfd_flush_tlb(struct kfd_process_device *pdd, enum TLB_FLUSH_TYPE type)
        uint64_t tlb_seq = amdgpu_vm_tlb_seq(vm);
        struct kfd_dev *dev = pdd->dev;
 
-       if (pdd->tlb_seq == tlb_seq)
+       /*
+        * It can be that we race and lose here, but that is extremely unlikely
+        * and the worst thing which could happen is that we flush the changes
+        * into the TLB once more which is harmless.
+        */
+       if (atomic64_xchg(&pdd->tlb_seq, tlb_seq) == tlb_seq)
                return;
 
-       pdd->tlb_seq = tlb_seq;
        if (dev->dqm->sched_policy == KFD_SCHED_POLICY_NO_HWS) {
                /* Nothing to flush until a VMID is assigned, which
                 * only happens when the first queue is created.