drm/amdkfd: Fix sdma_bitmap overflow issue
authorOak Zeng <Oak.Zeng@amd.com>
Tue, 9 Jul 2019 14:40:15 +0000 (09:40 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 18 Jul 2019 19:18:04 +0000 (14:18 -0500)
In the original formula, when sdma queue number is 64,
the left shift overflows. Use an equivalence that won't
overflow.

Signed-off-by: Oak Zeng <Oak.Zeng@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c

index d7794c8dc9cceddac9e581a09ed2873b7e059c54..fe1ce348fdcdfa3e404daa19f153e1406d43b7ef 100644 (file)
@@ -880,8 +880,8 @@ static int initialize_nocpsch(struct device_queue_manager *dqm)
        }
 
        dqm->vmid_bitmap = (1 << dqm->dev->vm_info.vmid_num_kfd) - 1;
-       dqm->sdma_bitmap = (1ULL << get_num_sdma_queues(dqm)) - 1;
-       dqm->xgmi_sdma_bitmap = (1ULL << get_num_xgmi_sdma_queues(dqm)) - 1;
+       dqm->sdma_bitmap = ~0ULL >> (64 - get_num_sdma_queues(dqm));
+       dqm->xgmi_sdma_bitmap = ~0ULL >> (64 - get_num_xgmi_sdma_queues(dqm));
 
        return 0;
 }
@@ -1019,8 +1019,8 @@ static int initialize_cpsch(struct device_queue_manager *dqm)
        dqm->sdma_queue_count = 0;
        dqm->xgmi_sdma_queue_count = 0;
        dqm->active_runlist = false;
-       dqm->sdma_bitmap = (1ULL << get_num_sdma_queues(dqm)) - 1;
-       dqm->xgmi_sdma_bitmap = (1ULL << get_num_xgmi_sdma_queues(dqm)) - 1;
+       dqm->sdma_bitmap = ~0ULL >> (64 - get_num_sdma_queues(dqm));
+       dqm->xgmi_sdma_bitmap = ~0ULL >> (64 - get_num_xgmi_sdma_queues(dqm));
 
        INIT_WORK(&dqm->hw_exception_work, kfd_process_hw_exception);