Blame test/shared-wq.c

Packit d3489f
/* SPDX-License-Identifier: MIT */
Packit d3489f
/*
Packit d3489f
 * Description: test wq sharing
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 test_attach_invalid(int ringfd)
Packit d3489f
{
Packit d3489f
	struct io_uring_params p;
Packit d3489f
	struct io_uring ring;
Packit d3489f
	int ret;
Packit d3489f
Packit d3489f
	memset(&p, 0, sizeof(p));
Packit d3489f
	p.flags = IORING_SETUP_ATTACH_WQ;
Packit d3489f
	p.wq_fd = ringfd;
Packit d3489f
	ret = io_uring_queue_init_params(1, &ring, &p);
Packit d3489f
	if (ret != -EINVAL) {
Packit d3489f
		fprintf(stderr, "Attach to zero: %d\n", ret);
Packit d3489f
		goto err;
Packit d3489f
	}
Packit d3489f
	return 0;
Packit d3489f
err:
Packit d3489f
	return 1;
Packit d3489f
}
Packit d3489f
Packit d3489f
static int test_attach(int ringfd)
Packit d3489f
{
Packit d3489f
	struct io_uring_params p;
Packit d3489f
	struct io_uring ring2;
Packit d3489f
	int ret;
Packit d3489f
Packit d3489f
	memset(&p, 0, sizeof(p));
Packit d3489f
	p.flags = IORING_SETUP_ATTACH_WQ;
Packit d3489f
	p.wq_fd = ringfd;
Packit d3489f
	ret = io_uring_queue_init_params(1, &ring2, &p);
Packit d3489f
	if (ret == -EINVAL) {
Packit d3489f
		fprintf(stdout, "Sharing not supported, skipping\n");
Packit d3489f
		return 0;
Packit d3489f
	} else if (ret) {
Packit d3489f
		fprintf(stderr, "Attach to id: %d\n", ret);
Packit d3489f
		goto err;
Packit d3489f
	}
Packit d3489f
	io_uring_queue_exit(&ring2;;
Packit d3489f
	return 0;
Packit d3489f
err:
Packit d3489f
	return 1;
Packit d3489f
}
Packit d3489f
Packit d3489f
int main(int argc, char *argv[])
Packit d3489f
{
Packit d3489f
	struct io_uring ring;
Packit d3489f
	int ret;
Packit d3489f
Packit d3489f
	if (argc > 1)
Packit d3489f
		return 0;
Packit d3489f
Packit d3489f
	ret = io_uring_queue_init(8, &ring, 0);
Packit d3489f
	if (ret) {
Packit d3489f
		fprintf(stderr, "ring setup failed\n");
Packit d3489f
		return 1;
Packit d3489f
	}
Packit d3489f
Packit d3489f
	/* stdout is definitely not an io_uring descriptor */
Packit d3489f
	ret = test_attach_invalid(2);
Packit d3489f
	if (ret) {
Packit d3489f
		fprintf(stderr, "test_attach_invalid failed\n");
Packit d3489f
		return ret;
Packit d3489f
	}
Packit d3489f
Packit d3489f
	ret = test_attach(ring.ring_fd);
Packit d3489f
	if (ret) {
Packit d3489f
		fprintf(stderr, "test_attach failed\n");
Packit d3489f
		return ret;
Packit d3489f
	}
Packit d3489f
Packit d3489f
	return 0;
Packit d3489f
}