Merge branch 'issue25'
* issue25:
Add test case for commit 7ad0e4b2f83c
Fix flush/submit with internal timeout
Fixes: https://github.com/axboe/liburing/issues/25
Signed-off-by: Jens Axboe <axboe@kernel.dk>
diff --git a/src/include/liburing.h b/src/include/liburing.h
index 7ee7b28..2923fce 100644
--- a/src/include/liburing.h
+++ b/src/include/liburing.h
@@ -61,15 +61,6 @@
};
/*
- * System calls
- */
-extern int io_uring_setup(unsigned entries, struct io_uring_params *p);
-extern int io_uring_enter(unsigned fd, unsigned to_submit,
- unsigned min_complete, unsigned flags, sigset_t *sig);
-extern int io_uring_register(int fd, unsigned int opcode, const void *arg,
- unsigned int nr_args);
-
-/*
* Library interface
*/
extern int io_uring_queue_init_params(unsigned entries, struct io_uring *ring,
diff --git a/src/liburing.map b/src/liburing.map
index 2c071d6..8f89e20 100644
--- a/src/liburing.map
+++ b/src/liburing.map
@@ -20,7 +20,6 @@
io_uring_unregister_eventfd;
local:
*;
-
};
LIBURING_0.2 {
@@ -34,3 +33,39 @@
io_uring_queue_init_params;
io_uring_register_files_update;
} LIBURING_0.1;
+
+LIBURING_0.3 {
+ global:
+ io_uring_queue_init;
+ io_uring_queue_mmap;
+ io_uring_queue_exit;
+ io_uring_peek_cqe;
+ io_uring_wait_cqe;
+ io_uring_submit;
+ io_uring_submit_and_wait;
+ io_uring_get_sqe;
+ io_uring_register;
+ io_uring_setup;
+ io_uring_enter;
+ io_uring_mmap;
+ io_uring_register_buffers;
+ io_uring_unregister_buffers;
+ io_uring_register_files;
+ io_uring_unregister_files;
+ io_uring_register_eventfd;
+ io_uring_unregister_eventfd;
+
+ io_uring_peek_batch_cqe;
+ io_uring_wait_cqe_timeout;
+ io_uring_wait_cqes;
+
+ __io_uring_get_cqe;
+
+ io_uring_queue_init_params;
+ io_uring_register_files_update;
+ local:
+ __sys_io_uring_setup;
+ __sys_io_uring_enter;
+ __sys_io_uring_register;
+ *;
+};
diff --git a/src/queue.c b/src/queue.c
index 6a96594..77d5b12 100644
--- a/src/queue.c
+++ b/src/queue.c
@@ -11,6 +11,8 @@
#include "liburing.h"
#include "liburing/barrier.h"
+#include "syscall.h"
+
/*
* Returns true if we're not using SQ thread (thus nobody submits but us)
* or if IORING_SQ_NEED_WAKEUP is set, so submit thread must be explicitly
@@ -48,8 +50,8 @@
if (submit)
sq_ring_needs_enter(ring, &flags);
if (wait_nr || submit)
- ret = io_uring_enter(ring->ring_fd, submit, wait_nr,
- flags, sigmask);
+ ret = __sys_io_uring_enter(ring->ring_fd, submit,
+ wait_nr, flags, sigmask);
if (ret < 0)
err = -errno;
submit -= ret;
@@ -190,8 +192,8 @@
if (wait_nr)
flags |= IORING_ENTER_GETEVENTS;
- ret = io_uring_enter(ring->ring_fd, submitted, wait_nr, flags,
- NULL);
+ ret = __sys_io_uring_enter(ring->ring_fd, submitted, wait_nr,
+ flags, NULL);
if (ret < 0)
return -errno;
} else
diff --git a/src/register.c b/src/register.c
index 858f787..a8ec27a 100644
--- a/src/register.c
+++ b/src/register.c
@@ -9,13 +9,15 @@
#include "liburing/io_uring.h"
#include "liburing.h"
+#include "syscall.h"
+
int io_uring_register_buffers(struct io_uring *ring, const struct iovec *iovecs,
unsigned nr_iovecs)
{
int ret;
- ret = io_uring_register(ring->ring_fd, IORING_REGISTER_BUFFERS,
- iovecs, nr_iovecs);
+ ret = __sys_io_uring_register(ring->ring_fd, IORING_REGISTER_BUFFERS,
+ iovecs, nr_iovecs);
if (ret < 0)
return -errno;
@@ -26,8 +28,8 @@
{
int ret;
- ret = io_uring_register(ring->ring_fd, IORING_UNREGISTER_BUFFERS, NULL,
- 0);
+ ret = __sys_io_uring_register(ring->ring_fd, IORING_UNREGISTER_BUFFERS,
+ NULL, 0);
if (ret < 0)
return -errno;
@@ -50,8 +52,9 @@
};
int ret;
- ret = io_uring_register(ring->ring_fd, IORING_REGISTER_FILES_UPDATE,
- &up, nr_files);
+ ret = __sys_io_uring_register(ring->ring_fd,
+ IORING_REGISTER_FILES_UPDATE, &up,
+ nr_files);
if (ret < 0)
return -errno;
@@ -63,8 +66,8 @@
{
int ret;
- ret = io_uring_register(ring->ring_fd, IORING_REGISTER_FILES, files,
- nr_files);
+ ret = __sys_io_uring_register(ring->ring_fd, IORING_REGISTER_FILES,
+ files, nr_files);
if (ret < 0)
return -errno;
@@ -75,8 +78,8 @@
{
int ret;
- ret = io_uring_register(ring->ring_fd, IORING_UNREGISTER_FILES, NULL,
- 0);
+ ret = __sys_io_uring_register(ring->ring_fd, IORING_UNREGISTER_FILES,
+ NULL, 0);
if (ret < 0)
return -errno;
@@ -87,8 +90,8 @@
{
int ret;
- ret = io_uring_register(ring->ring_fd, IORING_REGISTER_EVENTFD,
- &event_fd, 1);
+ ret = __sys_io_uring_register(ring->ring_fd, IORING_REGISTER_EVENTFD,
+ &event_fd, 1);
if (ret < 0)
return -errno;
@@ -99,8 +102,8 @@
{
int ret;
- ret = io_uring_register(ring->ring_fd, IORING_UNREGISTER_EVENTFD, NULL,
- 0);
+ ret = __sys_io_uring_register(ring->ring_fd, IORING_UNREGISTER_EVENTFD,
+ NULL, 0);
if (ret < 0)
return -errno;
diff --git a/src/setup.c b/src/setup.c
index a52071b..550c0de 100644
--- a/src/setup.c
+++ b/src/setup.c
@@ -9,6 +9,8 @@
#include "liburing/io_uring.h"
#include "liburing.h"
+#include "syscall.h"
+
static void io_uring_unmap_rings(struct io_uring_sq *sq, struct io_uring_cq *cq)
{
munmap(sq->ring_ptr, sq->ring_sz);
@@ -99,7 +101,7 @@
{
int fd, ret;
- fd = io_uring_setup(entries, p);
+ fd = __sys_io_uring_setup(entries, p);
if (fd < 0)
return -errno;
diff --git a/src/syscall.c b/src/syscall.c
index 3fd8713..3bb5575 100644
--- a/src/syscall.c
+++ b/src/syscall.c
@@ -7,6 +7,7 @@
#include <signal.h>
#include "liburing/compat.h"
#include "liburing/io_uring.h"
+#include "syscall.h"
#ifdef __alpha__
/*
@@ -34,19 +35,19 @@
# endif
#endif
-int io_uring_register(int fd, unsigned int opcode, const void *arg,
- unsigned int nr_args)
+int __sys_io_uring_register(int fd, unsigned opcode, const void *arg,
+ unsigned nr_args)
{
return syscall(__NR_io_uring_register, fd, opcode, arg, nr_args);
}
-int io_uring_setup(unsigned int entries, struct io_uring_params *p)
+int __sys_io_uring_setup(unsigned entries, struct io_uring_params *p)
{
return syscall(__NR_io_uring_setup, entries, p);
}
-int io_uring_enter(int fd, unsigned int to_submit, unsigned int min_complete,
- unsigned int flags, sigset_t *sig)
+int __sys_io_uring_enter(int fd, unsigned to_submit, unsigned min_complete,
+ unsigned flags, sigset_t *sig)
{
return syscall(__NR_io_uring_enter, fd, to_submit, min_complete,
flags, sig, _NSIG / 8);
diff --git a/src/syscall.h b/src/syscall.h
new file mode 100644
index 0000000..7d56224
--- /dev/null
+++ b/src/syscall.h
@@ -0,0 +1,13 @@
+#ifndef LIBURING_SYSCALL_H
+#define LIBURING_SYSCALL_H
+
+/*
+ * System calls
+ */
+extern int __sys_io_uring_setup(unsigned entries, struct io_uring_params *p);
+extern int __sys_io_uring_enter(int fd, unsigned to_submit,
+ unsigned min_complete, unsigned flags, sigset_t *sig);
+extern int __sys_io_uring_register(int fd, unsigned int opcode, const void *arg,
+ unsigned int nr_args);
+
+#endif
diff --git a/test/io_uring_enter.c b/test/io_uring_enter.c
index 578185f..65beca6 100644
--- a/test/io_uring_enter.c
+++ b/test/io_uring_enter.c
@@ -24,6 +24,7 @@
#include <sys/time.h>
#include "liburing.h"
#include "liburing/barrier.h"
+#include "../src/syscall.h"
#define IORING_MAX_ENTRIES 4096
@@ -52,7 +53,7 @@
{
int ret;
- ret = io_uring_enter(fd, to_submit, min_complete, flags, sig);
+ ret = __sys_io_uring_enter(fd, to_submit, min_complete, flags, sig);
if (ret != -1) {
printf("expected %s, but call succeeded\n", strerror(error));
return 1;
@@ -79,7 +80,7 @@
return expect_fail(fd, to_submit, min_complete,
flags, sig, error);
- ret = io_uring_enter(fd, to_submit, min_complete, flags, sig);
+ ret = __sys_io_uring_enter(fd, to_submit, min_complete, flags, sig);
if (ret != expect) {
printf("Expected %d, got %d\n", expect, errno);
return 1;
@@ -233,8 +234,8 @@
sq_entries = *ring.sq.kring_entries;
submit_io(&ring, sq_entries);
printf("Waiting for %u events\n", sq_entries);
- ret = io_uring_enter(ring.ring_fd, 0, sq_entries,
- IORING_ENTER_GETEVENTS, NULL);
+ ret = __sys_io_uring_enter(ring.ring_fd, 0, sq_entries,
+ IORING_ENTER_GETEVENTS, NULL);
if (ret < 0) {
perror("io_uring_enter");
status = 1;
@@ -269,7 +270,7 @@
*/
io_uring_smp_store_release(sq->ktail, ktail);
- ret = io_uring_enter(ring.ring_fd, 1, 0, 0, NULL);
+ ret = __sys_io_uring_enter(ring.ring_fd, 1, 0, 0, NULL);
/* now check to see if our sqe was dropped */
if (*sq->kdropped == dropped) {
printf("dropped counter did not increase\n");
diff --git a/test/io_uring_register.c b/test/io_uring_register.c
index 59c8a86..fe6b3e0 100644
--- a/test/io_uring_register.c
+++ b/test/io_uring_register.c
@@ -22,6 +22,7 @@
#include <sys/resource.h>
#include <limits.h>
#include "liburing.h"
+#include "../src/syscall.h"
static int pagesize;
static rlim_t mlock_limit;
@@ -35,17 +36,17 @@
printf("io_uring_register(%d, %u, %p, %u)\n",
fd, opcode, arg, nr_args);
- ret = io_uring_register(fd, opcode, arg, nr_args);
+ ret = __sys_io_uring_register(fd, opcode, arg, nr_args);
if (ret != -1) {
int ret2 = 0;
printf("expected %s, but call succeeded\n", strerror(error));
if (opcode == IORING_REGISTER_BUFFERS) {
- ret2 = io_uring_register(fd, IORING_UNREGISTER_BUFFERS,
- 0, 0);
+ ret2 = __sys_io_uring_register(fd,
+ IORING_UNREGISTER_BUFFERS, 0, 0);
} else if (opcode == IORING_REGISTER_FILES) {
- ret2 = io_uring_register(fd, IORING_UNREGISTER_FILES,
- 0, 0);
+ ret2 = __sys_io_uring_register(fd,
+ IORING_UNREGISTER_FILES, 0, 0);
}
if (ret2) {
printf("internal error: failed to unregister\n");
@@ -66,7 +67,7 @@
{
int fd;
- fd = io_uring_setup(entries, p);
+ fd = __sys_io_uring_setup(entries, p);
if (fd < 0) {
perror("io_uring_setup");
exit(1);
@@ -191,8 +192,8 @@
*/
nr_fds = UINT_MAX;
while (nr_fds) {
- ret = io_uring_register(uring_fd, IORING_REGISTER_FILES,
- fd_as, nr_fds);
+ ret = __sys_io_uring_register(uring_fd, IORING_REGISTER_FILES,
+ fd_as, nr_fds);
if (ret != 0) {
nr_fds /= 2;
continue;
@@ -202,7 +203,8 @@
status = 0;
printf("io_uring_register(%d, IORING_UNREGISTER_FILES, 0, 0)...",
uring_fd);
- ret = io_uring_register(uring_fd, IORING_UNREGISTER_FILES, 0, 0);
+ ret = __sys_io_uring_register(uring_fd, IORING_UNREGISTER_FILES,
+ 0, 0);
if (ret < 0) {
ret = errno;
printf("failed\n");
@@ -242,7 +244,7 @@
iov.iov_base = buf;
while (iov.iov_len) {
- ret = io_uring_register(fd, IORING_REGISTER_BUFFERS, &iov, 1);
+ ret = __sys_io_uring_register(fd, IORING_REGISTER_BUFFERS, &iov, 1);
if (ret < 0) {
if (errno == ENOMEM) {
printf("io_uring_register of %zu bytes failed "
@@ -256,7 +258,8 @@
}
printf("successfully registered %zu bytes (%d).\n",
iov.iov_len, ret);
- ret = io_uring_register(fd, IORING_UNREGISTER_BUFFERS, NULL, 0);
+ ret = __sys_io_uring_register(fd, IORING_UNREGISTER_BUFFERS,
+ NULL, 0);
if (ret != 0) {
printf("error: unregister failed with %d\n", errno);
free(buf);
@@ -296,12 +299,12 @@
nr--;
printf("io_uring_register(%d, %u, %p, %u)\n",
fd, IORING_REGISTER_BUFFERS, iovs, nr);
- ret = io_uring_register(fd, IORING_REGISTER_BUFFERS, iovs, nr);
+ ret = __sys_io_uring_register(fd, IORING_REGISTER_BUFFERS, iovs, nr);
if (ret != 0) {
printf("expected success, got %d\n", errno);
status = 1;
} else
- io_uring_register(fd, IORING_UNREGISTER_BUFFERS, 0, 0);
+ __sys_io_uring_register(fd, IORING_UNREGISTER_BUFFERS, 0, 0);
free(buf);
free(iovs);
@@ -356,7 +359,7 @@
*/
iov.iov_base = buf;
iov.iov_len = 2*1024*1024;
- ret = io_uring_register(fd, IORING_REGISTER_BUFFERS, &iov, 1);
+ ret = __sys_io_uring_register(fd, IORING_REGISTER_BUFFERS, &iov, 1);
if (ret < 0) {
if (errno == ENOMEM)
printf("Unable to test registering of a huge "
@@ -369,8 +372,8 @@
}
} else {
printf("Success!\n");
- ret = io_uring_register(fd, IORING_UNREGISTER_BUFFERS,
- 0, 0);
+ ret = __sys_io_uring_register(fd,
+ IORING_UNREGISTER_BUFFERS, 0, 0);
if (ret < 0) {
perror("io_uring_unregister");
status = 1;
diff --git a/test/io_uring_setup.c b/test/io_uring_setup.c
index 5ce460d..8b01dac 100644
--- a/test/io_uring_setup.c
+++ b/test/io_uring_setup.c
@@ -15,6 +15,8 @@
#include <sys/sysinfo.h>
#include "liburing.h"
+#include "../syscall.h"
+
char *features_string(struct io_uring_params *p)
{
static char flagstr[64];
@@ -102,7 +104,7 @@
entries, p, flags_string(p), features_string(p), dump_resv(p),
p ? p->sq_thread_cpu : 0);
- ret = io_uring_setup(entries, p);
+ ret = __sys_io_uring_setup(entries, p);
if (ret != expect) {
printf("expected %d, got %d\n", expect, ret);
/* if we got a valid uring, close it */
@@ -161,7 +163,7 @@
/* read/write on io_uring_fd */
memset(&p, 0, sizeof(p));
- fd = io_uring_setup(1, &p);
+ fd = __sys_io_uring_setup(1, &p);
if (fd < 0) {
printf("io_uring_setup failed with %d, expected success\n",
errno);
diff --git a/test/ring-leak.c b/test/ring-leak.c
index 02b06f9..ca18642 100644
--- a/test/ring-leak.c
+++ b/test/ring-leak.c
@@ -22,12 +22,13 @@
#include <linux/fs.h>
#include "liburing.h"
+#include "../src/syscall.h"
static int __io_uring_register_files(int ring_fd, int fd1, int fd2)
{
__s32 fds[2] = { fd1, fd2 };
- return io_uring_register(ring_fd, IORING_REGISTER_FILES, fds, 2);
+ return __sys_io_uring_register(ring_fd, IORING_REGISTER_FILES, fds, 2);
}
static int get_ring_fd(void)
@@ -37,7 +38,7 @@
memset(&p, 0, sizeof(p));
- fd = io_uring_setup(2, &p);
+ fd = __sys_io_uring_setup(2, &p);
if (fd < 0) {
perror("io_uring_setup");
return -1;
diff --git a/test/timeout.c b/test/timeout.c
index fdf2223..7c0bebe 100644
--- a/test/timeout.c
+++ b/test/timeout.c
@@ -11,6 +11,7 @@
#include <sys/time.h>
#include "liburing.h"
+#include "../src/syscall.h"
#define TIMEOUT_MSEC 200
static int not_supported;
@@ -76,7 +77,8 @@
}
gettimeofday(&tv, NULL);
- ret = io_uring_enter(ring->ring_fd, 0, 4, IORING_ENTER_GETEVENTS, NULL);
+ ret = __sys_io_uring_enter(ring->ring_fd, 0, 4, IORING_ENTER_GETEVENTS,
+ NULL);
if (ret < 0) {
fprintf(stderr, "%s: io_uring_enter %d\n", __FUNCTION__, ret);
goto err;