From: Harish Kasiviswanathan <harish.kasiviswanat...@amd.com>

Unaligned atomic operations can cause problems on some CPU
architectures. Use simpler bitmask operations instead. Atomic bit
manipulations are not necessary since dqm->lock is held during these
operations.

Signed-off-by: Harish Kasiviswanathan <harish.kasiviswanat...@amd.com>
Signed-off-by: Felix Kuehling <felix.kuehl...@amd.com>
---
 .../gpu/drm/amd/amdkfd/kfd_device_queue_manager.c  | 25 ++++++++--------------
 1 file changed, 9 insertions(+), 16 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
index 47d493e..1a28dc2 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
@@ -118,9 +118,8 @@ static int allocate_vmid(struct device_queue_manager *dqm,
        if (dqm->vmid_bitmap == 0)
                return -ENOMEM;
 
-       bit = find_first_bit((unsigned long *)&dqm->vmid_bitmap,
-                               dqm->dev->vm_info.vmid_num_kfd);
-       clear_bit(bit, (unsigned long *)&dqm->vmid_bitmap);
+       bit = ffs(dqm->vmid_bitmap) - 1;
+       dqm->vmid_bitmap &= ~(1 << bit);
 
        allocated_vmid = bit + dqm->dev->vm_info.first_vmid_kfd;
        pr_debug("vmid allocation %d\n", allocated_vmid);
@@ -142,7 +141,7 @@ static void deallocate_vmid(struct device_queue_manager 
*dqm,
        /* Release the vmid mapping */
        set_pasid_vmid_mapping(dqm, 0, qpd->vmid);
 
-       set_bit(bit, (unsigned long *)&dqm->vmid_bitmap);
+       dqm->vmid_bitmap |= (1 << bit);
        qpd->vmid = 0;
        q->properties.vmid = 0;
 }
@@ -223,12 +222,8 @@ static int allocate_hqd(struct device_queue_manager *dqm, 
struct queue *q)
                        continue;
 
                if (dqm->allocated_queues[pipe] != 0) {
-                       bit = find_first_bit(
-                               (unsigned long *)&dqm->allocated_queues[pipe],
-                               get_queues_per_pipe(dqm));
-
-                       clear_bit(bit,
-                               (unsigned long *)&dqm->allocated_queues[pipe]);
+                       bit = ffs(dqm->allocated_queues[pipe]) - 1;
+                       dqm->allocated_queues[pipe] &= ~(1 << bit);
                        q->pipe = pipe;
                        q->queue = bit;
                        set = true;
@@ -249,7 +244,7 @@ static int allocate_hqd(struct device_queue_manager *dqm, 
struct queue *q)
 static inline void deallocate_hqd(struct device_queue_manager *dqm,
                                struct queue *q)
 {
-       set_bit(q->queue, (unsigned long *)&dqm->allocated_queues[q->pipe]);
+       dqm->allocated_queues[q->pipe] |= (1 << q->queue);
 }
 
 static int create_compute_queue_nocpsch(struct device_queue_manager *dqm,
@@ -589,10 +584,8 @@ static int allocate_sdma_queue(struct device_queue_manager 
*dqm,
        if (dqm->sdma_bitmap == 0)
                return -ENOMEM;
 
-       bit = find_first_bit((unsigned long *)&dqm->sdma_bitmap,
-                               CIK_SDMA_QUEUES);
-
-       clear_bit(bit, (unsigned long *)&dqm->sdma_bitmap);
+       bit = ffs(dqm->sdma_bitmap) - 1;
+       dqm->sdma_bitmap &= ~(1 << bit);
        *sdma_queue_id = bit;
 
        return 0;
@@ -603,7 +596,7 @@ static void deallocate_sdma_queue(struct 
device_queue_manager *dqm,
 {
        if (sdma_queue_id >= CIK_SDMA_QUEUES)
                return;
-       set_bit(sdma_queue_id, (unsigned long *)&dqm->sdma_bitmap);
+       dqm->sdma_bitmap |= (1 << sdma_queue_id);
 }
 
 static int create_sdma_queue_nocpsch(struct device_queue_manager *dqm,
-- 
2.7.4

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to