All of lore.kernel.org
 help / color / mirror / Atom feed
From: Cyril Hrubis <chrubis@suse.cz>
To: Avinesh Kumar <akumar@suse.de>
Cc: ltp@lists.linux.it
Subject: Re: [LTP] [PATCH v2] Introduce ioctl_pidfd_get_info_supported() function
Date: Tue, 23 Sep 2025 13:17:01 +0200	[thread overview]
Message-ID: <aNKBrcI4ZuHL8RE0@yuki.lan> (raw)
In-Reply-To: <20250923075118.29757-1-akumar@suse.de>

Hi!
> - use new routine in ioctl_pidfd05 test
> - refactor ioctl_pidfd_info_exit_supported() routine
> 
> Suggested-by: Petr Vorel <pvorel@suse.cz>
> Signed-off-by: Avinesh Kumar <akumar@suse.de>
> ---
>  testcases/kernel/syscalls/ioctl/ioctl_pidfd.h | 49 ++++++++++++-------
>  .../kernel/syscalls/ioctl/ioctl_pidfd05.c     |  9 +++-
>  2 files changed, 39 insertions(+), 19 deletions(-)
> 
> diff --git a/testcases/kernel/syscalls/ioctl/ioctl_pidfd.h b/testcases/kernel/syscalls/ioctl/ioctl_pidfd.h
> index 811f969cd..067ef18ba 100644
> --- a/testcases/kernel/syscalls/ioctl/ioctl_pidfd.h
> +++ b/testcases/kernel/syscalls/ioctl/ioctl_pidfd.h
> @@ -9,19 +9,16 @@
>  #include "tst_test.h"
>  #include "lapi/pidfd.h"
>  
> -static inline int ioctl_pidfd_info_exit_supported(void)
> +static inline long ioctl_pidfd_get_info_supported(void)
>  {
> -	int ret;
>  	pid_t pid;
> -	int pidfd;
> -	int supported = 0;
> +	int pidfd, ret;
>  	struct pidfd_info info;
>  
> -	if (tst_kvercmp(6, 15, 0) >= 0)
> +	if (tst_kvercmp(6, 12, 0) >= 0)
>  		return 1;
>  
>  	memset(&info, 0, sizeof(struct pidfd_info));
> -	info.mask = PIDFD_INFO_EXIT;

We have to keep the PIDFD_INFO_EXIT in the mask, otherwise it will never
be set back by the kernel.

>  	pid = SAFE_FORK();
>  	if (!pid)
> @@ -31,23 +28,39 @@ static inline int ioctl_pidfd_info_exit_supported(void)
>  	SAFE_WAITPID(pid, NULL, 0);
>  
>  	ret = ioctl(pidfd, PIDFD_GET_INFO, &info);
> +	SAFE_CLOSE(pidfd);
> +
>  	if (ret == -1) {
> -		/* - ENOTTY: old kernels not implementing fs/pidfs.c:pidfd_ioctl
> -		 * - EINVAL: until v6.13 kernel
> -		 * - ESRCH: all kernels between v6.13 and v6.15
> +		/* - ENOTTY: kernel too old, ioctl(PIDFD_GET_INFO) not implemented; return -1 */
> +		if (errno == ENOTTY)
> +			return -1;
> +
> +		/* - EINVAL: ioctl(PIDFD_GET_INFO) exists but invalid args
> +		 * - ESRCH: ioctl(PIDFD_GET_INFO) exists but task already exited
> +		 * both mean supported, but info.mask is not set; return 0
>  		 */
> -		if (errno != ENOTTY &&
> -			errno != EINVAL &&
> -			errno != ESRCH)
> -			tst_brk(TBROK | TERRNO, "ioctl error");
> -	} else {
> -		if (info.mask & PIDFD_INFO_EXIT)
> -			supported = 1;
> +		if (errno == EINVAL || errno == ESRCH)
> +			return 0;

If we do not pass the PIDFD_INFO_EXIT above we will end up with ESRCH
here all the time.

Generally I do not like this code that much, since we depend on the fact
that we get ESCHR from the syscall if PIDFD_INFO_EXIT is not
implemented. Without the PIDFD_INFO_EXIT flag the pidfd_info() syscall
is supposed to work on a process before it's waited for and
PIDFD_INFO_EXIT does not work before the process is waited for, mixing
these two checks is a bit ugly.

> +		tst_brk(TBROK | TERRNO, "unexpected ioctl(PIDFD_GET_INFO) error");
>  	}
>  
> -	SAFE_CLOSE(pidfd);
> +	/* ioctl(PIDFD_GET_INFO) successful; return mask */
> +	return info.mask;
> +}
> +
> +static inline bool ioctl_pidfd_info_exit_supported(void)
> +{
> +	long mask;
> +
> +	if (tst_kvercmp(6, 15, 0) >= 0)
> +		return 1;
> +
> +	mask = ioctl_pidfd_get_info_supported();
> +	if (mask == -1)
> +		return 0;
>  
> -	return supported;
> +	return !!(mask & PIDFD_INFO_EXIT);
>  }
>  
>  #endif
> diff --git a/testcases/kernel/syscalls/ioctl/ioctl_pidfd05.c b/testcases/kernel/syscalls/ioctl/ioctl_pidfd05.c
> index c379717b3..871f2fe5e 100644
> --- a/testcases/kernel/syscalls/ioctl/ioctl_pidfd05.c
> +++ b/testcases/kernel/syscalls/ioctl/ioctl_pidfd05.c
> @@ -14,7 +14,7 @@
>  #include "tst_test.h"
>  #include "lapi/pidfd.h"
>  #include "lapi/sched.h"
> -#include "lapi/ioctl.h"
> +#include "ioctl_pidfd.h"
>  
>  struct pidfd_info_invalid {
>  	uint32_t dummy;
> @@ -48,8 +48,15 @@ static void run(void)
>  	SAFE_CLOSE(pidfd);
>  }
>  
> +static void setup(void)
> +{
> +	if (ioctl_pidfd_get_info_supported() == -1)
> +		tst_brk(TCONF, "ioctl(PIDFD_GET_INFO) is not implemented");
> +}
> +
>  static struct tst_test test = {
>  	.test_all = run,
> +	.setup = setup,
>  	.forks_child = 1,
>  	.bufs = (struct tst_buffers []) {
>  		{&args, .size = sizeof(*args)},
> -- 
> 2.51.0
> 

-- 
Cyril Hrubis
chrubis@suse.cz

-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

  parent reply	other threads:[~2025-09-23 11:16 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-09-22 20:39 [LTP] [PATCH] Introduce ioctl_pidfd_get_info_supported() function Avinesh Kumar
2025-09-22 21:07 ` Petr Vorel
2025-09-23  7:51   ` [LTP] [PATCH v2] " Avinesh Kumar
2025-09-23  9:43     ` Petr Vorel
2025-09-23 11:17     ` Cyril Hrubis [this message]
2025-09-23 11:39       ` Petr Vorel
2025-09-23 11:49         ` Cyril Hrubis
2025-09-23 15:03           ` [LTP] [PATCH v3] " Avinesh Kumar
2025-09-23 18:44             ` Petr Vorel
2025-09-24  8:40               ` Cyril Hrubis
2025-09-24 20:29                 ` [LTP] [PATCH v4] " Avinesh Kumar
2025-09-25  2:05                   ` Li Wang via ltp
2025-09-25  2:44                   ` Li Wang via ltp
2025-09-25  8:19                     ` [LTP] [PATCH v5] " Avinesh Kumar
2025-09-25 11:45                       ` Petr Vorel
2025-09-25 12:15                       ` Petr Vorel
2025-09-25  6:54                   ` [LTP] [PATCH v4] " Cyril Hrubis
2025-09-24  8:34             ` [LTP] [PATCH v3] " Cyril Hrubis
2025-09-24 20:30               ` Avinesh Kumar

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=aNKBrcI4ZuHL8RE0@yuki.lan \
    --to=chrubis@suse.cz \
    --cc=akumar@suse.de \
    --cc=ltp@lists.linux.it \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.