Merge pull request #34 from CarterLi/master

nginx_io_uring.patch: Fix -EFAULT errors
pull/38/head
Hakase 2019-12-16 21:53:22 +09:00 committed by GitHub
commit 2c19ec2ec7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 118 additions and 96 deletions

View File

@ -1,18 +1,19 @@
From 5e463cc0c3161dec121a693b0c4e589694eb9682 Mon Sep 17 00:00:00 2001 From da87b6048f6a66da7d23d77e4009be5090b5a995 Mon Sep 17 00:00:00 2001
From: Carter Li <carter.li@eoitek.com> From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= <carter.li@eoitek.com>
Date: Thu, 13 Jun 2019 20:23:58 +0800 Date: Tue, 3 Dec 2019 15:00:52 +0800
Subject: [PATCH] Add io_uring support Subject: [PATCH] Add io_uring support
--- ---
auto/unix | 39 ++--- auto/unix | 39 ++---
src/event/modules/ngx_epoll_module.c | 222 +++++---------------------- src/core/ngx_open_file_cache.c | 6 +-
src/event/ngx_event.h | 1 - src/event/modules/ngx_epoll_module.c | 218 +++++----------------------
src/event/ngx_event.h | 4 +-
src/os/unix/ngx_linux_aio_read.c | 44 +++--- src/os/unix/ngx_linux_aio_read.c | 44 +++---
src/os/unix/ngx_linux_config.h | 3 +- src/os/unix/ngx_linux_config.h | 3 +-
5 files changed, 68 insertions(+), 241 deletions(-) 6 files changed, 72 insertions(+), 242 deletions(-)
diff --git a/auto/unix b/auto/unix diff --git a/auto/unix b/auto/unix
index 43d3b25..5b8ade8 100644 index ff9697a..2e2f63a 100644
--- a/auto/unix --- a/auto/unix
+++ b/auto/unix +++ b/auto/unix
@@ -532,44 +532,23 @@ if [ $NGX_FILE_AIO = YES ]; then @@ -532,44 +532,23 @@ if [ $NGX_FILE_AIO = YES ]; then
@ -77,8 +78,27 @@ index 43d3b25..5b8ade8 100644
END END
exit 1 exit 1
diff --git a/src/core/ngx_open_file_cache.c b/src/core/ngx_open_file_cache.c
index b23ee78..682d48c 100644
--- a/src/core/ngx_open_file_cache.c
+++ b/src/core/ngx_open_file_cache.c
@@ -869,11 +869,11 @@ ngx_open_and_stat_file(ngx_str_t *name, ngx_open_file_info_t *of,
if (!of->log) {
/*
- * Use non-blocking open() not to hang on FIFO files, etc.
- * This flag has no effect on a regular files.
+ * Differs from plain read, IORING_OP_READV with O_NONBLOCK
+ * will return -EAGAIN if the operation may block.
*/
- fd = ngx_open_file_wrapper(name, of, NGX_FILE_RDONLY|NGX_FILE_NONBLOCK,
+ fd = ngx_open_file_wrapper(name, of, NGX_FILE_RDONLY,
NGX_FILE_OPEN, 0, log);
} else {
diff --git a/src/event/modules/ngx_epoll_module.c b/src/event/modules/ngx_epoll_module.c diff --git a/src/event/modules/ngx_epoll_module.c b/src/event/modules/ngx_epoll_module.c
index 76aee08..812b43a 100644 index 98e3ce7..2f0bd26 100644
--- a/src/event/modules/ngx_epoll_module.c --- a/src/event/modules/ngx_epoll_module.c
+++ b/src/event/modules/ngx_epoll_module.c +++ b/src/event/modules/ngx_epoll_module.c
@@ -75,23 +75,6 @@ int epoll_wait(int epfd, struct epoll_event *events, int nevents, int timeout) @@ -75,23 +75,6 @@ int epoll_wait(int epfd, struct epoll_event *events, int nevents, int timeout)
@ -274,7 +294,7 @@ index 76aee08..812b43a 100644
#endif #endif
ngx_free(event_list); ngx_free(event_list);
@@ -940,83 +846,31 @@ ngx_epoll_process_events(ngx_cycle_t *cycle, ngx_msec_t timer, ngx_uint_t flags) @@ -939,83 +845,31 @@ ngx_epoll_process_events(ngx_cycle_t *cycle, ngx_msec_t timer, ngx_uint_t flags)
#if (NGX_HAVE_FILE_AIO) #if (NGX_HAVE_FILE_AIO)
static void static void
@ -294,7 +314,7 @@ index 76aee08..812b43a 100644
- ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ev->log, 0, "eventfd handler"); - ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ev->log, 0, "eventfd handler");
- -
- n = read(ngx_eventfd, &ready, 8); - n = read(ngx_eventfd, &ready, 8);
-
- err = ngx_errno; - err = ngx_errno;
- -
- ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ev->log, 0, "eventfd: %d", n); - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ev->log, 0, "eventfd: %d", n);
@ -308,6 +328,8 @@ index 76aee08..812b43a 100644
- ngx_log_error(NGX_LOG_ALERT, ev->log, err, "read(eventfd) failed"); - ngx_log_error(NGX_LOG_ALERT, ev->log, err, "read(eventfd) failed");
- return; - return;
- } - }
+ ngx_log_debug(NGX_LOG_DEBUG_EVENT, ev->log, 0,
+ "io_uring_peek_cqe: START");
- ngx_log_error(NGX_LOG_ALERT, ev->log, 0, - ngx_log_error(NGX_LOG_ALERT, ev->log, 0,
- "read(eventfd) returned only %d bytes", n); - "read(eventfd) returned only %d bytes", n);
@ -339,57 +361,56 @@ index 76aee08..812b43a 100644
- e->complete = 1; - e->complete = 1;
- e->active = 0; - e->active = 0;
- e->ready = 1; - e->ready = 1;
-
- aio = e->data;
- aio->res = event[i].res;
-
- ngx_post_event(e, &ngx_posted_events);
- }
+ ngx_log_debug(NGX_LOG_DEBUG_EVENT, ev->log, 0,
+ "io_uring_peek_cqe: START");
+
+ while (io_uring_peek_cqe(&ngx_ring, &cqe) >= 0 && cqe) { + while (io_uring_peek_cqe(&ngx_ring, &cqe) >= 0 && cqe) {
+ ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ev->log, 0, + ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ev->log, 0,
+ "io_event: %p %d %d", + "io_event: %p %d %d",
+ cqe->user_data, cqe->res, cqe->flags); + cqe->user_data, cqe->res, cqe->flags);
- continue; - aio = e->data;
- } - aio->res = event[i].res;
+ e = (ngx_event_t *) io_uring_cqe_get_data(cqe); + e = (ngx_event_t *) io_uring_cqe_get_data(cqe);
+ e->complete = 1; + e->complete = 1;
+ e->active = 0; + e->active = 0;
+ e->ready = 1; + e->ready = 1;
- if (events == 0) { - ngx_post_event(e, &ngx_posted_events);
- return; - }
- }
+ aio = e->data; + aio = e->data;
+ aio->res = cqe->res; + aio->res = cqe->res;
- continue;
- }
+ io_uring_cqe_seen(&ngx_ring, cqe);
- if (events == 0) {
- return;
- }
-
- /* events == -1 */ - /* events == -1 */
- ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno, - ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno,
- "io_getevents() failed"); - "io_getevents() failed");
- return; - return;
+ io_uring_cqe_seen(&ngx_ring, cqe);
+
+ ngx_post_event(e, &ngx_posted_events); + ngx_post_event(e, &ngx_posted_events);
} }
} }
diff --git a/src/event/ngx_event.h b/src/event/ngx_event.h diff --git a/src/event/ngx_event.h b/src/event/ngx_event.h
index bb77c4a..fcb0812 100644 index 97f9673..eb17346 100644
--- a/src/event/ngx_event.h --- a/src/event/ngx_event.h
+++ b/src/event/ngx_event.h +++ b/src/event/ngx_event.h
@@ -167,7 +167,6 @@ struct ngx_event_aio_s { @@ -160,7 +160,9 @@ struct ngx_event_aio_s {
size_t nbytes; size_t nbytes;
#endif #endif
- ngx_aiocb_t aiocb; - ngx_aiocb_t aiocb;
+ /* Make sure that this iov has the same lifecycle with its associated aio event */
+ struct iovec iov;
+
ngx_event_t event; ngx_event_t event;
}; };
diff --git a/src/os/unix/ngx_linux_aio_read.c b/src/os/unix/ngx_linux_aio_read.c diff --git a/src/os/unix/ngx_linux_aio_read.c b/src/os/unix/ngx_linux_aio_read.c
index 9f0a6c1..8826531 100644 index 9f0a6c1..52849e3 100644
--- a/src/os/unix/ngx_linux_aio_read.c --- a/src/os/unix/ngx_linux_aio_read.c
+++ b/src/os/unix/ngx_linux_aio_read.c +++ b/src/os/unix/ngx_linux_aio_read.c
@@ -10,19 +10,12 @@ @@ -10,19 +10,12 @@
@ -413,7 +434,7 @@ index 9f0a6c1..8826531 100644
ngx_int_t ngx_int_t
ngx_file_aio_init(ngx_file_t *file, ngx_pool_t *pool) ngx_file_aio_init(ngx_file_t *file, ngx_pool_t *pool)
@@ -50,10 +43,11 @@ ssize_t @@ -50,10 +43,10 @@ ssize_t
ngx_file_aio_read(ngx_file_t *file, u_char *buf, size_t size, off_t offset, ngx_file_aio_read(ngx_file_t *file, u_char *buf, size_t size, off_t offset,
ngx_pool_t *pool) ngx_pool_t *pool)
{ {
@ -425,23 +446,15 @@ index 9f0a6c1..8826531 100644
+ ngx_event_t *ev; + ngx_event_t *ev;
+ ngx_event_aio_t *aio; + ngx_event_aio_t *aio;
+ struct io_uring_sqe *sqe; + struct io_uring_sqe *sqe;
+ struct iovec iov;
if (!ngx_file_aio) { if (!ngx_file_aio) {
return ngx_read_file(file, buf, size, offset); return ngx_read_file(file, buf, size, offset);
@@ -93,22 +87,24 @@ ngx_file_aio_read(ngx_file_t *file, u_char *buf, size_t size, off_t offset, @@ -93,22 +86,25 @@ ngx_file_aio_read(ngx_file_t *file, u_char *buf, size_t size, off_t offset,
return NGX_ERROR; return NGX_ERROR;
} }
- ngx_memzero(&aio->aiocb, sizeof(struct iocb)); - ngx_memzero(&aio->aiocb, sizeof(struct iocb));
+ sqe = io_uring_get_sqe(&ngx_ring); + sqe = io_uring_get_sqe(&ngx_ring);
+
+ if (!sqe) {
+ ngx_log_debug4(NGX_LOG_DEBUG_CORE, file->log, 0,
+ "aio no sqe left:%d @%O:%uz %V",
+ ev->complete, offset, size, &file->name);
+ return ngx_read_file(file, buf, size, offset);
+ }
- aio->aiocb.aio_data = (uint64_t) (uintptr_t) ev; - aio->aiocb.aio_data = (uint64_t) (uintptr_t) ev;
- aio->aiocb.aio_lio_opcode = IOCB_CMD_PREAD; - aio->aiocb.aio_lio_opcode = IOCB_CMD_PREAD;
@ -451,17 +464,25 @@ index 9f0a6c1..8826531 100644
- aio->aiocb.aio_offset = offset; - aio->aiocb.aio_offset = offset;
- aio->aiocb.aio_flags = IOCB_FLAG_RESFD; - aio->aiocb.aio_flags = IOCB_FLAG_RESFD;
- aio->aiocb.aio_resfd = ngx_eventfd; - aio->aiocb.aio_resfd = ngx_eventfd;
+ iov.iov_base = buf; + if (!sqe) {
+ iov.iov_len = size; + ngx_log_debug4(NGX_LOG_DEBUG_CORE, file->log, 0,
+ io_uring_prep_readv(sqe, file->fd, &iov, 1, offset); + "aio no sqe left:%d @%O:%uz %V",
+ io_uring_sqe_set_data(sqe, ev); + ev->complete, offset, size, &file->name);
+ return ngx_read_file(file, buf, size, offset);
+ }
- ev->handler = ngx_file_aio_event_handler; - ev->handler = ngx_file_aio_event_handler;
+ /* We must store iov into heap to prevent kernel from returning -EFAULT */
+ aio->iov.iov_base = buf;
+ aio->iov.iov_len = size;
+ io_uring_prep_readv(sqe, file->fd, &aio->iov, 1, offset);
+ io_uring_sqe_set_data(sqe, ev);
- piocb[0] = &aio->aiocb; - piocb[0] = &aio->aiocb;
+ ev->handler = ngx_file_aio_event_handler;
- if (io_submit(ngx_aio_ctx, 1, piocb) == 1) { - if (io_submit(ngx_aio_ctx, 1, piocb) == 1) {
+ ev->handler = ngx_file_aio_event_handler;
+
+ if (io_uring_submit(&ngx_ring) == 1) { + if (io_uring_submit(&ngx_ring) == 1) {
ev->active = 1; ev->active = 1;
ev->ready = 0; ev->ready = 0;
@ -481,4 +502,5 @@ index 3036cae..daf5b4c 100644
-- --
2.22.0 2.24.0