]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
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 20e0ccd079e9ba3b446309164fd19f533ec89b66..c9f04e91fbab4cd9653942ffc1612d14201814d8 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 4f9e109dd85f97e5320862d0d46eaebff206411f..39a6a63ba8ed9981235c1a1e93557fbc26ebe88d 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 26d8879bff9d04faa31cd77fa65ec873458be969..225bf64001e4df9f8b77d3b072f20480b0588174 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 26b15cc56c31c60b624ba13eaf566cfad3525747..d7aca120e5b22f2211b36564e7eb4e4504f52bd9 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 33a6bb5cf73067b40825fd5f03c04ba9bb6f660e..399a6121d513ccf2f8f297e2dde64dbdcc0066bc 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 98b9533e672ba9a3e876fe4cbe11e8f9d23d4c0a..e4f7bba11a3ae3a4a8c047e009224c363d46a213 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,