[CRIU] [PATCH 2/2] zdtm: Tech that pdeath_sig is preserved

Filipe Brandenburger filbranden at google.com
Fri Jun 27 08:35:40 PDT 2014


Hi Pavel,

Please make sure you also update the zdtm .gitignore to include the
binary built by this test case.

Cheers,
Filipe


On Fri, Jun 27, 2014 at 8:27 AM, Pavel Emelyanov <xemul at parallels.com> wrote:
> Signed-off-by: Pavel Emelyanov <xemul at parallels.com>
> ---
>  test/zdtm.sh                       |   1 +
>  test/zdtm/live/static/Makefile     |   1 +
>  test/zdtm/live/static/pdeath_sig.c | 109 +++++++++++++++++++++++++++++++++++++
>  3 files changed, 111 insertions(+)
>  create mode 100644 test/zdtm/live/static/pdeath_sig.c
>
> diff --git a/test/zdtm.sh b/test/zdtm.sh
> index 6c5f19d..4532255 100755
> --- a/test/zdtm.sh
> +++ b/test/zdtm.sh
> @@ -101,6 +101,7 @@ static/fpu01
>  static/mmx00
>  static/sse00
>  static/sse20
> +static/pdeath_sig
>  static/fdt_shared
>  static/file_locks00
>  static/file_locks01
> diff --git a/test/zdtm/live/static/Makefile b/test/zdtm/live/static/Makefile
> index 7dad8e6..f41fd80 100644
> --- a/test/zdtm/live/static/Makefile
> +++ b/test/zdtm/live/static/Makefile
> @@ -71,6 +71,7 @@ TST_NOFILE    =                               \
>                 maps05                          \
>                 xids00                          \
>                 groups                          \
> +               pdeath_sig                      \
>                 file_fown                       \
>                 proc-self                       \
>                 eventfs00                       \
> diff --git a/test/zdtm/live/static/pdeath_sig.c b/test/zdtm/live/static/pdeath_sig.c
> new file mode 100644
> index 0000000..4f2292a
> --- /dev/null
> +++ b/test/zdtm/live/static/pdeath_sig.c
> @@ -0,0 +1,109 @@
> +#include <unistd.h>
> +#include <errno.h>
> +#include <stdlib.h>
> +#include <string.h>
> +#include <signal.h>
> +#include <sys/prctl.h>
> +#include <sys/wait.h>
> +
> +#include "zdtmtst.h"
> +
> +const char *test_doc   = "Check that pdeath sig is preserved";
> +const char *test_author        = "Pavel Emelianov <xemul at parallels.com>";
> +
> +static int sigrecvd = 0;
> +static void sigh(int s, siginfo_t *i, void *d)
> +{
> +       sigrecvd = 1;
> +}
> +
> +#ifndef PR_SET_PDEATH_SIGNAL
> +#define PR_SET_PDEATH_SIGNAL 1
> +#endif
> +
> +int main(int argc, char **argv)
> +{
> +       int pid, ret, pw[2], pr[2];
> +
> +       test_init(argc, argv);
> +
> +       /*
> +        * Here's what will happen here:
> +        *
> +        *    me -(fork)-> P -(fork)-> C
> +        *     |                       |
> +        *     +-------------->-(pw)->-+
> +        *     +-<-(pr)-<--------------+
> +        *
> +        * We wait for C to prepare himself via pr.
> +        * After C/R we kill P and close pw to wake up
> +        * C. The we wait for it to report back via pr
> +        * which signals has he received.
> +        */
> +
> +       pipe(pw);
> +       pipe(pr);
> +
> +       pid = fork();
> +       if (pid == 0) {
> +               pid = fork();
> +               if (pid == 0) {
> +                       struct sigaction sa = {};
> +                       /* C */
> +                       close(pw[1]);
> +                       close(pr[0]);
> +                       sa.sa_sigaction = sigh;
> +                       ret = sigaction(SIGUSR1, &sa, NULL);
> +                       if (ret == 0)
> +                               ret = prctl(PR_SET_PDEATH_SIGNAL, SIGUSR1, 0, 0, 0);
> +                       write(pr[1], &ret, sizeof(ret));
> +                       read(pw[0], &ret, sizeof(ret));
> +                       write(pr[1], &sigrecvd, sizeof(sigrecvd));
> +               } else {
> +                       /* P, pid == C */
> +                       close(pw[0]);
> +                       close(pw[1]);
> +                       close(pr[0]);
> +                       close(pr[1]);
> +
> +                       /* Just hang */
> +                       waitpid(pid, NULL, 0);
> +               }
> +
> +               exit(0);
> +       }
> +
> +       /* me, pid == P */
> +       close(pw[0]);
> +       close(pr[1]);
> +
> +       ret = -1;
> +       read(pr[0], &ret, sizeof(ret));
> +       if (ret != 0) {
> +               err("C start error\n");
> +               goto out;
> +       }
> +
> +       /*
> +        * P didn't have time to close his pipes?
> +        * That's OK, CRIU should C/R these knots.
> +        */
> +
> +       test_daemon();
> +       test_waitsig();
> +
> +out:
> +       kill(pid, SIGKILL);
> +       waitpid(pid, NULL, 0);
> +       close(pw[1]);
> +
> +       if (ret == 0) {
> +               read(pr[0], &ret, sizeof(ret));
> +               if (ret != 1)
> +                       fail("USR1 isn't delivered");
> +               else
> +                       pass();
> +       }
> +
> +       return 0;
> +}
> --
> 1.8.4.2
>
>
> _______________________________________________
> CRIU mailing list
> CRIU at openvz.org
> https://lists.openvz.org/mailman/listinfo/criu


More information about the CRIU mailing list