Re: [LTP] [PATCH v2 3/3] Add process_mrelease02 test

Andrea Cervesato via ltp
2024-10-10T12:25:06Z

Hi,

On 10/7/24 17:03, Cyril Hrubis wrote:
> Hi!
>> +/*\
>> + * [Description]
>> + *
>> + * This test verifies that process_mrelease() syscall is raising errors:
>> + * * EBADF when a bad file descriptor is given
>> + * * EINVAL when flags is not zero
>> + * * EINVAL when memory of a task cannot be released because it's still running
>> + * * ESRCH when child has been closed
>> + */
>> +
>> +#include "tst_test.h"
>> +#include "lapi/syscalls.h"
>> +
>> +static int badfd = -1;
>> +static int pidfd;
>> +
>> +enum {
>> + NO_CHILD,
>> + EXIT_CHILD,
>> + WAIT_CHILD,
>> +};
>> +
>> +static struct tcase {
>> + int child_type;
>> + int *fd;
>> + int flags;
>> + int exp_errno;
>> + char *msg;
>> +} tcases[] = {
>> + {NO_CHILD, &badfd, 0, EBADF, "bad file descriptor"},
>> + {WAIT_CHILD, &pidfd, -1, EINVAL, "flags is not 0"},
>> + {WAIT_CHILD, &pidfd, 0, EINVAL, "task memory cannot be released"},
>> + {EXIT_CHILD, &pidfd, 0, ESRCH, "child is not running"},
>> +};
>> +
>> +static void run(unsigned int n)
>> +{
>> + struct tcase *tc = &tcases[n];
>> + int status;
>> +
>> + if (tc->child_type != NO_CHILD) {
>> + pid_t pid;
>> +
>> + pid = SAFE_FORK();
>> + if (!pid) {
>> + if (tc->child_type == WAIT_CHILD)
>> + TST_CHECKPOINT_WAIT(0);
>> +
>> + exit(0);
>> + }
>> +
>> + tst_res(TINFO, "Spawned waiting child with pid=%d", pid);
>> +
>> + pidfd = SAFE_PIDFD_OPEN(pid, 0);
>> +
>> + if (tc->child_type == EXIT_CHILD)
>> + SAFE_WAITPID(pid, &status, 0);
>> + }
> Why don't we instead fork two children in the setup, one of the waits
> and second exits and just set the pidfd once?
At the end of each test() the library calls tst_reap_children() and the
waiting child will fail with ETIMEDOUT, so we need to spawn a child for
each new test.
>> + TST_EXP_FAIL(tst_syscall(__NR_process_mrelease, *tc->fd, tc->flags),
>> + tc->exp_errno,
>> + "%s", tc->msg);
>> +
>> + if (tc->child_type != NO_CHILD) {
>> + if (tc->child_type == WAIT_CHILD)
>> + TST_CHECKPOINT_WAKE(0);
>> +
>> + SAFE_CLOSE(pidfd);
>> + }
>> +}
>> +
>> +static struct tst_test test = {
>> + .test = run,
>> + .tcnt = ARRAY_SIZE(tcases),
>> + .needs_root = 1,
>> + .forks_child = 1,
>> + .min_kver = "5.15",
>> + .needs_checkpoints = 1,
>> +};
>>
>> --
>> 2.43.0
>>
>>
>> --
>> Mailing list info: https://lists.linux.it/listinfo/ltp