Blame test/cq-ready.c

Packit d3489f
/* SPDX-License-Identifier: MIT */
Packit d3489f
/*
Packit d3489f
 * Description: test CQ ready
Packit d3489f
 *
Packit d3489f
 */
Packit d3489f
#include <errno.h>
Packit d3489f
#include <stdio.h>
Packit d3489f
#include <unistd.h>
Packit d3489f
#include <stdlib.h>
Packit d3489f
#include <string.h>
Packit d3489f
#include <fcntl.h>
Packit d3489f
Packit d3489f
#include "liburing.h"
Packit d3489f
Packit d3489f
static int queue_n_nops(struct io_uring *ring, int n)
Packit d3489f
{
Packit d3489f
	struct io_uring_sqe *sqe;
Packit d3489f
	int i, ret;
Packit d3489f
Packit d3489f
	for (i = 0; i < n; i++) {
Packit d3489f
		sqe = io_uring_get_sqe(ring);
Packit d3489f
		if (!sqe) {
Packit d3489f
			printf("get sqe failed\n");
Packit d3489f
			goto err;
Packit d3489f
		}
Packit d3489f
Packit d3489f
		io_uring_prep_nop(sqe);
Packit d3489f
	}
Packit d3489f
Packit d3489f
	ret = io_uring_submit(ring);
Packit d3489f
	if (ret < n) {
Packit d3489f
		printf("Submitted only %d\n", ret);
Packit d3489f
		goto err;
Packit d3489f
	} else if (ret < 0) {
Packit d3489f
		printf("sqe submit failed: %d\n", ret);
Packit d3489f
		goto err;
Packit d3489f
	}
Packit d3489f
Packit d3489f
	return 0;
Packit d3489f
err:
Packit d3489f
	return 1;
Packit d3489f
}
Packit d3489f
Packit d3489f
#define CHECK_READY(ring, expected) do {\
Packit d3489f
	ready = io_uring_cq_ready((ring));\
Packit d3489f
	if (ready != expected) {\
Packit d3489f
		printf("Got %d CQs ready, expected %d\n", ready, expected);\
Packit d3489f
		goto err;\
Packit d3489f
	}\
Packit d3489f
} while(0)
Packit d3489f
Packit d3489f
int main(int argc, char *argv[])
Packit d3489f
{
Packit d3489f
	struct io_uring ring;
Packit d3489f
	int ret;
Packit d3489f
	unsigned ready;
Packit d3489f
Packit d3489f
	if (argc > 1)
Packit d3489f
		return 0;
Packit d3489f
Packit d3489f
	ret = io_uring_queue_init(4, &ring, 0);
Packit d3489f
	if (ret) {
Packit d3489f
		printf("ring setup failed\n");
Packit d3489f
		return 1;
Packit d3489f
Packit d3489f
	}
Packit d3489f
Packit d3489f
	CHECK_READY(&ring, 0);
Packit d3489f
	if (queue_n_nops(&ring, 4))
Packit d3489f
		goto err;
Packit d3489f
Packit d3489f
	CHECK_READY(&ring, 4);
Packit d3489f
	io_uring_cq_advance(&ring, 4);
Packit d3489f
	CHECK_READY(&ring, 0);
Packit d3489f
	if (queue_n_nops(&ring, 4))
Packit d3489f
		goto err;
Packit d3489f
Packit d3489f
	CHECK_READY(&ring, 4);
Packit d3489f
Packit d3489f
	io_uring_cq_advance(&ring, 1);
Packit d3489f
	CHECK_READY(&ring, 3);
Packit d3489f
Packit d3489f
	io_uring_cq_advance(&ring, 2);
Packit d3489f
	CHECK_READY(&ring, 1);
Packit d3489f
Packit d3489f
	io_uring_cq_advance(&ring, 1);
Packit d3489f
	CHECK_READY(&ring, 0);
Packit d3489f
Packit d3489f
	io_uring_queue_exit(&ring);
Packit d3489f
	return 0;
Packit d3489f
err:
Packit d3489f
	io_uring_queue_exit(&ring);
Packit d3489f
	return 1;
Packit d3489f
}