From: Philip Yang Date: Sat, 26 Mar 2022 00:17:28 +0000 (-0400) Subject: drm/amdkfd: Use atomic64_t type for pdd->tlb_seq X-Git-Tag: v5.19-rc1~153^2~18^2~86 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=8fde0248a32d29228520b876b8b27d0c44133734;p=thirdparty%2Fkernel%2Flinux.git drm/amdkfd: Use atomic64_t type for pdd->tlb_seq To support multi-thread update page table. Signed-off-by: Philip Yang Reviewed-by: Christian König Signed-off-by: Alex Deucher --- diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h index 945982a5d6881..e1b7e6afa920d 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h +++ b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h @@ -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; diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process.c b/drivers/gpu/drm/amd/amdkfd/kfd_process.c index ac8123c1ee8f7..9e82d7aa67fa1 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_process.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_process.c @@ -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.