| 1 | #include "fio.h" |
| 2 | |
| 3 | int init_dedupe_working_set_seeds(struct thread_data *td) |
| 4 | { |
| 5 | unsigned long long i; |
| 6 | struct frand_state dedupe_working_set_state = {0}; |
| 7 | |
| 8 | if (!td->o.dedupe_percentage || !(td->o.dedupe_mode == DEDUPE_MODE_WORKING_SET)) |
| 9 | return 0; |
| 10 | |
| 11 | /* |
| 12 | * The dedupe working set keeps seeds of unique data (generated by buf_state). |
| 13 | * Dedupe-ed pages will be generated using those seeds. |
| 14 | */ |
| 15 | td->num_unique_pages = (td->o.size * (unsigned long long)td->o.dedupe_working_set_percentage / 100) / td->o.min_bs[DDIR_WRITE]; |
| 16 | td->dedupe_working_set_states = malloc(sizeof(struct frand_state) * td->num_unique_pages); |
| 17 | if (!td->dedupe_working_set_states) { |
| 18 | log_err("fio: could not allocate dedupe working set\n"); |
| 19 | return 1; |
| 20 | } |
| 21 | frand_copy(&dedupe_working_set_state, &td->buf_state); |
| 22 | for (i = 0; i < td->num_unique_pages; i++) { |
| 23 | frand_copy(&td->dedupe_working_set_states[i], &dedupe_working_set_state); |
| 24 | __get_next_seed(&dedupe_working_set_state); |
| 25 | } |
| 26 | |
| 27 | return 0; |
| 28 | } |