Several early return paths in run_migration_benchmark() skip
hmm_buffer_free(), leaking the buffer. Replace with a single cleanup
label.

Fixes: 271a7b2e3c13 ("selftests/mm/hmm-tests: new throughput tests including 
THP")
Signed-off-by: Hongfu Li <[email protected]>
Reviewed-by: David Hildenbrand (Arm) <[email protected]>
Reviewed-by: SJ Park <[email protected]>
---
v2:
 - Set buffer->ptr to NULL on mmap failure to avoid passing MAP_FAILED
   to munmap() in hmm_buffer_free()
 - Drop the redundant "/* Cleanup */" comment
 - Add Fixes tag for the commit that introduced the leak
 - Collect Reviewed-by tags from David Hildenbrand and SJ Park
---
 tools/testing/selftests/mm/hmm-tests.c | 21 ++++++++++++---------
 1 file changed, 12 insertions(+), 9 deletions(-)

diff --git a/tools/testing/selftests/mm/hmm-tests.c 
b/tools/testing/selftests/mm/hmm-tests.c
index e4c49699f3f7..402c6f6f5f09 100644
--- a/tools/testing/selftests/mm/hmm-tests.c
+++ b/tools/testing/selftests/mm/hmm-tests.c
@@ -2828,8 +2828,11 @@ static inline int run_migration_benchmark(int fd, int 
use_thp, size_t buffer_siz
        buffer->ptr = mmap(NULL, buffer_size, PROT_READ | PROT_WRITE,
                          MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
 
-       if (buffer->ptr == MAP_FAILED)
-               return -1;
+       if (buffer->ptr == MAP_FAILED) {
+               buffer->ptr = NULL;
+               ret = -1;
+               goto cleanup;
+       }
 
        /* Apply THP hint if requested */
        if (use_thp)
@@ -2838,7 +2841,7 @@ static inline int run_migration_benchmark(int fd, int 
use_thp, size_t buffer_siz
                ret = madvise(buffer->ptr, buffer_size, MADV_NOHUGEPAGE);
 
        if (ret)
-               return ret;
+               goto cleanup;
 
        /* Initialize memory to make sure pages are allocated */
        ptr = (int *)buffer->ptr;
@@ -2848,11 +2851,11 @@ static inline int run_migration_benchmark(int fd, int 
use_thp, size_t buffer_siz
        /* Warmup iteration */
        ret = hmm_migrate_sys_to_dev(fd, buffer, npages);
        if (ret)
-               return ret;
+               goto cleanup;
 
        ret = hmm_migrate_dev_to_sys(fd, buffer, npages);
        if (ret)
-               return ret;
+               goto cleanup;
 
        /* Benchmark iterations */
        for (i = 0; i < iterations; i++) {
@@ -2861,7 +2864,7 @@ static inline int run_migration_benchmark(int fd, int 
use_thp, size_t buffer_siz
 
                ret = hmm_migrate_sys_to_dev(fd, buffer, npages);
                if (ret)
-                       return ret;
+                       goto cleanup;
 
                end = get_time_ms();
                s2d_total += (end - start);
@@ -2871,7 +2874,7 @@ static inline int run_migration_benchmark(int fd, int 
use_thp, size_t buffer_siz
 
                ret = hmm_migrate_dev_to_sys(fd, buffer, npages);
                if (ret)
-                       return ret;
+                       goto cleanup;
 
                end = get_time_ms();
                d2s_total += (end - start);
@@ -2885,9 +2888,9 @@ static inline int run_migration_benchmark(int fd, int 
use_thp, size_t buffer_siz
        results->throughput_d2s = (buffer_size / (1024.0 * 1024.0 * 1024.0)) /
                                 (results->dev_to_sys_time / 1000.0);
 
-       /* Cleanup */
+cleanup:
        hmm_buffer_free(buffer);
-       return 0;
+       return ret;
 }
 
 /*
-- 
2.25.1


Reply via email to