[LTP] [PATCH 03/13] lib: Add tst_mapping_in_range()

Cyril Hrubis
2024-12-18T18:45:39Z

This moves the range_is_mapped() function from
testcases/kernel/mem/lib/mem.c to a top level library and renames the
function to a better fitting name.

Signed-off-by: Cyril Hrubis <chrubis@suse.cz>
---
include/tst_memutils.h | 11 +++++++
lib/tst_memutils.c | 31 ++++++++++++++++++
.../kernel/mem/hugetlb/hugemmap/hugemmap02.c | 4 +--
.../kernel/mem/hugetlb/hugemmap/hugemmap13.c | 4 +--
.../kernel/mem/hugetlb/hugemmap/hugemmap14.c | 6 ++--
.../mem/hugetlb/hugeshmat/hugeshmat04.c | 2 +-
testcases/kernel/mem/include/mem.h | 2 --
testcases/kernel/mem/lib/mem.c | 32 -------------------
8 files changed, 50 insertions(+), 42 deletions(-)

diff --git a/include/tst_memutils.h b/include/tst_memutils.h
index 0dd941ced..e9289a4e9 100644
--- a/include/tst_memutils.h
+++ b/include/tst_memutils.h
@@ -60,4 +60,15 @@ void tst_disable_oom_protection(pid_t pid);

#define TST_PRINT_MEMINFO() safe_print_file(__FILE__, __LINE__, "/proc/meminfo")

+/**
+ * tst_mapping_in_range()
+ *
+ * @low A lower address inside of the processe address space.
+ * @high A higher address inside of the processe address space.
+ *
+ * @return Returns true if there is a mapping between low and high addresses in
+ * the process address space.
+ */
+int tst_mapping_in_range(unsigned long low, unsigned long high);
+
#endif /* TST_MEMUTILS_H__ */
diff --git a/lib/tst_memutils.c b/lib/tst_memutils.c
index e33f19d29..e49684ba1 100644
--- a/lib/tst_memutils.c
+++ b/lib/tst_memutils.c
@@ -14,6 +14,7 @@
#include "tst_test.h"
#include "tst_memutils.h"
#include "tst_capability.h"
+#include "tst_safe_stdio.h"
#include "lapi/syscalls.h"

#define BLOCKSIZE (16 * 1024 * 1024)
@@ -184,3 +185,33 @@ void tst_disable_oom_protection(pid_t pid)
{
set_oom_score_adj(pid, 0);
}
+
+int tst_mapping_in_range(unsigned long low, unsigned long high)
+{
+ FILE *fp;
+
+ fp = SAFE_FOPEN("/proc/self/maps", "r");
+
+ while (!feof(fp)) {
+ unsigned long start, end;
+ int ret;
+
+ ret = fscanf(fp, "%lx-%lx %*[^\n]\n", &start, &end);
+ if (ret != 2) {
+ fclose(fp);
+ tst_brk(TBROK | TERRNO, "Couldn't parse /proc/self/maps line.");
+ }
+
+ if ((start >= low) && (start < high)) {
+ fclose(fp);
+ return 1;
+ }
+ if ((end >= low) && (end < high)) {
+ fclose(fp);
+ return 1;
+ }
+ }
+
+ fclose(fp);
+ return 0;
+}
diff --git a/testcases/kernel/mem/hugetlb/hugemmap/hugemmap02.c b/testcases/kernel/mem/hugetlb/hugemmap/hugemmap02.c
index b788aeafb..611ae7090 100644
--- a/testcases/kernel/mem/hugetlb/hugemmap/hugemmap02.c
+++ b/testcases/kernel/mem/hugetlb/hugemmap/hugemmap02.c
@@ -62,7 +62,7 @@ static void test_hugemmap(void)
addrlist[i] = addr;
}

- while (range_is_mapped(low_addr, low_addr + map_sz) == 1) {
+ while (tst_mapping_in_range(low_addr, low_addr + map_sz) == 1) {
low_addr = low_addr + 0x10000000;

if (low_addr < LOW_ADDR)
@@ -74,7 +74,7 @@ static void test_hugemmap(void)
if (addr == MAP_FAILED)
tst_brk(TBROK | TERRNO, "mmap failed on nfildes");

- while (range_is_mapped(low_addr2, low_addr2 + map_sz) == 1) {
+ while (tst_mapping_in_range(low_addr2, low_addr2 + map_sz) == 1) {
low_addr2 = low_addr2 + 0x10000000;

if (low_addr2 < LOW_ADDR2)
diff --git a/testcases/kernel/mem/hugetlb/hugemmap/hugemmap13.c b/testcases/kernel/mem/hugetlb/hugemmap/hugemmap13.c
index 42b80064e..b543c8882 100644
--- a/testcases/kernel/mem/hugetlb/hugemmap/hugemmap13.c
+++ b/testcases/kernel/mem/hugetlb/hugemmap/hugemmap13.c
@@ -45,7 +45,7 @@ static void run_test(void)
below_start = FOURGB;
above_end = 1024ULL*1024*1024*1024;

- if (range_is_mapped(below_start, above_end) == 1) {
+ if (tst_mapping_in_range(below_start, above_end) == 1) {
tst_res(TINFO|TERRNO, "region 4G-IT is not free & "
"mmap() failed expected");
tst_res(TPASS, "Successful but inconclusive");
@@ -70,7 +70,7 @@ static void run_test(void)
below_start = FOURGB - MMAP_GRANULARITY;
above_end = FOURGB;

- if (range_is_mapped(below_start, above_end) == 1) {
+ if (tst_mapping_in_range(below_start, above_end) == 1) {
tst_res(TINFO|TERRNO, "region (4G-MMAP_GRANULARITY)-4G is not free & "
"mmap() failed expected");
tst_res(TPASS, "Successful but inconclusive");
diff --git a/testcases/kernel/mem/hugetlb/hugemmap/hugemmap14.c b/testcases/kernel/mem/hugetlb/hugemmap/hugemmap14.c
index c54a746b3..0a2ae312b 100644
--- a/testcases/kernel/mem/hugetlb/hugemmap/hugemmap14.c
+++ b/testcases/kernel/mem/hugetlb/hugemmap/hugemmap14.c
@@ -50,7 +50,7 @@ static void run_test(void)
below_start = FOURGB - 256ULL*1024*1024;
above_end = FOURGB;

- if (range_is_mapped(below_start, above_end) == 1) {
+ if (tst_mapping_in_range(below_start, above_end) == 1) {
tst_res(TINFO|TERRNO, "region (4G-256M)-4G is not free & "
"mmap() failed expected");
tst_res(TPASS, "Successful but inconclusive");
@@ -73,7 +73,7 @@ static void run_test(void)
below_start = FOURGB;
above_end = FOURGB + page_size;

- if (range_is_mapped(below_start, above_end) == 1) {
+ if (tst_mapping_in_range(below_start, above_end) == 1) {
tst_res(TINFO|TERRNO, "region 4G-(4G+page) is not free & "
"mmap() failed expected");
tst_res(TPASS, "Successful but inconclusive");
@@ -101,7 +101,7 @@ static void run_test(void)
below_start = highaddr;
above_end = highaddr + page_size;

- if (range_is_mapped(below_start, above_end) == 1) {
+ if (tst_mapping_in_range(below_start, above_end) == 1) {
tst_res(TINFO|TERRNO, "region haddr-(haddr+page) not free & "
"mmap() failed unexpected");
tst_res(TPASS, "Successful but inconclusive");
diff --git a/testcases/kernel/mem/hugetlb/hugeshmat/hugeshmat04.c b/testcases/kernel/mem/hugetlb/hugeshmat/hugeshmat04.c
index 0d7bbf64f..9f877fd07 100644
--- a/testcases/kernel/mem/hugetlb/hugeshmat/hugeshmat04.c
+++ b/testcases/kernel/mem/hugetlb/hugeshmat/hugeshmat04.c
@@ -55,7 +55,7 @@ static void shared_hugepage(void)
tst_brk(TBROK | TERRNO, "shmget");

while (boundary <= BOUNDARY_MAX
- && range_is_mapped(boundary, boundary+SIZE))
+ && tst_mapping_in_range(boundary, boundary+SIZE))
boundary += 128*1024*1024;
if (boundary > BOUNDARY_MAX)
tst_brk(TCONF, "failed to find free unmapped range");
diff --git a/testcases/kernel/mem/include/mem.h b/testcases/kernel/mem/include/mem.h
index 87528fdd0..7251a8839 100644
--- a/testcases/kernel/mem/include/mem.h
+++ b/testcases/kernel/mem/include/mem.h
@@ -73,6 +73,4 @@ unsigned int get_a_numa_node(void);

void update_shm_size(size_t *shm_size);

-/* MMAP */
-int range_is_mapped(unsigned long low, unsigned long high);
#endif
diff --git a/testcases/kernel/mem/lib/mem.c b/testcases/kernel/mem/lib/mem.c
index f293e766e..16eb39cba 100644
--- a/testcases/kernel/mem/lib/mem.c
+++ b/testcases/kernel/mem/lib/mem.c
@@ -636,35 +636,3 @@ void update_shm_size(size_t * shm_size)
*shm_size = shmmax;
}
}
-
-int range_is_mapped(unsigned long low, unsigned long high)
-{
- FILE *fp;
-
- fp = fopen("/proc/self/maps", "r");
- if (fp == NULL)
- tst_brk(TBROK | TERRNO, "Failed to open /proc/self/maps.");
-
- while (!feof(fp)) {
- unsigned long start, end;
- int ret;
-
- ret = fscanf(fp, "%lx-%lx %*[^\n]\n", &start, &end);
- if (ret != 2) {
- fclose(fp);
- tst_brk(TBROK | TERRNO, "Couldn't parse /proc/self/maps line.");
- }
-
- if ((start >= low) && (start < high)) {
- fclose(fp);
- return 1;
- }
- if ((end >= low) && (end < high)) {
- fclose(fp);
- return 1;
- }
- }
-
- fclose(fp);
- return 0;
-}
--
2.45.2