testcases/kernel/mem/vma/vma01.c: fix the right start/end memory address
PATCH 1/1 testcases/kernel/mem/vma/vma01.c: fix the right start/end memory address
For a VMA with memory range 6*ps, regardless of it's two 3*ps or one single 6*ps, t is the start addr of the vma, u = t + 3*ps, and the end addr is t + 6*ps.
For the check process, x should start from t, not u, and later check for the second 3*ps should resume from u.
--- testcases/kernel/mem/vma/vma01.c | 10 +++++----- 1 files changed, 5 insertions(+), 5 deletions(-)
testcases/kernel/mem/vma/vma01.c +5 -5
@@ -112,12 +112,12 @@ static void check_vma(void)printf ("child : u = %p\n" , u);memset (u,2 , ps); - x =get_end_addr (u,MAPS_FILE ); -if (x == u +6 *ps) + x =get_end_addr (t,MAPS_FILE ); +if (x == t +6 *ps)exit (1 ); -if (x == u +3 *ps) { - y =get_end_addr (x,MAPS_FILE ); -if (y == x +3 *ps) +if (x == u) { + y =get_end_addr (u,MAPS_FILE ); +if (y == u +3 *ps)exit (0 ); }exit (255 );
Signature · 10 lines
1.7.1 ------------------------------------------------------------------------------ This SF email is sponsosred by: Try Windows Azure free for 90 days Click Here http://p.sf.net/sfu/sfd2d-msazure _______________________________________________ Ltp-list mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/ltp-list
Quoted 6 lines · Wang Sheng-Hui
For a VMA with memory range 6*ps, regardless of it's two 3*ps or one single 6*ps, t is the start addr of the vma, u = t + 3*ps, and the end addr is t + 6*ps.
For the check process, x should start from t, not u, and later check for the second 3*ps should resume from u.
Hi Shenghui, thanks for the patch.
However, your patch doesn't work in some situation, e.g.: when t mmapped at highest addr (it is the most common situation), which makes t+3*ps over boundary, so mmap will map to another addr near t+3*ps. So I propose for the following increment fix:
static void check_vma(void)
{
int status;- void *t, *u, *x, *y;
+ void *t, *u, *v, *x, *y;
- t = mmap(NULL, 3*ps, PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, 0, 0);
+ v = mmap(NULL, ps, PROT_READ, MAP_ANONYMOUS|MAP_PRIVATE, 0, 0);
+ if (v == MAP_FAILED)
+ tst_brkm(TBROK|TERRNO, cleanup, "mmap");
+ t = mmap(v - 6*ps, 3*ps, PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE,
0, 0);
if (t == MAP_FAILED)
tst_brkm(TBROK|TERRNO, cleanup, "mmap");
memset(t, 1, ps);A new addr v introduced before other mappings, used to locate the highest addr. And in order not to be merged with other mappings, v is mapped with READ-only prot.
result using your patch w/o my increment patch:
# ./vma01 parent: t = 0x7f82dd437000 child : u = 0x7f82dd434000 vma01 0 TINFO : s = 0x7f82dd437000, t = 0x7f82dd43a000 vma01 1 TBROK : unexpected VMA found. vma01 2 TBROK : Remaining cases broken
result using your patch w/ my increment patch:
# ./vma01 parent: t = 0x7f418066f000 child : u = 0x7f4180672000 vma01 0 TINFO : s = 0x7f418066f000, t = 0x7f4180672000 vma01 0 TINFO : s = 0x7f4180672000, t = 0x7f4180675000 vma01 1 TPASS : two 3*ps VMAs found.
Thoughts?
Thanks,
Caspar
Quoted 18 lines
Signed-off-by Wang Sheng-Hui <[email protected]>--- testcases/kernel/mem/vma/vma01.c | 10 +++++----- 1 files changed, 5 insertions(+), 5 deletions(-)testcases/kernel/mem/vma/vma01.c +2
-2@@ -112,12 +112,12 @@ static void check_vma(void)printf ("child : u = %p\n" , u);memset (u,2 , ps); - x =get_end_addr (u,MAPS_FILE ); -if (x == u +6 *ps) + x =get_end_addr (t,MAPS_FILE ); +if (x == t +6 *ps)
testcases/kernel/mem/vma/vma01.c static void check_vma(void) · line 123
Quoted 10 lines
testcases/kernel/mem/vma/vma01.c +3
-3exit (1 ); -if (x == u +3 *ps) { - y =get_end_addr (x,MAPS_FILE ); -if (y == x +3 *ps) +if (x == u) { + y =get_end_addr (u,MAPS_FILE ); +if (y == u +3 *ps)exit (0 ); }exit (255 );
------------------------------------------------------------------------------
This SF email is sponsosred by:
Try Windows Azure free for 90 days Click Here
http://p.sf.net/sfu/sfd2d-msazure
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list