test/poll: simply test case

Just setup one ring in the child process, and poll for when the
read side of the pipe is readable. From the parent, write something
to the pipe.

If nothing happens within 1 second, fail the test.

Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
Jens Axboe
2019-01-18 15:10:32 -07:00
parent d58ea1a0ea
commit a2fc9f13b5

View File

@@ -1,28 +1,34 @@
/* /*
* Description: test io_uring poll handling * Description: test io_uring poll handling
* *
* Based on 22.t from libaio
*/ */
#include <errno.h> #include <errno.h>
#include <stdio.h> #include <stdio.h>
#include <unistd.h> #include <unistd.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <signal.h>
#include <sys/poll.h> #include <sys/poll.h>
#include <sys/wait.h> #include <sys/wait.h>
#include "../src/liburing.h" #include "../src/liburing.h"
static void sig_alrm(int sig)
{
printf("Timed out!\n");
exit(1);
}
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
pid_t parent = getpid(), p; pid_t parent = getpid(), p;
int pipe1[2], pipe2[2];
struct io_uring cring, pring;
struct io_uring_cqe *cqe; struct io_uring_cqe *cqe;
struct io_uring_sqe *sqe; struct io_uring_sqe *sqe;
struct io_uring ring;
int pipe1[2];
int ret; int ret;
if (pipe(pipe1) != 0 || pipe(pipe2) != 0) { if (pipe(pipe1) != 0) {
printf("pipe failed\n"); printf("pipe failed\n");
return 1; return 1;
} }
@@ -32,25 +38,31 @@ int main(int argc, char *argv[])
case -1: case -1:
printf("fork failed\n"); printf("fork failed\n");
exit(2); exit(2);
case 0: case 0: {
close(pipe1[1]); struct sigaction act;
close(pipe2[0]);
ret = io_uring_queue_init(1, &cring, 0); ret = io_uring_queue_init(1, &ring, 0);
if (ret) { if (ret) {
printf("child: ring setup failed\n"); printf("child: ring setup failed\n");
return 1; return 1;
} }
sqe = io_uring_get_sqe(&cring); memset(&act, 0, sizeof(act));
act.sa_handler = sig_alrm;
act.sa_flags = SA_RESTART;
sigaction(SIGALRM, &act, NULL);
alarm(1);
sqe = io_uring_get_sqe(&ring);
if (!sqe) { if (!sqe) {
printf("child: get sqe failed\n"); printf("child: get sqe failed\n");
return 1; return 1;
} }
io_uring_prep_poll_add(sqe, pipe1[0], POLLIN); io_uring_prep_poll_add(sqe, pipe1[0], POLLIN);
io_uring_sqe_set_data(sqe, sqe);
ret = io_uring_submit(&cring); ret = io_uring_submit(&ring);
if (ret <= 0) { if (ret <= 0) {
printf("child: sqe submit failed\n"); printf("child: sqe submit failed\n");
return 1; return 1;
@@ -61,61 +73,33 @@ int main(int argc, char *argv[])
printf("parent died\n"); printf("parent died\n");
exit(2); exit(2);
} }
ret = io_uring_wait_completion(&cring, &cqe); ret = io_uring_wait_completion(&ring, &cqe);
} while (ret != 0); } while (ret != 0);
if (ret < 0) { if (ret < 0) {
printf("child: completion get failed\n"); printf("child: completion get failed\n");
return 1; 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]);
ret = io_uring_queue_init(1, &pring, 0);
if (ret) {
printf("parent: ring setup failed\n");
return 1;
}
sqe = io_uring_get_sqe(&pring);
if (!sqe) {
printf("parent: get sqe failed\n");
return 1;
}
io_uring_prep_poll_add(sqe, pipe2[0], POLLIN);
io_uring_sqe_set_data(sqe, sqe);
ret = io_uring_submit(&pring);
if (ret <= 0) {
printf("parent: sqe submit failed\n");
return 1;
}
kill(p, SIGUSR1);
ret = io_uring_wait_completion(&pring, &cqe);
if (ret < 0) {
printf("parent: cqe get failed\n");
return 1;
}
if (cqe->user_data != (unsigned long) sqe) { if (cqe->user_data != (unsigned long) sqe) {
printf("parent: cqe wrong fd\n"); printf("child: cqe doesn't match sqe\n");
return 1; return 1;
} }
if ((cqe->res & POLLIN) != POLLIN) { if ((cqe->res & POLLIN) != POLLIN) {
printf("parent: cqe did not report readable fd\n"); printf("child: bad return value %ld\n", (long) cqe->res);
return 1; return 1;
} }
exit(0);
}
default:
do {
errno = 0;
ret = write(pipe1[1], "foo", 3);
} while (ret == -1 && errno == EINTR);
if (ret != 3) {
printf("parent: bad write return %d\n", ret);
return 1;
}
return 0; return 0;
} }
} }