diff options
author | Vito Caputo <vcaputo@pengaru.com> | 2021-08-15 17:25:24 -0700 |
---|---|---|
committer | Vito Caputo <vcaputo@pengaru.com> | 2021-08-15 17:25:24 -0700 |
commit | b59996ee8a0d5efec82bb7a429434ec27d346955 (patch) | |
tree | baa88f9690f4c010bb551e79bc914d4cc3bcf9dd | |
parent | 137df47e1d7bc3ba84f68219ee475eb5318dcf56 (diff) |
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.
-rw-r--r-- | src/journals.c | 38 | ||||
-rw-r--r-- | 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; |