From 938b55d6662c5c0fcdd33fc3bf72607ef655fd44 Mon Sep 17 00:00:00 2001 From: Florian Fischer <florian.fischer@muhq.space> Date: Mon, 13 Jun 2022 00:29:17 +0200 Subject: [PATCH] separate function calls for more meaningful flamegraphs --- main.cpp | 86 ++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 53 insertions(+), 33 deletions(-) diff --git a/main.cpp b/main.cpp index 8b0ef29..b0b8668 100644 --- a/main.cpp +++ b/main.cpp @@ -26,6 +26,57 @@ static void collect_paths(const std::string& root) { paths.emplace_back(new std::string(p.path())); } +static auto submit_and_wait(struct io_uring* ring) -> int { +#ifdef NDEBUG + __attribute__((unused)) +#endif + int submitted = io_uring_submit_and_wait(ring, 1); + assert(submitted == 1); + + struct io_uring_cqe* cqe; + if (io_uring_peek_cqe(ring, &cqe) < 0) err(EXIT_FAILURE, "failed to peek cqe"); + + int res = cqe->res; + if (res < 0) { + errno = -res; + err(EXIT_FAILURE, "opening failed"); + } + + io_uring_cqe_seen(ring, cqe); + return res; +} + +static void close_fd(struct io_uring* ring, int fd) { + struct io_uring_sqe* sqe = io_uring_get_sqe(ring); + assert(sqe); + + io_uring_prep_close(sqe, fd); + sqe->flags |= IOSQE_CQE_SKIP_SUCCESS; + +#ifdef NDEBUG + __attribute__((unused)) +#endif + int submitted = io_uring_submit(ring); + assert(submitted == 1); +} + +static void open_global(struct io_uring* ring, const char* path) { + struct io_uring_sqe* sqe = io_uring_get_sqe(ring); + assert(sqe); + io_uring_prep_openat(sqe, AT_FDCWD, path, O_RDONLY, 0); + + int fd = submit_and_wait(ring); + close_fd(ring, fd); +} + +static void open_direct(struct io_uring* ring, const char* path, unsigned slot) { + struct io_uring_sqe* sqe = io_uring_get_sqe(ring); + assert(sqe); + io_uring_prep_openat_direct(sqe, AT_FDCWD, path, O_RDONLY, 0, slot); + + submit_and_wait(ring); +} + static void thread_func(pthread_barrier_t& init_barrier, unsigned id, bool direct) { struct io_uring ring; if (io_uring_queue_init(URING_ENTRIES, &ring, 0) < 0) @@ -48,41 +99,10 @@ static void thread_func(pthread_barrier_t& init_barrier, unsigned id, bool direc const auto* p = paths[paths_offset + i]; assert(p->c_str()); - struct io_uring_sqe* sqe = io_uring_get_sqe(&ring); - assert(sqe); - if (direct) { - io_uring_prep_openat_direct(sqe, AT_FDCWD, p->c_str(), O_RDONLY, 0, - i % URING_FILE_TABLE_SIZE); + open_direct(&ring, p->c_str(), i % URING_FILE_TABLE_SIZE); } else { - io_uring_prep_openat(sqe, AT_FDCWD, p->c_str(), O_RDONLY, 0); - } - -#ifdef NDEBUG - __attribute__((unused)) -#endif - int submitted = io_uring_submit_and_wait(&ring, 1); - assert(submitted == 1); - - struct io_uring_cqe* cqe; - if (io_uring_peek_cqe(&ring, &cqe) < 0) err(EXIT_FAILURE, "failed to peek cqe"); - - int res = cqe->res; - if (res < 0) { - errno = -res; - err(EXIT_FAILURE, "%d: %sopening %s failed", id, direct ? "directly " : "", p->c_str()); - } - - io_uring_cqe_seen(&ring, cqe); - - if (!direct) { - sqe = io_uring_get_sqe(&ring); - assert(sqe); - io_uring_prep_close(sqe, res); - sqe->flags |= IOSQE_CQE_SKIP_SUCCESS; - - submitted = io_uring_submit(&ring); - assert(submitted == 1); + open_global(&ring, p->c_str()); } } } -- GitLab