[LTP] [PATCH 1/2] lib: initialize lib|main_pid to zero in the setup_ipc
Li Wang
liwang@redhat.com
Tue May 13 15:02:05 CEST 2025
On Tue, May 13, 2025 at 8:52 PM Petr Vorel <pvorel@suse.cz> wrote:
>
> Hi all,
>
> ...
> > > +++ b/lib/tst_test.c
> > > @@ -59,7 +59,6 @@ static const char *tid;
> > > static int iterations = 1;
> > > static float duration = -1;
> > > static float timeout_mul = -1;
> > > -static pid_t lib_pid;
> > > static int mntpoint_mounted;
> > > static int ovl_mounted;
> > > static struct timespec tst_start_time; /* valid only for test pid */
> > > @@ -143,7 +142,9 @@ static void setup_ipc(void)
> > > tst_futexes = (char *)results + sizeof(struct results);
> > > tst_max_futexes = (size - sizeof(struct results))/sizeof(futex_t);
> > > }
> > > - results->lib_pid = lib_pid;
> > > +
> > > + results->lib_pid = 0;
> > > + results->main_pid = 0;
>
> nit: Is it really needed to int them to 0? Because they should be 0 due the
> default struct value, right?
Right!
I think we need to initialize them, because the test may fail/break
just before creating main_pid, then test cleanup work needs to
invoke tst_vbrk_ and tst_res_ somewhere that compares pid to
invoke the corresponding cleanup work.
>
> > > }
>
> > > static void cleanup_ipc(void)
> > > @@ -394,7 +395,7 @@ void tst_vbrk_(const char *file, const int lineno, int ttype, const char *fmt,
> > > * If tst_brk() is called from some of the C helpers even before the
> > > * library was initialized, just exit.
> > > */
> > > - if (!results->lib_pid)
> > > + if (!results || !results->lib_pid)
> > > exit(TTYPE_RESULT(ttype));
>
> > > update_results(TTYPE_RESULT(ttype));
> > > @@ -1334,6 +1335,8 @@ static void do_setup(int argc, char *argv[])
> > > tst_test->forks_child = 1;
> > > }
>
> > > + setup_ipc();
> > > +
> > > if (tst_test->needs_kconfigs && tst_kconfig_check(tst_test->needs_kconfigs))
> > > tst_brk(TCONF, "Aborting due to unsuitable kernel config, see above!");
>
> > > @@ -1393,8 +1396,6 @@ static void do_setup(int argc, char *argv[])
> > > if (tst_test->hugepages.number)
> > > tst_reserve_hugepages(&tst_test->hugepages);
>
> > > - setup_ipc();
> > > -
>
> > I suppose that this has to go before the tst_reserve_hugepages() so that
> > we have results->lib_pid defined and properly clean up after the
> > hugepages.
>
> Why? Is that due possible tst_brk() calls in tst_reserve_hugepages()?
> (Which uses SAFE_* macros.) That would trigger Because there are tst_brk() calls before.
>
> Also why not assign results->lib_pid = getpid() at the beginning of
> tst_run_tcases() ?
No, we can't.
Because we moved the lib_pid in the IPC region, which allocated memory
in the setup_ipc() function.
>
> Kind regards,
> Petr
>
> > However for that to work we have to set the
> > results->lib_pid directly in the setup_ipc().
>
> > > if (tst_test->bufs)
> > > tst_buffers_alloc(tst_test->bufs);
>
> > > @@ -1929,10 +1930,11 @@ void tst_run_tcases(int argc, char *argv[], struct tst_test *self)
> > > unsigned int test_variants = 1;
> > > struct utsname uval;
>
> > > - lib_pid = getpid();
> > > tst_test = self;
>
> > > do_setup(argc, argv);
> > > +
> > > + results->lib_pid = getpid();
>
> > Setting it here is too late.
>
> > Other than that the patch looks good to me.
>
--
Regards,
Li Wang
More information about the ltp
mailing list