Use find_next_zero_bit() to locate the next free seq slot bit
instead of the current walk, for more efficient bitmap scanning.

Signed-off-by: Prike Liang <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_seq64.c | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_seq64.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_seq64.c
index f4be19223588..21a225b0116a 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_seq64.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_seq64.c
@@ -173,16 +173,17 @@ void amdgpu_seq64_unmap(struct amdgpu_device *adev, 
struct amdgpu_fpriv *fpriv)
 int amdgpu_seq64_alloc(struct amdgpu_device *adev, u64 *va,
                       u64 *gpu_addr, u64 **cpu_addr)
 {
-       unsigned long bit_pos;
+       unsigned long bit_pos = 0;
 
-       for (;;) {
-               bit_pos = find_first_zero_bit(adev->seq64.used, 
adev->seq64.num_sem);
+       do {
+               bit_pos = find_next_zero_bit(adev->seq64.used,
+                                    adev->seq64.num_sem, bit_pos);
                if (bit_pos >= adev->seq64.num_sem)
                        return -ENOSPC;
-
                if (!test_and_set_bit(bit_pos, adev->seq64.used))
                        break;
-       }
+               bit_pos++;
+       } while (1);
 
        *va = bit_pos * sizeof(u64) + amdgpu_seq64_get_va_base(adev);
 
-- 
2.34.1

Reply via email to