diff options
author | Jens Axboe <axboe@kernel.dk> | 2020-02-29 12:11:21 -0700 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2020-02-29 12:11:21 -0700 |
commit | 00469d8d393d6c0783a0b29ce6f86b5b9ae620e1 (patch) | |
tree | 9cffe917508f6e4fc4a0396468de7303ef0bb6b8 /test | |
parent | 66b3760a93d5c7b93a05c99adfd557fc1d7a46b0 (diff) | |
download | liburing-00469d8d393d6c0783a0b29ce6f86b5b9ae620e1.tar.gz liburing-00469d8d393d6c0783a0b29ce6f86b5b9ae620e1.tar.bz2 |
test/send_recvmsg: ensure that we get -ENOBUFS for no buffers
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'test')
-rw-r--r-- | test/send_recvmsg.c | 41 |
1 files changed, 29 insertions, 12 deletions
diff --git a/test/send_recvmsg.c b/test/send_recvmsg.c index 8092947..e89e638 100644 --- a/test/send_recvmsg.c +++ b/test/send_recvmsg.c @@ -80,12 +80,21 @@ err: return 1; } -static int do_recvmsg(struct io_uring *ring, struct iovec *iov) +struct recv_data { + pthread_mutex_t *mutex; + int buf_select; + int no_buf_add; +}; + +static int do_recvmsg(struct io_uring *ring, struct iovec *iov, + struct recv_data *rd) { struct io_uring_cqe *cqe; io_uring_wait_cqe(ring, &cqe); if (cqe->res < 0) { + if (rd->no_buf_add && rd->buf_select) + return 0; fprintf(stderr, "%s: failed cqe: %d\n", __FUNCTION__, cqe->res); goto err; } @@ -97,6 +106,11 @@ static int do_recvmsg(struct io_uring *ring, struct iovec *iov) iov->iov_base = (void *) cqe->user_data; } + if (rd->no_buf_add && rd->buf_select) { + fprintf(stderr, "Expected -ENOBUFS: %d\n", cqe->res); + goto err; + } + if (cqe->res -1 != strlen(str)) { fprintf(stderr, "got wrong length: %d/%d\n", cqe->res, (int) strlen(str) + 1); @@ -113,11 +127,6 @@ err: return 1; } -struct recv_data { - pthread_mutex_t *mutex; - int buf_select; -}; - static void *recv_fn(void *data) { struct recv_data *rd = data; @@ -138,7 +147,7 @@ static void *recv_fn(void *data) goto err; } - if (rd->buf_select) { + if (rd->buf_select && !rd->no_buf_add) { sqe = io_uring_get_sqe(&ring); io_uring_prep_provide_buffers(sqe, buf, sizeof(buf) -1, 1, BUF_GID, BUF_BID); @@ -168,7 +177,7 @@ static void *recv_fn(void *data) } pthread_mutex_unlock(mutex); - ret = do_recvmsg(&ring, &iov); + ret = do_recvmsg(&ring, &iov, rd); io_uring_queue_exit(&ring); @@ -234,7 +243,7 @@ err: return 1; } -static int test(int buf_select) +static int test(int buf_select, int no_buf_add) { struct recv_data rd; pthread_mutexattr_t attr; @@ -250,6 +259,7 @@ static int test(int buf_select) rd.mutex = &mutex; rd.buf_select = buf_select; + rd.no_buf_add = no_buf_add; ret = pthread_create(&recv_thread, NULL, recv_fn, &rd); if (ret) { fprintf(stderr, "Thread create failed\n"); @@ -268,17 +278,24 @@ int main(int argc, char *argv[]) { int ret; - ret = test(0); + ret = test(0, 0); if (ret) { fprintf(stderr, "send_recvmsg 0 failed\n"); return 1; } - ret = test(1); + ret = test(1, 0); if (ret) { - fprintf(stderr, "send_recvmsg 1 failed\n"); + fprintf(stderr, "send_recvmsg 1 0 failed\n"); return 1; } + ret = test(1, 1); + if (ret) { + fprintf(stderr, "send_recvmsg 1 1 failed\n"); + return 1; + } + + return 0; } |