mem/hugetlb: shift an empty region to use in hugemmap02.c
PATCH v4 1/1 mem/hugetlb: shift an empty region to use in hugemmap02.c
v3 --> v4
1. use the tst_brkm(TBROK | TERRNO, ...) to replace printf()
2. add 'void (*cleanup_fn) (void)' in function range_is_mapped()
the testcase 'hugemmap02' always failed on s390x as:
----------
hugemmap02 0 TINFO : set nr_hugepages to 128 hugemmap02 1 TPASS : huge mmap succeeded (64-bit)
./hugemmap02: relocation error: ./hugemmap02: symbol , version GLIBC_2.2 not defined in file libc.so.6 with link time reference
----------
it is caused by mapping in zero where libc.so.6 was loaded and resulting in the dynamic loader finding no information about versions for the library.
running the program, we could obviously see the region area:
---------------
program address:
80000000-80001000 r--s 00000000 00:05 2644 /dev/zero 80001000-80012000 r-xp 00001000 fd:00 35121302 /mnt/tests/kernel/distribution/ltp/generic/ltp-full-20150903/testcases/kernel/mem/hugetlb/hugemmap/hugemmap02 80012000-80013000 r--p 00011000 fd:00 35121302 /mnt/tests/kernel/distribution/ltp/generic/ltp-full-20150903/testcases/kernel/mem/hugetlb/hugemmap/hugemmap02 80013000-80014000 rw-p 00012000 fd:00 35121302 /mnt/tests/kernel/distribution/ltp/generic/ltp-full-20150903/testcases/kernel/mem/hugetlb/hugemmap/hugemmap02 80014000-80017000 rw-p 00000000 00:00 0 90000000-90200000 rw-s 00000000 00:29 75950 /tmp/hugme85Xf/mmapfile41071 9c14f000-9c170000 rw-p 00000000 00:00 0 [heap] 3ffad342000-3ffbd342000 r--s 00000000 00:05 2644 /dev/zero 3ffbd342000-3ffcd342000 r--s 00000000 00:05 2644 /dev/zero 3ffcd342000-3ffdd342000 r--s 00000000 00:05 2644 /dev/zero 3ffdd342000-3ffed342000 r--s 00000000 00:05 2644 /dev/zero 3ffed342000-3fffd342000 r--s 00000000 00:05 2644 /dev/zero 3fffd342000-3fffd344000 rw-p 00000000 00:00 0 3fffd344000-3fffd4db000 r-xp 00000000 fd:00 5438 /usr/lib64/libc-2.17.so 3fffd4db000-3fffd4df000 r--p 00196000 fd:00 5438 /usr/lib64/libc-2.17.so 3fffd4df000-3fffd4e1000 rw-p 0019a000 fd:00 5438 /usr/lib64/libc-2.17.so 3fffd4e1000-3fffd4e6000 rw-p 00000000 00:00 0 3fffd4e6000-3fffd4fe000 r-xp 00000000 fd:00 5464 /usr/lib64/libpthread-2.17.so 3fffd4fe000-3fffd4ff000 r--p 00017000 fd:00 5464 /usr/lib64/libpthread-2.17.so 3fffd4ff000-3fffd500000 rw-p 00018000 fd:00 5464 /usr/lib64/libpthread-2.17.so 3fffd500000-3fffd504000 rw-p 00000000 00:00 0 3fffd50c000-3fffd510000 rw-p 00000000 00:00 0 3fffd510000-3fffd512000 r-xp 00000000 00:00 0 [vdso] 3fffd512000-3fffd534000 r-xp 00000000 fd:00 5431 /usr/lib64/ld-2.17.so 3fffd534000-3fffd535000 r--p 00022000 fd:00 5431 /usr/lib64/ld-2.17.so 3fffd535000-3fffd536000 rw-p 00023000 fd:00 5431 /usr/lib64/ld-2.17.so
3fffd536000-3fffd537000 rw-p 00000000 00:00 0
3ffffaaf000-3ffffad0000 rw-p 00000000 00:00 0 [stack]
-------------
--- testcases/kernel/mem/hugetlb/hugemmap/hugemmap02.c | 25 ++++++++++++++--- testcases/kernel/mem/include/mem.h | 2 ++ testcases/kernel/mem/lib/mem.c | 32 ++++++++++++++++++++++ 3 files changed, 55 insertions(+), 4 deletions(-)
testcases/kernel/mem/hugetlb/hugemmap/hugemmap02.c +21 -4
@@ -56,8 +56,8 @@#include "safe_macros.h" #include "mem.h" -#define LOW_ADDR (void *)(0x80000000) -#define LOW_ADDR2 (void *)(0x90000000) +#define LOW_ADDR 0x80000000 +#define LOW_ADDR2 0x90000000static char TEMPFILE [MAXPATHLEN ];
@@ -65,6 +65,8 @@ char *TCID = "hugemmap02";int TST_TOTAL =1 ;static unsigned long *addr;static unsigned long *addr2; +static unsigned long low_addr =LOW_ADDR ; +static unsigned long low_addr2 =LOW_ADDR2 ;static unsigned long *addrlist[5 ];static int i;static int fildes;
@@ -75,6 +77,7 @@ static long hugepages = 128;static long orig_hugepages;static void help (void ); +int range_is_mapped (void (*cleanup_fn) (void ),unsigned long low,unsigned long high);int main (int ac,char **av) {
@@ -127,15 +130,29 @@ int main(int ac, char **av) addrlist[i] = addr; } +while (range_is_mapped (cleanup, low_addr, low_addr + map_sz) ==1 ) { + low_addr = low_addr +0x10000000 ; + +if (low_addr <LOW_ADDR ) +tst_brkm (TBROK |TERRNO , cleanup, +"no empty region to use" ); + }/* mmap using normal pages and a low memory address */ - addr =mmap (LOW_ADDR , page_sz,PROT_READ , + addr =mmap ((void *)low_addr, page_sz,PROT_READ ,MAP_SHARED |MAP_FIXED , nfildes,0 );if (addr ==MAP_FAILED )tst_brkm (TBROK |TERRNO , cleanup,"mmap failed on nfildes" ); +while (range_is_mapped (cleanup, low_addr2, low_addr2 + map_sz) ==1 ) { + low_addr2 = low_addr2 +0x10000000 ; + +if (low_addr2 <LOW_ADDR2 ) +tst_brkm (TBROK |TERRNO , cleanup, +"no empty region to use" ); + }/* Attempt to mmap a huge page into a low memory address */ - addr2 =mmap (LOW_ADDR2 , map_sz,PROT_READ |PROT_WRITE , + addr2 =mmap ((void *)low_addr2, map_sz,PROT_READ |PROT_WRITE ,MAP_SHARED , fildes,0 );#if __WORDSIZE ==64 /* 64-bit process */ if (addr2 ==MAP_FAILED ) {
testcases/kernel/mem/include/mem.h +2 -0
@@ -100,4 +100,6 @@ void setup(void);void update_shm_size (size_t *shm_size); +/* MMAP */ +int range_is_mapped (void (*cleanup_fn) (void ),unsigned long low,unsigned long high);#endif
testcases/kernel/mem/lib/mem.c +32 -0
@@ -1113,3 +1113,35 @@ void update_shm_size(size_t * shm_size) *shm_size = shmmax; } } + +int range_is_mapped (void (*cleanup_fn) (void ),unsigned long low,unsigned long high) +{ +FILE *fp; + + fp =fopen ("/proc/self/maps" ,"r" ); +if (fp ==NULL ) +tst_brkm (TBROK |TERRNO , cleanup_fn,"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_brkm (TBROK |TERRNO , cleanup_fn,"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 ; +}
Signature · 1 line
1.8.3.1
PATCH v4 1/1 mem/hugetlb: shift an empty region to use in hugemmap02.c
Hi!
Quoted 2 lines
static void help(void);
+intrange_is_mapped(void (*cleanup_fn) (void), unsigned long low, unsigned long high);
I've removed this function prototype (since the same prototype is in the mem.h header) and pushed, thanks.
Signature · 2 lines
Cyril Hrubis [email protected]