From b59996ee8a0d5efec82bb7a429434ec27d346955 Mon Sep 17 00:00:00 2001 From: Vito Caputo Date: Sun, 15 Aug 2021 17:25:24 -0700 Subject: journals: register opened journals for "fixed" use This introduces an journal_t.idx member for "fixed" style usage in io_uring parlance. Once all journals get opened, they're registered in the underlying iou ring. Subsequent operations on these files may supply these idx values as the fd, but must also add IOSQE_FIXED_FILE to the sqe's flags. This commit also switches the already present read operations to use the idx/IOSQE_FIXED_FILE method. Theoretically this should offer some efficiency gains, since the kernel can now skip some per-operation fd handling overheads by having them done once instead @ registration time. --- src/journals.c | 38 ++++++++++++++++++++++++++++++++------ src/journals.h | 2 +- 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/src/journals.c b/src/journals.c index 0ced279..74c44dd 100644 --- a/src/journals.c +++ b/src/journals.c @@ -69,8 +69,29 @@ THUNK_DEFINE_STATIC(opened_journal, iou_t *, iou, iou_op_t *, op, journals_t *, journal->fd = op->result; } - if (journals->n_opened == journals->n_journals) + if (journals->n_opened == journals->n_journals) { + int *fds, r; + + /* "register" all the opened journals, storing their respective + * index in journal->idx for convenience. + */ + fds = malloc(sizeof(*fds) * journals->n_journals); + if (!fds) + return -ENOMEM; + + for (int i = 0; i < journals->n_journals; i++) { + fds[i] = journals->journals[i].fd; + journals->journals[i].idx = i; + } + + r = io_uring_register_files(iou_ring(iou), fds, journals->n_journals); + if (r < 0) + return r; + + free(fds); + return thunk_dispatch(closure); + } return 0; } @@ -287,7 +308,8 @@ THUNK_DEFINE(journal_iter_next_object, iou_t *, iou, journal_t **, journal, Head if (!op) return -ENOMEM; - io_uring_prep_read(op->sqe, (*journal)->fd, iter_object_header, sizeof(ObjectHeader), *iter_offset); + io_uring_prep_read(op->sqe, (*journal)->idx, iter_object_header, sizeof(ObjectHeader), *iter_offset); + op->sqe->flags = IOSQE_FIXED_FILE; op_queue(iou, op, THUNK(got_iter_object_header(iou, op, *journal, iter_offset, iter_object_header, closure))); return 0; @@ -451,7 +473,8 @@ THUNK_DEFINE(journal_hash_table_iter_next_object, iou_t *, iou, journal_t **, jo if (!op) return -ENOMEM; - io_uring_prep_read(op->sqe, (*journal)->fd, iter_object_header, iter_object_size, *iter_offset); + io_uring_prep_read(op->sqe, (*journal)->idx, iter_object_header, iter_object_size, *iter_offset); + op->sqe->flags = IOSQE_FIXED_FILE; op_queue(iou, op, THUNK(got_hash_table_iter_object_header(iou, op, *journal, *hash_table, *hash_table_size, iter_bucket, iter_offset, iter_object_header, iter_object_size, closure))); return 0; @@ -546,7 +569,8 @@ THUNK_DEFINE(journal_get_hash_table, iou_t *, iou, journal_t **, journal, uint64 if (!table) return -ENOMEM; - io_uring_prep_read(op->sqe, (*journal)->fd, table, *hash_table_size, *hash_table_offset); + io_uring_prep_read(op->sqe, (*journal)->idx, table, *hash_table_size, *hash_table_offset); + op->sqe->flags = IOSQE_FIXED_FILE; op_queue(iou, op, THUNK(got_hashtable(iou, op, table, *hash_table_size, res_hash_table, closure))); return 0; @@ -612,7 +636,8 @@ THUNK_DEFINE(journal_get_header, iou_t *, iou, journal_t **, journal, Header *, if (!op) return -ENOMEM; - io_uring_prep_read(op->sqe, (*journal)->fd, header, sizeof(*header), 0); + io_uring_prep_read(op->sqe, (*journal)->idx, header, sizeof(*header), 0); + op->sqe->flags = IOSQE_FIXED_FILE; op_queue(iou, op, THUNK(got_header(iou, op, *journal, header, closure))); return 0; @@ -657,7 +682,8 @@ THUNK_DEFINE(journal_get_object_header, iou_t *, iou, journal_t **, journal, uin if (!op) return -ENOMEM; - io_uring_prep_read(op->sqe, (*journal)->fd, object_header, sizeof(*object_header), *offset); + io_uring_prep_read(op->sqe, (*journal)->idx, object_header, sizeof(*object_header), *offset); + op->sqe->flags = IOSQE_FIXED_FILE; op_queue(iou, op, THUNK(got_object_header(iou, op, object_header, closure))); return 0; diff --git a/src/journals.h b/src/journals.h index b0fbfe2..ca23f77 100644 --- a/src/journals.h +++ b/src/journals.h @@ -17,7 +17,7 @@ typedef struct iou_t iou_t; typedef struct journal_t { char *name; - int fd; + int fd, idx; } journal_t; typedef struct journals_t journals_t; -- cgit v1.2.3