summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorVito Caputo <vcaputo@pengaru.com>2021-08-15 17:25:24 -0700
committerVito Caputo <vcaputo@pengaru.com>2021-08-15 17:25:24 -0700
commitb59996ee8a0d5efec82bb7a429434ec27d346955 (patch)
treebaa88f9690f4c010bb551e79bc914d4cc3bcf9dd /src
parent137df47e1d7bc3ba84f68219ee475eb5318dcf56 (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.
Diffstat (limited to 'src')
-rw-r--r--src/journals.c38
-rw-r--r--src/journals.h2
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;
© All Rights Reserved