| #include <stdlib.h> |
| #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; |
| } |