#include #include "fio.h" #include "zone-dist.h" static void __td_zone_gen_index(struct thread_data *td, enum fio_ddir ddir) { unsigned int i, j, sprev, aprev; uint64_t sprev_sz; td->zone_state_index[ddir] = malloc(sizeof(struct zone_split_index) * 100); sprev_sz = sprev = aprev = 0; for (i = 0; i < td->o.zone_split_nr[ddir]; i++) { struct zone_split *zsp = &td->o.zone_split[ddir][i]; for (j = aprev; j < aprev + zsp->access_perc; j++) { struct zone_split_index *zsi = &td->zone_state_index[ddir][j]; zsi->size_perc = sprev + zsp->size_perc; zsi->size_perc_prev = sprev; zsi->size = sprev_sz + zsp->size; zsi->size_prev = sprev_sz; } aprev += zsp->access_perc; sprev += zsp->size_perc; sprev_sz += zsp->size; } } static bool has_zones(struct thread_data *td) { int i, zones = 0; for (i = 0; i < DDIR_RWDIR_CNT; i++) zones += td->o.zone_split_nr[i]; return zones != 0; } /* * Generate state table for indexes, so we don't have to do it inline from * the hot IO path */ void td_zone_gen_index(struct thread_data *td) { int i; if (!has_zones(td)) return; td->zone_state_index = malloc(DDIR_RWDIR_CNT * sizeof(struct zone_split_index *)); for (i = 0; i < DDIR_RWDIR_CNT; i++) __td_zone_gen_index(td, i); } void td_zone_free_index(struct thread_data *td) { int i; if (!td->zone_state_index) return; for (i = 0; i < DDIR_RWDIR_CNT; i++) { free(td->zone_state_index[i]); td->zone_state_index[i] = NULL; } free(td->zone_state_index); td->zone_state_index = NULL; }