<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 Thu, Jun 13, 2019 at 9:58 PM Cyril Hrubis <<a href="mailto:chrubis@suse.cz">chrubis@suse.cz</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">Hi!<br>
> > @@ -170,5 +170,5 @@ int ltp_clone_quick(unsigned long clone_flags, int<br>
> > (*fn) (void *arg), void *arg)<br>
> >  {<br>
> >         size_t stack_size = getpagesize() * 6;<br>
> ><br>
> > -       return ltp_clone_malloc(clone_flags, fn, arg, stack_size);<br>
> > +       return ltp_clone_alloc(clone_flags, fn, arg, stack_size);<br>
> >  }<br>
> ><br>
> <br>
> There is another legacy problem maybe we need take care.<br>
> <br>
> Any thought about how releasing the stack memory[1] after calling<br>
> ltp_clone_quick() in a test?<br>
> <br>
> [1] which allocated memory in ltp_clone_alloc().<br>
<br>
Well, we can free the memory in ltp_clone_alloc() if the child runs in a<br>
separate memory space, but if CLONE_VM was passed in flags there is no<br>
way how to free the memory...<br></blockquote><div><br></div><div class="gmail_default" style="font-size:small">A stupid way come up to my mind is just to export the stack as global pointer and releasing in do_cleanup() if possible.</div><div class="gmail_default" style="font-size:small"><br></div>diff --git a/include/tst_clone.h b/include/tst_clone.h<br>index fd52097..c98eb44 100644<br>--- a/include/tst_clone.h<br>+++ b/include/tst_clone.h<br>diff --git a/include/tst_clone.h b/include/tst_clone.h<br>index fd52097..c98eb44 100644<br>--- a/include/tst_clone.h<br>+++ b/include/tst_clone.h<br>@@ -24,6 +24,8 @@<br> #ifndef TST_CLONE_H__<br> #define TST_CLONE_H__<br> <br>+void *tst_clone_stack;<br>+<br> /* Functions from lib/cloner.c */<br> int ltp_clone(unsigned long flags, int (*fn)(void *arg), void *arg,<br>                size_t stack_size, void *stack);<br>diff --git a/lib/cloner.c b/lib/cloner.c<br>index 8469745..4534982 100644<br>--- a/lib/cloner.c<br>+++ b/lib/cloner.c<br>@@ -142,19 +142,17 @@ int<br> ltp_clone_alloc(unsigned long clone_flags, int (*fn) (void *arg), void *arg,<br>                 size_t stack_size)<br> {<br>-       void *stack;<br>        int ret;<br>        int saved_errno;<br>-<br>-       stack = ltp_alloc_stack(stack_size);<br>-       if (stack == NULL)<br>+       tst_clone_stack = ltp_alloc_stack(stack_size);<br>+       if (tst_clone_stack == NULL)<br>                return -1;<br> <br>-       ret = ltp_clone(clone_flags, fn, arg, stack_size, stack);<br>+       ret = ltp_clone(clone_flags, fn, arg, stack_size, tst_clone_stack);<br> <br>        if (ret == -1) {<br>                saved_errno = errno;<br>-               free(stack);<br>+               free(tst_clone_stack);<br>                errno = saved_errno;<br>        }<br> <br>diff --git a/lib/tst_test.c b/lib/tst_test.c<br>index 95f389d..e96a9c7 100644<br>--- a/lib/tst_test.c<br>+++ b/lib/tst_test.c<br>@@ -909,6 +909,9 @@ static void do_cleanup(void)<br>        if (mntpoint_mounted)<br>                tst_umount(tst_test->mntpoint);<br> <br>+       if (tst_clone_stack)<br>+               free(tst_clone_stack);<br>+<br>        if (tst_test->needs_device && <a href="http://tdev.dev">tdev.dev</a>)<br>                tst_release_device(<a href="http://tdev.dev">tdev.dev</a>);<br> </div>-- <br><div dir="ltr" class="gmail_signature"><div dir="ltr"><div>Regards,<br></div><div>Li Wang<br></div></div></div></div>