From: joel at joelfernandes.org (Joel Fernandes)
Subject: [PATCH v1 2/2] Add selftests for pidfd polling
Date: Fri, 26 Apr 2019 09:47:19 -0400 [thread overview]
Message-ID: <20190426134719.GB261279@google.com> (raw)
In-Reply-To: <20190425200035.GC30500@cisco>
On Thu, Apr 25, 2019 at 02:00:35PM -0600, Tycho Andersen wrote:
> On Thu, Apr 25, 2019 at 03:00:10PM -0400, Joel Fernandes (Google) wrote:
> >
> > +void *test_pidfd_poll_exec_thread(void *priv)
>
> I think everything in this file can be static, there's this one and
> 3-4 below.
>
> > +int test_pidfd_poll_exec(int use_waitpid)
> > +{
> > + int pid, pidfd = 0;
> > + int status, ret;
> > + pthread_t t1;
> > + time_t prog_start = time(NULL);
> > + const char *test_name = "pidfd_poll check for premature notification on child thread exec";
> > +
> > + ksft_print_msg("Parent: pid: %d\n", getpid());
> > + pid = pidfd_clone(CLONE_PIDFD, &pidfd, child_poll_exec_test);
>
> If pidfd_clone() fails here, I think things will go haywire below.
>
> > + ksft_print_msg("Parent: Waiting for Child (%d) to complete.\n", pid);
> > +
> > + if (use_waitpid) {
> > + ret = waitpid(pid, &status, 0);
> > + if (ret == -1)
> > + ksft_print_msg("Parent: error\n");
> > +
> > + if (ret == pid)
> > + ksft_print_msg("Parent: Child process waited for.\n");
> > + } else {
> > + poll_pidfd(test_name, pidfd);
> > + }
> > +
> > + time_t prog_time = time(NULL) - prog_start;
> > +
> > + ksft_print_msg("Time waited for child: %lu\n", prog_time);
> > +
> > + close(pidfd);
> > +
> > + if (prog_time < CHILD_THREAD_MIN_WAIT || prog_time > CHILD_THREAD_MIN_WAIT + 2)
> > + ksft_exit_fail_msg("%s test: Failed\n", test_name);
> > + else
> > + ksft_test_result_pass("%s test: Passed\n", test_name);
> > +}
> > +
> > +void *test_pidfd_poll_leader_exit_thread(void *priv)
> > +{
> > + char waittime[256];
> > +
> > + ksft_print_msg("Child Thread: starting. pid %d tid %d ; and sleeping\n",
> > + getpid(), syscall(SYS_gettid));
> > + sleep(CHILD_THREAD_MIN_WAIT);
> > + ksft_print_msg("Child Thread: DONE. pid %d tid %d\n", getpid(), syscall(SYS_gettid));
> > + return NULL;
> > +}
> > +
> > +static time_t *child_exit_secs;
> > +static int child_poll_leader_exit_test(void *args)
> > +{
> > + pthread_t t1, t2;
> > +
> > + ksft_print_msg("Child: starting. pid %d tid %d\n", getpid(), syscall(SYS_gettid));
> > + pthread_create(&t1, NULL, test_pidfd_poll_leader_exit_thread, NULL);
> > + pthread_create(&t2, NULL, test_pidfd_poll_leader_exit_thread, NULL);
> > +
> > + /*
> > + * glibc exit calls exit_group syscall, so explicity call exit only
> > + * so that only the group leader exits, leaving the threads alone.
> > + */
> > + *child_exit_secs = time(NULL);
> > + syscall(SYS_exit, 0);
> > +}
> > +
> > +int test_pidfd_poll_leader_exit(int use_waitpid)
> > +{
> > + int pid, pidfd = 0;
> > + int status, ret;
> > + time_t prog_start = time(NULL);
> > + const char *test_name = "pidfd_poll check for premature notification on non-empty"
> > + "group leader exit";
> > +
> > + child_exit_secs = mmap(NULL, sizeof *child_exit_secs, PROT_READ | PROT_WRITE,
> > + MAP_SHARED | MAP_ANONYMOUS, -1, 0);
> > +
> > + ksft_print_msg("Parent: pid: %d\n", getpid());
> > + pid = pidfd_clone(CLONE_PIDFD, &pidfd, child_poll_leader_exit_test);
>
> Same problem here, I think.
All comments address and fixed in the next revision, thanks!
- Joel
WARNING: multiple messages have this Message-ID (diff)
From: joel@joelfernandes.org (Joel Fernandes)
Subject: [PATCH v1 2/2] Add selftests for pidfd polling
Date: Fri, 26 Apr 2019 09:47:19 -0400 [thread overview]
Message-ID: <20190426134719.GB261279@google.com> (raw)
Message-ID: <20190426134719.XfxLXyYEmW3QdBkJrv-xY-dTOMdciA0NSX4ayfWv-Xo@z> (raw)
In-Reply-To: <20190425200035.GC30500@cisco>
On Thu, Apr 25, 2019@02:00:35PM -0600, Tycho Andersen wrote:
> On Thu, Apr 25, 2019@03:00:10PM -0400, Joel Fernandes (Google) wrote:
> >
> > +void *test_pidfd_poll_exec_thread(void *priv)
>
> I think everything in this file can be static, there's this one and
> 3-4 below.
>
> > +int test_pidfd_poll_exec(int use_waitpid)
> > +{
> > + int pid, pidfd = 0;
> > + int status, ret;
> > + pthread_t t1;
> > + time_t prog_start = time(NULL);
> > + const char *test_name = "pidfd_poll check for premature notification on child thread exec";
> > +
> > + ksft_print_msg("Parent: pid: %d\n", getpid());
> > + pid = pidfd_clone(CLONE_PIDFD, &pidfd, child_poll_exec_test);
>
> If pidfd_clone() fails here, I think things will go haywire below.
>
> > + ksft_print_msg("Parent: Waiting for Child (%d) to complete.\n", pid);
> > +
> > + if (use_waitpid) {
> > + ret = waitpid(pid, &status, 0);
> > + if (ret == -1)
> > + ksft_print_msg("Parent: error\n");
> > +
> > + if (ret == pid)
> > + ksft_print_msg("Parent: Child process waited for.\n");
> > + } else {
> > + poll_pidfd(test_name, pidfd);
> > + }
> > +
> > + time_t prog_time = time(NULL) - prog_start;
> > +
> > + ksft_print_msg("Time waited for child: %lu\n", prog_time);
> > +
> > + close(pidfd);
> > +
> > + if (prog_time < CHILD_THREAD_MIN_WAIT || prog_time > CHILD_THREAD_MIN_WAIT + 2)
> > + ksft_exit_fail_msg("%s test: Failed\n", test_name);
> > + else
> > + ksft_test_result_pass("%s test: Passed\n", test_name);
> > +}
> > +
> > +void *test_pidfd_poll_leader_exit_thread(void *priv)
> > +{
> > + char waittime[256];
> > +
> > + ksft_print_msg("Child Thread: starting. pid %d tid %d ; and sleeping\n",
> > + getpid(), syscall(SYS_gettid));
> > + sleep(CHILD_THREAD_MIN_WAIT);
> > + ksft_print_msg("Child Thread: DONE. pid %d tid %d\n", getpid(), syscall(SYS_gettid));
> > + return NULL;
> > +}
> > +
> > +static time_t *child_exit_secs;
> > +static int child_poll_leader_exit_test(void *args)
> > +{
> > + pthread_t t1, t2;
> > +
> > + ksft_print_msg("Child: starting. pid %d tid %d\n", getpid(), syscall(SYS_gettid));
> > + pthread_create(&t1, NULL, test_pidfd_poll_leader_exit_thread, NULL);
> > + pthread_create(&t2, NULL, test_pidfd_poll_leader_exit_thread, NULL);
> > +
> > + /*
> > + * glibc exit calls exit_group syscall, so explicity call exit only
> > + * so that only the group leader exits, leaving the threads alone.
> > + */
> > + *child_exit_secs = time(NULL);
> > + syscall(SYS_exit, 0);
> > +}
> > +
> > +int test_pidfd_poll_leader_exit(int use_waitpid)
> > +{
> > + int pid, pidfd = 0;
> > + int status, ret;
> > + time_t prog_start = time(NULL);
> > + const char *test_name = "pidfd_poll check for premature notification on non-empty"
> > + "group leader exit";
> > +
> > + child_exit_secs = mmap(NULL, sizeof *child_exit_secs, PROT_READ | PROT_WRITE,
> > + MAP_SHARED | MAP_ANONYMOUS, -1, 0);
> > +
> > + ksft_print_msg("Parent: pid: %d\n", getpid());
> > + pid = pidfd_clone(CLONE_PIDFD, &pidfd, child_poll_leader_exit_test);
>
> Same problem here, I think.
All comments address and fixed in the next revision, thanks!
- Joel
WARNING: multiple messages have this Message-ID (diff)
From: Joel Fernandes <joel@joelfernandes.org>
To: Tycho Andersen <tycho@tycho.ws>
Cc: linux-kernel@vger.kernel.org,
Andrew Morton <akpm@linux-foundation.org>,
Arnd Bergmann <arnd@arndb.de>,
Christian Brauner <christian@brauner.io>,
dancol@google.com, "Eric W. Biederman" <ebiederm@xmission.com>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Ingo Molnar <mingo@kernel.org>,
jannh@google.com, Jann Horn <jann@thejh.net>,
Jonathan Kowalski <bl0pbl33p@gmail.com>,
kernel-team@android.com, linux-kselftest@vger.kernel.org,
luto@amacapital.net, Michal Hocko <mhocko@suse.com>,
"Peter Zijlstra (Intel)" <peterz@infradead.org>,
rostedt@goodmis.org, Serge Hallyn <serge@hallyn.com>,
Shuah Khan <shuah@kernel.org>,
sspatil@google.com, Stephen Rothwell <sfr@canb.auug.org.au>,
surenb@google.com, Thomas Gleixner <tglx@linutronix.de>,
timmurray@google.com, torvalds@linux-foundation.org
Subject: Re: [PATCH v1 2/2] Add selftests for pidfd polling
Date: Fri, 26 Apr 2019 09:47:19 -0400 [thread overview]
Message-ID: <20190426134719.GB261279@google.com> (raw)
In-Reply-To: <20190425200035.GC30500@cisco>
On Thu, Apr 25, 2019 at 02:00:35PM -0600, Tycho Andersen wrote:
> On Thu, Apr 25, 2019 at 03:00:10PM -0400, Joel Fernandes (Google) wrote:
> >
> > +void *test_pidfd_poll_exec_thread(void *priv)
>
> I think everything in this file can be static, there's this one and
> 3-4 below.
>
> > +int test_pidfd_poll_exec(int use_waitpid)
> > +{
> > + int pid, pidfd = 0;
> > + int status, ret;
> > + pthread_t t1;
> > + time_t prog_start = time(NULL);
> > + const char *test_name = "pidfd_poll check for premature notification on child thread exec";
> > +
> > + ksft_print_msg("Parent: pid: %d\n", getpid());
> > + pid = pidfd_clone(CLONE_PIDFD, &pidfd, child_poll_exec_test);
>
> If pidfd_clone() fails here, I think things will go haywire below.
>
> > + ksft_print_msg("Parent: Waiting for Child (%d) to complete.\n", pid);
> > +
> > + if (use_waitpid) {
> > + ret = waitpid(pid, &status, 0);
> > + if (ret == -1)
> > + ksft_print_msg("Parent: error\n");
> > +
> > + if (ret == pid)
> > + ksft_print_msg("Parent: Child process waited for.\n");
> > + } else {
> > + poll_pidfd(test_name, pidfd);
> > + }
> > +
> > + time_t prog_time = time(NULL) - prog_start;
> > +
> > + ksft_print_msg("Time waited for child: %lu\n", prog_time);
> > +
> > + close(pidfd);
> > +
> > + if (prog_time < CHILD_THREAD_MIN_WAIT || prog_time > CHILD_THREAD_MIN_WAIT + 2)
> > + ksft_exit_fail_msg("%s test: Failed\n", test_name);
> > + else
> > + ksft_test_result_pass("%s test: Passed\n", test_name);
> > +}
> > +
> > +void *test_pidfd_poll_leader_exit_thread(void *priv)
> > +{
> > + char waittime[256];
> > +
> > + ksft_print_msg("Child Thread: starting. pid %d tid %d ; and sleeping\n",
> > + getpid(), syscall(SYS_gettid));
> > + sleep(CHILD_THREAD_MIN_WAIT);
> > + ksft_print_msg("Child Thread: DONE. pid %d tid %d\n", getpid(), syscall(SYS_gettid));
> > + return NULL;
> > +}
> > +
> > +static time_t *child_exit_secs;
> > +static int child_poll_leader_exit_test(void *args)
> > +{
> > + pthread_t t1, t2;
> > +
> > + ksft_print_msg("Child: starting. pid %d tid %d\n", getpid(), syscall(SYS_gettid));
> > + pthread_create(&t1, NULL, test_pidfd_poll_leader_exit_thread, NULL);
> > + pthread_create(&t2, NULL, test_pidfd_poll_leader_exit_thread, NULL);
> > +
> > + /*
> > + * glibc exit calls exit_group syscall, so explicity call exit only
> > + * so that only the group leader exits, leaving the threads alone.
> > + */
> > + *child_exit_secs = time(NULL);
> > + syscall(SYS_exit, 0);
> > +}
> > +
> > +int test_pidfd_poll_leader_exit(int use_waitpid)
> > +{
> > + int pid, pidfd = 0;
> > + int status, ret;
> > + time_t prog_start = time(NULL);
> > + const char *test_name = "pidfd_poll check for premature notification on non-empty"
> > + "group leader exit";
> > +
> > + child_exit_secs = mmap(NULL, sizeof *child_exit_secs, PROT_READ | PROT_WRITE,
> > + MAP_SHARED | MAP_ANONYMOUS, -1, 0);
> > +
> > + ksft_print_msg("Parent: pid: %d\n", getpid());
> > + pid = pidfd_clone(CLONE_PIDFD, &pidfd, child_poll_leader_exit_test);
>
> Same problem here, I think.
All comments address and fixed in the next revision, thanks!
- Joel
next prev parent reply other threads:[~2019-04-26 13:47 UTC|newest]
Thread overview: 85+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-04-25 19:00 [PATCH v1 1/2] Add polling support to pidfd joel
2019-04-25 19:00 ` Joel Fernandes (Google)
2019-04-25 19:00 ` Joel Fernandes (Google)
2019-04-25 19:00 ` [PATCH v1 2/2] Add selftests for pidfd polling joel
2019-04-25 19:00 ` Joel Fernandes (Google)
2019-04-25 19:00 ` Joel Fernandes (Google)
2019-04-25 20:00 ` tycho
2019-04-25 20:00 ` Tycho Andersen
2019-04-25 20:00 ` Tycho Andersen
2019-04-26 13:47 ` joel [this message]
2019-04-26 13:47 ` Joel Fernandes
2019-04-26 13:47 ` Joel Fernandes
2019-04-25 21:29 ` christian
2019-04-25 21:29 ` Christian Brauner
2019-04-25 21:29 ` Christian Brauner
2019-04-25 22:07 ` dancol
2019-04-25 22:07 ` Daniel Colascione
2019-04-25 22:07 ` Daniel Colascione
2019-04-26 17:26 ` joel
2019-04-26 17:26 ` Joel Fernandes
2019-04-26 17:26 ` Joel Fernandes
2019-04-26 19:35 ` dancol
2019-04-26 19:35 ` Daniel Colascione
2019-04-26 19:35 ` Daniel Colascione
2019-04-26 20:31 ` joel
2019-04-26 20:31 ` Joel Fernandes
2019-04-26 20:31 ` Joel Fernandes
2019-04-26 13:42 ` joel
2019-04-26 13:42 ` Joel Fernandes
2019-04-26 13:42 ` Joel Fernandes
2019-04-25 22:24 ` [PATCH v1 1/2] Add polling support to pidfd Christian Brauner
2019-04-25 22:24 ` Christian Brauner
2019-04-25 22:24 ` Christian Brauner
2019-04-25 22:24 ` christian
2019-04-26 14:23 ` Joel Fernandes
2019-04-26 14:23 ` Joel Fernandes
2019-04-26 14:23 ` Joel Fernandes
2019-04-26 14:23 ` joel
2019-04-26 15:21 ` Christian Brauner
2019-04-26 15:21 ` Christian Brauner
2019-04-26 15:21 ` Christian Brauner
2019-04-26 15:21 ` christian
2019-04-26 15:31 ` Christian Brauner
2019-04-26 15:31 ` Christian Brauner
2019-04-26 15:31 ` Christian Brauner
2019-04-26 15:31 ` christian
2019-04-28 16:24 ` Oleg Nesterov
2019-04-28 16:24 ` Oleg Nesterov
2019-04-28 16:24 ` Oleg Nesterov
2019-04-28 16:24 ` oleg
2019-04-29 14:02 ` Joel Fernandes
2019-04-29 14:02 ` Joel Fernandes
2019-04-29 14:02 ` Joel Fernandes
2019-04-29 14:02 ` joel
2019-04-29 14:07 ` Joel Fernandes
2019-04-29 14:07 ` Joel Fernandes
2019-04-29 14:07 ` Joel Fernandes
2019-04-29 14:07 ` joel
2019-04-29 14:25 ` Oleg Nesterov
2019-04-29 14:25 ` Oleg Nesterov
2019-04-29 14:25 ` Oleg Nesterov
2019-04-29 14:25 ` oleg
2019-04-29 14:20 ` Oleg Nesterov
2019-04-29 14:20 ` Oleg Nesterov
2019-04-29 14:20 ` Oleg Nesterov
2019-04-29 14:20 ` oleg
2019-04-29 16:32 ` Joel Fernandes
2019-04-29 16:32 ` Joel Fernandes
2019-04-29 16:32 ` Joel Fernandes
2019-04-29 16:32 ` joel
2019-04-30 11:53 ` Oleg Nesterov
2019-04-30 11:53 ` Oleg Nesterov
2019-04-30 11:53 ` Oleg Nesterov
2019-04-30 11:53 ` oleg
2019-04-30 12:07 ` Oleg Nesterov
2019-04-30 12:07 ` Oleg Nesterov
2019-04-30 12:07 ` Oleg Nesterov
2019-04-30 12:07 ` oleg
2019-04-30 15:49 ` Joel Fernandes
2019-04-30 15:49 ` Joel Fernandes
2019-04-30 15:49 ` Joel Fernandes
2019-04-30 15:49 ` joel
2019-04-26 14:58 ` christian
2019-04-26 14:58 ` Christian Brauner
2019-04-26 14:58 ` Christian Brauner
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=20190426134719.GB261279@google.com \
--to=unknown@example.com \
/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.