public inbox for ltp@lists.linux.it
 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 v3] Introduce ioctl_pidfd_get_info_supported() function
Date: Wed, 24 Sep 2025 10:34:43 +0200	[thread overview]
Message-ID: <aNOtI3crFfbKofHt@yuki.lan> (raw)
In-Reply-To: <20250923150337.19821-1-akumar@suse.de>

Hi!
> +static inline bool ioctl_pidfd_get_info_supported(void)
> +{
> +	pid_t pid;
> +	int pidfd, ret;
> +	int supported = 0;
> +	struct pidfd_info info;
> +
> +	if (tst_kvercmp(6, 12, 0) >= 0)
> +		return 1;
> +
> +	memset(&info, 0, sizeof(struct pidfd_info));
> +
> +	pid = SAFE_FORK();
> +	if (!pid)
> +		exit(100);
> +
> +	pidfd = SAFE_PIDFD_OPEN(pid, 0);
> +	SAFE_WAITPID(pid, NULL, 0);

Again, please do not waitpid before the PIDFD_GET_INFO ioctl(). If you
do that it has no chance of succeeding.

From fs/pidfd.c:

...
        task = get_pid_task(pid, PIDTYPE_PID);
        if (!task) {
                /*
                 * If the task has already been reaped, only exit
                 * information is available
                 */
                if (!(mask & PIDFD_INFO_EXIT))
                        return -ESRCH;

                goto copy_out;
        }
...

We have to do the ioctl() first and the waitpid() second for this case.

And if we do so we don't have to check the errno at all, the call will
just succeed in case that it's supported.

> +	ret = ioctl(pidfd, PIDFD_GET_INFO, &info);
> +	SAFE_CLOSE(pidfd);
> +
> +	if (ret == -1) {
> +		/* - ENOTTY: kernel too old, ioctl(PIDFD_GET_INFO) not implemented */
> +		if (errno == ENOTTY)
> +			supported = 0;
> +
> +		/* - EINVAL: ioctl(PIDFD_GET_INFO) exists but args invalid
> +		 * - ESRCH: ioctl(PIDFD_GET_INFO) exists but task already exited
> +		 * supported in both cases, but info.mask not set
> +		 */
> +		else if (errno == EINVAL || errno == ESRCH)
> +			supported = 1;
> +		else
> +			tst_brk(TBROK | TERRNO, "unexpected ioctl(PIDFD_GET_INFO) error");
> +	} else {
> +		supported = 1;
> +	}
> +
> +	return supported;
> +}
> +
>  static inline int ioctl_pidfd_info_exit_supported(void)
>  {
>  	int ret;
> diff --git a/testcases/kernel/syscalls/ioctl/ioctl_pidfd05.c b/testcases/kernel/syscalls/ioctl/ioctl_pidfd05.c
> index c379717b3..d20c6f074 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())
> +		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-24  8:34 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
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             ` Cyril Hrubis [this message]
2025-09-24 20:30               ` [LTP] [PATCH v3] " 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=aNOtI3crFfbKofHt@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox