Skip to content

Commit

Permalink
Add test case for missing local task_work run
Browse files Browse the repository at this point in the history
Signed-off-by: Jens Axboe <axboe@kernel.dk>
  • Loading branch information
axboe committed Jan 4, 2024
1 parent 01723bf commit acf8c31
Show file tree
Hide file tree
Showing 2 changed files with 90 additions and 0 deletions.
1 change: 1 addition & 0 deletions test/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ test_srcs := \
d77a67ed5f27.c \
defer.c \
defer-taskrun.c \
defer-tw-timeout.c \
double-poll-crash.c \
drop-submit.c \
eeed8b54e0df.c \
Expand Down
89 changes: 89 additions & 0 deletions test/defer-tw-timeout.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
/* SPDX-License-Identifier: MIT */
/*
* Description: test waiting for more events than what will be posted with
* a timeout with DEFER_TASKRUN. All kernels should time out,
* but a non-buggy kernel will end up with one CQE available
* for reaping. Buggy kernels will not have processed the
* task_work and will have 0 events.
*
*/
#include <errno.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>

#include "liburing.h"
#include "helpers.h"

struct d {
int fd;
};

static void *thread_fn(void *data)
{
struct d *d = data;
int ret;

usleep(100000);
ret = write(d->fd, "Hello", 5);
if (ret < 0)
perror("write");
return NULL;
}

int main(int argc, char *argv[])
{
struct io_uring_cqe *cqe;
struct io_uring_sqe *sqe;
struct io_uring ring;
struct __kernel_timespec ts;
int ret, fds[2], i;
pthread_t thread;
char buf[32];
struct d d;
void *tret;

if (argc > 1)
return T_EXIT_SKIP;

if (pipe(fds) < 0) {
perror("pipe");
return 1;
}
d.fd = fds[1];

ret = io_uring_queue_init(2, &ring, IORING_SETUP_SINGLE_ISSUER | IORING_SETUP_DEFER_TASKRUN);
if (ret == -EINVAL)
return T_EXIT_SKIP;

sqe = io_uring_get_sqe(&ring);
io_uring_prep_read(sqe, fds[0], buf, sizeof(buf), 0);

pthread_create(&thread, NULL, thread_fn, &d);

ts.tv_sec = 1;
ts.tv_nsec = 0;

ret = io_uring_submit_and_wait_timeout(&ring, &cqe, 2, &ts, NULL);
if (ret != 1) {
fprintf(stderr, "unexpected wait ret %d\n", ret);
return T_EXIT_FAIL;
}

for (i = 0; i < 2; i++) {
ret = io_uring_peek_cqe(&ring, &cqe);
if (ret)
break;
io_uring_cqe_seen(&ring, cqe);
}

if (i != 1) {
fprintf(stderr, "Got %d request, expected 1\n", i);
return T_EXIT_FAIL;
}

pthread_join(thread, &tret);
return T_EXIT_PASS;
}

0 comments on commit acf8c31

Please sign in to comment.