drm/amdkfd: Use non-atomic bitmap functions when possible
authorChristophe JAILLET <christophe.jaillet@wanadoo.fr>
Sun, 28 Nov 2021 16:46:15 +0000 (17:46 +0100)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 28 Apr 2022 21:44:29 +0000 (17:44 -0400)
All uses of the 'kfd->gtt_sa_bitmap' bitmap are protected with the
'kfd->gtt_sa_lock' mutex.

So:
   - prefer the non-atomic '__set_bit()' function
   - use the non-atomic 'bitmap_[set|clear]()' functions instead of
     equivalent 'for' loops. These functions can work on several bits at a
     time

Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdkfd/kfd_device.c

index 0250f2b..d9a7a82 100644 (file)
@@ -967,7 +967,7 @@ kfd_gtt_restart_search:
        /* If we need only one chunk, mark it as allocated and get out */
        if (size <= kfd->gtt_sa_chunk_size) {
                pr_debug("Single bit\n");
-               set_bit(found, kfd->gtt_sa_bitmap);
+               __set_bit(found, kfd->gtt_sa_bitmap);
                goto kfd_gtt_out;
        }
 
@@ -1005,10 +1005,8 @@ kfd_gtt_restart_search:
                (*mem_obj)->range_start, (*mem_obj)->range_end);
 
        /* Mark the chunks as allocated */
-       for (found = (*mem_obj)->range_start;
-               found <= (*mem_obj)->range_end;
-               found++)
-               set_bit(found, kfd->gtt_sa_bitmap);
+       bitmap_set(kfd->gtt_sa_bitmap, (*mem_obj)->range_start,
+                  (*mem_obj)->range_end - (*mem_obj)->range_start + 1);
 
 kfd_gtt_out:
        mutex_unlock(&kfd->gtt_sa_lock);
@@ -1023,8 +1021,6 @@ kfd_gtt_no_free_chunk:
 
 int kfd_gtt_sa_free(struct kfd_dev *kfd, struct kfd_mem_obj *mem_obj)
 {
-       unsigned int bit;
-
        /* Act like kfree when trying to free a NULL object */
        if (!mem_obj)
                return 0;
@@ -1035,10 +1031,8 @@ int kfd_gtt_sa_free(struct kfd_dev *kfd, struct kfd_mem_obj *mem_obj)
        mutex_lock(&kfd->gtt_sa_lock);
 
        /* Mark the chunks as free */
-       for (bit = mem_obj->range_start;
-               bit <= mem_obj->range_end;
-               bit++)
-               clear_bit(bit, kfd->gtt_sa_bitmap);
+       bitmap_clear(kfd->gtt_sa_bitmap, mem_obj->range_start,
+                    mem_obj->range_end - mem_obj->range_start + 1);
 
        mutex_unlock(&kfd->gtt_sa_lock);