drm/amdkfd: Fix NULL pointer dereference for set_scratch_backing_va()
authorYong Zhao <Yong.Zhao@amd.com>
Wed, 18 Sep 2019 22:17:57 +0000 (18:17 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 3 Oct 2019 14:11:01 +0000 (09:11 -0500)
Currently this function pointer is missing for GFX10. Considering it is
a void function since GFX9, fix it by checking the function pointer
before dereferencing it.

Signed-off-by: Yong Zhao <Yong.Zhao@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_arcturus.c
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.h
drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
drivers/gpu/drm/amd/include/kgd_kfd_interface.h

index 20e0ccd..c9f04e9 100644 (file)
@@ -312,7 +312,6 @@ static const struct kfd2kgd_calls kfd2kgd = {
                        kgd_gfx_v9_get_atc_vmid_pasid_mapping_pasid,
        .get_atc_vmid_pasid_mapping_valid =
                        kgd_gfx_v9_get_atc_vmid_pasid_mapping_valid,
-       .set_scratch_backing_va = kgd_gfx_v9_set_scratch_backing_va,
        .get_tile_config = kgd_gfx_v9_get_tile_config,
        .set_vm_context_page_table_base = kgd_gfx_v9_set_vm_context_page_table_base,
        .invalidate_tlbs = kgd_gfx_v9_invalidate_tlbs,
index 4f9e109..39a6a63 100644 (file)
@@ -781,15 +781,6 @@ uint32_t kgd_gfx_v9_address_watch_get_offset(struct kgd_dev *kgd,
        return 0;
 }
 
-void kgd_gfx_v9_set_scratch_backing_va(struct kgd_dev *kgd,
-                                       uint64_t va, uint32_t vmid)
-{
-       /* No longer needed on GFXv9. The scratch base address is
-        * passed to the shader by the CP. It's the user mode driver's
-        * responsibility.
-        */
-}
-
 void kgd_gfx_v9_set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmid,
                uint64_t page_table_base)
 {
@@ -835,7 +826,6 @@ static const struct kfd2kgd_calls kfd2kgd = {
                        kgd_gfx_v9_get_atc_vmid_pasid_mapping_pasid,
        .get_atc_vmid_pasid_mapping_valid =
                        kgd_gfx_v9_get_atc_vmid_pasid_mapping_valid,
-       .set_scratch_backing_va = kgd_gfx_v9_set_scratch_backing_va,
        .get_tile_config = kgd_gfx_v9_get_tile_config,
        .set_vm_context_page_table_base = kgd_gfx_v9_set_vm_context_page_table_base,
        .invalidate_tlbs = kgd_gfx_v9_invalidate_tlbs,
index 26d8879..225bf64 100644 (file)
@@ -61,8 +61,6 @@ uint16_t kgd_gfx_v9_get_atc_vmid_pasid_mapping_pasid(struct kgd_dev *kgd,
                uint8_t vmid);
 void kgd_gfx_v9_set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmid,
                uint64_t page_table_base);
-void kgd_gfx_v9_set_scratch_backing_va(struct kgd_dev *kgd,
-                                       uint64_t va, uint32_t vmid);
 int kgd_gfx_v9_invalidate_tlbs(struct kgd_dev *kgd, uint16_t pasid);
 int kgd_gfx_v9_invalidate_tlbs_vmid(struct kgd_dev *kgd, uint16_t vmid);
 int kgd_gfx_v9_get_tile_config(struct kgd_dev *kgd,
index 26b15cc..d7aca12 100644 (file)
@@ -1128,7 +1128,7 @@ static int kfd_ioctl_set_scratch_backing_va(struct file *filep,
        mutex_unlock(&p->mutex);
 
        if (dev->dqm->sched_policy == KFD_SCHED_POLICY_NO_HWS &&
-           pdd->qpd.vmid != 0)
+           pdd->qpd.vmid != 0 && dev->kfd2kgd->set_scratch_backing_va)
                dev->kfd2kgd->set_scratch_backing_va(
                        dev->kgd, args->va_addr, pdd->qpd.vmid);
 
index 33a6bb5..399a612 100644 (file)
@@ -220,8 +220,9 @@ static int allocate_vmid(struct device_queue_manager *dqm,
        /* invalidate the VM context after pasid and vmid mapping is set up */
        kfd_flush_tlb(qpd_to_pdd(qpd));
 
-       dqm->dev->kfd2kgd->set_scratch_backing_va(
-               dqm->dev->kgd, qpd->sh_hidden_private_base, qpd->vmid);
+       if (dqm->dev->kfd2kgd->set_scratch_backing_va)
+               dqm->dev->kfd2kgd->set_scratch_backing_va(dqm->dev->kgd,
+                               qpd->sh_hidden_private_base, qpd->vmid);
 
        return 0;
 }
index 98b9533..e4f7bba 100644 (file)
@@ -298,8 +298,13 @@ struct kfd2kgd_calls {
                                        struct kgd_dev *kgd,
                                        uint8_t vmid);
 
+       /* No longer needed from GFXv9 onward. The scratch base address is
+        * passed to the shader by the CP. It's the user mode driver's
+        * responsibility.
+        */
        void (*set_scratch_backing_va)(struct kgd_dev *kgd,
                                uint64_t va, uint32_t vmid);
+
        int (*get_tile_config)(struct kgd_dev *kgd, struct tile_config *config);
 
        void (*set_vm_context_page_table_base)(struct kgd_dev *kgd,