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

Andrea Cervesato andrea.cervesato@suse.com
Thu Oct 10 14:24:40 CEST 2024


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


More information about the ltp mailing list