static int work_fn(void *arg) { uint64_t tsc_end; struct worker_thread *worker = (struct worker_thread *)arg; struct ns_worker_ctx *ns_ctx = NULL; printf("Starting thread on core %u\n", worker->lcore); /* Allocate a queue pair for each namespace. */ ns_ctx = worker->ns_ctx; while (ns_ctx != NULL) { if (init_ns_worker_ctx(ns_ctx) != 0) { printf("ERROR: init_ns_worker_ctx() failed\n"); return 1; } ns_ctx = ns_ctx->next; } tsc_end = rte_get_timer_cycles() + g_time_in_sec * g_tsc_rate; /* Submit initial I/O for each namespace. */ ns_ctx = worker->ns_ctx; while (ns_ctx != NULL) { submit_io(ns_ctx, g_queue_depth); ns_ctx = ns_ctx->next; } while (1) { /* * Check for completed I/O for each controller. A new * I/O will be submitted in the io_complete callback * to replace each I/O that is completed. */ ns_ctx = worker->ns_ctx; while (ns_ctx != NULL) { check_io(ns_ctx); ns_ctx = ns_ctx->next; } if (rte_get_timer_cycles() > tsc_end) { break; } } ns_ctx = worker->ns_ctx; while (ns_ctx != NULL) { drain_io(ns_ctx); cleanup_ns_worker_ctx(ns_ctx); ns_ctx = ns_ctx->next; } return 0; }
static int work_fn(void) { uint64_t tsc_end; printf("Starting work_fn on core %u\n", rte_lcore_id()); /* Allocate a queue pair for each namespace. */ if (init_ns_worker_ctx() != 0) { printf("ERROR: init_ns_worker_ctx() failed\n"); return 1; } tsc_end = spdk_get_ticks() + g_time_in_sec * g_tsc_rate; /* Submit initial I/O for each namespace. */ submit_single_io(); g_complete_tsc_start = spdk_get_ticks(); while (1) { /* * Check for completed I/O for each controller. A new * I/O will be submitted in the io_complete callback * to replace each I/O that is completed. */ check_io(); if (spdk_get_ticks() > tsc_end) { break; } } drain_io(); cleanup_ns_worker_ctx(); return 0; }