<div dir="ltr"><div dir="ltr"><div class="gmail_default" style="font-size:small"><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Jun 30, 2020 at 1:45 PM pravin <<a href="mailto:pravinraghul@zilogic.com" target="_blank">pravinraghul@zilogic.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br>
We assign the memory region allocated using MAP_GROWSDOWN to a thread,<br>
as a stack, to test the effect of MAP_GROWSDOWN. This is because the<br>
kernel only grows the memory region when the stack pointer, is within<br>
guard page, when the guard page is touched.<br>
<br>
  1. Map an anyonymous memory region of size X, and unmap it.<br>
  2. Split the unmapped memory region into two.<br>
  3. The lower memory region is left unmapped.<br>
  4. The higher memory region is mapped for use as stack, using MAP_FIXED | MAP_GROWSDOWN.<br>
  5. The higher memory region is provided as stack to a thread, where<br>
     a recursive function is invoked.<br>
  6. The stack grows beyond the allocated region, into the lower memory area.<br>
  7. If this results in the memory region being extended, into the<br>
     unmapped region, the test is considered to have passed.<br>
<br>
<span class="gmail_default" style="font-size:small">...</span><br>
+<br>
+void split_unmapped_plus_stack(void *start, size_t size, void **stack)<br>
+{<br>
+       /*<br>
+         * +---------------------+----------------------+<br>
+         * + unmapped            | stack                |<br>
+         * +---------------------+----------------------+<br>
+         */<br>
+       *stack = SAFE_MMAP(start, size, PROT_READ | PROT_WRITE,<br></blockquote><div><br></div><div class="gmail_default" style="font-size:small">This does not match what you describe in the code comments, here we still map the total size of the memory area, and stack can not grow into an unmapped region.</div><div class="gmail_default" style="font-size:small"><br></div><div class="gmail_default" style="font-size:small">Looking at the address which printed from your code, the mem == stack and &limit grows down in mapped address.</div><div class="gmail_default" style="font-size:small"><br></div><div class="gmail_default" style="font-size:small"># ./mmap18<br>tst_test.c:1247: INFO: Timeout per run is 0h 05m 00s<br>mmap18.c:132: INFO: mem = 0x7ffff7fa5000, stack = 0x7ffff7fa5000<br>mmap18.c:96: INFO: &limit = 0x7ffff7fa8fe8, limit = 0x7ffff7fa9000<br>mmap18.c:141: PASS: stack grows in unmapped region<br></div><div><br></div><div><br></div><div class="gmail_default" style="font-size:small">Maybe this below could achieve your method, or you can take the way which Cyril suggests using multiple page_size.</div><div class="gmail_default" style="font-size:small"><br></div>--- a/testcases/kernel/syscalls/mmap/mmap18.c<br>+++ b/testcases/kernel/syscalls/mmap/mmap18.c<br>@@ -84,15 +84,17 @@ void split_unmapped_plus_stack(void *start, size_t size, void **stack)<br>          * + unmapped            | stack                |<br>          * +---------------------+----------------------+<br>          */<br>-       *stack = SAFE_MMAP(start, size, PROT_READ | PROT_WRITE,<br>+       *stack = SAFE_MMAP(start + size/2, size/2, PROT_READ | PROT_WRITE,<br>                           MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS | MAP_GROWSDOWN,<br>                           -1, 0);<br> }<br> <br> static void *check_depth_recursive(void *limit)<br> {<br>-       if ((off_t) &limit < (off_t) limit)<br>+       if ((off_t) &limit < (off_t) limit) {<br>+               tst_res(TINFO, "&limit = %p, limit = %p", &limit, limit);<br>                return NULL;<br>+       }<br> <br>        return check_depth_recursive(limit);<br> }<br>@@ -125,10 +127,11 @@ static void run_test(void)<br> <br>        mem = find_free_range(UNITS(16));<br>        split_unmapped_plus_stack(mem, UNITS(16), &stack);<br>+       tst_res(TINFO, "mem = %p, stack = %p", mem, stack);<br> <br>        child_pid = SAFE_FORK();<br>        if (child_pid == 0) {<br>-               grow_stack(stack, UNITS(8), mem + UNITS(1));<br>+               grow_stack(stack, UNITS(8), stack - UNITS(1));<br>        } else {<br>                SAFE_WAIT(&wstatus);<br>                if (WIFEXITED(wstatus) && WEXITSTATUS(wstatus) == 0)<br><div class="gmail_default" style="font-size:small"></div><div><br></div></div>-- <br><div dir="ltr"><div dir="ltr"><div>Regards,<br></div><div>Li Wang<br></div></div></div></div>