From mboxrd@z Thu Jan 1 00:00:00 1970 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753220AbeADID4 (ORCPT + 1 other); Thu, 4 Jan 2018 03:03:56 -0500 Received: from bombadil.infradead.org ([65.50.211.133]:32941 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753200AbeADIDx (ORCPT ); Thu, 4 Jan 2018 03:03:53 -0500 From: Christoph Hellwig To: linux-aio@kvack.org Cc: Avi Kivity , linux-fsdevel@vger.kernel.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 6/6] add test for aio poll and io_pgetevents Date: Thu, 4 Jan 2018 09:03:25 +0100 Message-Id: <20180104080325.14716-7-hch@lst.de> X-Mailer: git-send-email 2.14.2 In-Reply-To: <20180104080325.14716-1-hch@lst.de> References: <20180104080325.14716-1-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Return-Path: Signed-off-by: Christoph Hellwig --- harness/cases/22.t | 149 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 149 insertions(+) create mode 100644 harness/cases/22.t diff --git a/harness/cases/22.t b/harness/cases/22.t new file mode 100644 index 0000000..a9fec6b --- /dev/null +++ b/harness/cases/22.t @@ -0,0 +1,149 @@ +/* + * Copyright (C) 2006-2018 Free Software Foundation, Inc. + * Copyright (C) 2018 Christoph Hellwig. + * License: LGPLv2.1 or later. + * + * Description: test aio poll and io_pgetevents signal handling. + * + * Very roughly based on glibc tst-pselect.c. + */ +#include +#include +#include +#include +#include +#include +#include + +static volatile int handler_called; + +static void +handler(int sig) +{ + handler_called = 1; +} + +int test_main(void) +{ + struct timespec to = { .tv_sec = 0, .tv_nsec = 500000000 }; + pid_t parent = getpid(), p; + int pipe1[2], pipe2[2]; + struct sigaction sa = { .sa_flags = 0 }; + sigset_t sigmask; + struct io_context *ctx = NULL; + struct io_event ev; + struct iocb iocb; + struct iocb *iocbs[] = { &iocb }; + int ret; + + sigemptyset(&sa.sa_mask); + + sa.sa_handler = handler; + if (sigaction(SIGUSR1, &sa, NULL) != 0) { + printf("sigaction(1) failed\n"); + return 1; + } + + sa.sa_handler = SIG_IGN; + if (sigaction(SIGCHLD, &sa, NULL) != 0) { + printf("sigaction(2) failed\n"); + return 1; + } + + sigemptyset(&sigmask); + sigaddset(&sigmask, SIGUSR1); + if (sigprocmask(SIG_BLOCK, &sigmask, NULL) != 0) { + printf("sigprocmask failed\n"); + return 1; + } + + if (pipe(pipe1) != 0 || pipe(pipe2) != 0) { + printf("pipe failed\n"); + return 1; + } + + sigprocmask(SIG_SETMASK, NULL, &sigmask); + sigdelset(&sigmask, SIGUSR1); + + p = fork(); + switch (p) { + case -1: + printf("fork failed\n"); + exit(2); + case 0: + close(pipe1[1]); + close(pipe2[0]); + + ret = io_setup(1, &ctx); + if (ret) { + printf("child: io_setup failed\n"); + return 1; + } + + io_prep_poll(&iocb, pipe1[0], POLLIN); + ret = io_submit(ctx, 1, iocbs); + if (ret != 1) { + printf("child: io_submit failed\n"); + return 1; + } + + do { + if (getppid() != parent) { + printf("parent died\n"); + exit(2); + } + ret = io_pgetevents(ctx, 1, 1, &ev, &to, &sigmask); + } while (ret == 0); + + if (ret != -EINTR) { + printf("child: io_pgetevents did not set errno to EINTR\n"); + return 1; + } + + do { + errno = 0; + ret = write(pipe2[1], "foo", 3); + } while (ret == -1 && errno == EINTR); + + exit(0); + default: + close(pipe1[0]); + close(pipe2[1]); + + io_prep_poll(&iocb, pipe2[0], POLLIN); + + ret = io_setup(1, &ctx); + if (ret) { + printf("child: io_setup failed\n"); + return 1; + } + + ret = io_submit(ctx, 1, iocbs); + if (ret != 1) { + printf("child: io_submit failed\n"); + return 1; + } + + kill(p, SIGUSR1); + + ret = io_pgetevents(ctx, 1, 1, &ev, NULL, &sigmask); + if (ret < 0) { + printf("parent: io_pgetevents failed\n"); + return 1; + } + if (ret != 1) { + printf("parent: io_pgetevents did not report event\n"); + return 1; + } + if (ev.obj != &iocb) { + printf("parent: io_pgetevents reports wrong fd\n"); + return 1; + } + if (ev.res != POLLIN) { + printf("parent: io_pgetevents did not report readable fd\n"); + return 1; + } + + return 0; + } +} -- 2.14.2