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.jail...@wanadoo.fr>
---
 drivers/gpu/drm/amd/amdkfd/kfd_device.c | 16 +++++-----------
 1 file changed, 5 insertions(+), 11 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_device.c
index c5a0ce44a295..c4d868a5dd97 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_device.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_device.c
@@ -1346,7 +1346,7 @@ int kfd_gtt_sa_allocate(struct kfd_dev *kfd, unsigned int 
size,
        /* 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;
        }
 
@@ -1384,10 +1384,8 @@ int kfd_gtt_sa_allocate(struct kfd_dev *kfd, unsigned 
int size,
                (*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);
@@ -1402,8 +1400,6 @@ int kfd_gtt_sa_allocate(struct kfd_dev *kfd, unsigned int 
size,
 
 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;
@@ -1414,10 +1410,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);
 
-- 
2.30.2

Reply via email to