Lines Matching refs:pair
23 * tst_fzsync_pair_reset(&pair, run_thread_b);
24 * while (tst_fzsync_run_a(&pair)) {
26 * tst_fzsync_start_race_a(&pair);
28 * tst_fzsync_end_race_a(&pair);
33 * while (tst_fzsync_run_b(&pair)) {
34 * tst_fzsync_start_race_b(&pair);
36 * tst_fzsync_end_race_b(&pair)
187 pair->param = (pair->param ? pair->param : def); \
188 if (pair->param < low) \
190 if (pair->param > hi) \
203 static inline void tst_fzsync_pair_init(struct tst_fzsync_pair *pair)
211 pair->yield_in_wait = 1;
222 static inline void tst_fzsync_pair_cleanup(struct tst_fzsync_pair *pair)
224 if (pair->thread_b) {
226 if (!pair->exit)
227 tst_atomic_store(1, &pair->exit);
228 SAFE_PTHREAD_JOIN(pair->thread_b, NULL);
229 pair->thread_b = 0;
248 * @param pair The state structure initialised with TST_FZSYNC_PAIR_INIT.
262 static inline void tst_fzsync_pair_reset(struct tst_fzsync_pair *pair,
265 tst_fzsync_pair_cleanup(pair);
267 tst_init_stat(&pair->diff_ss);
268 tst_init_stat(&pair->diff_sa);
269 tst_init_stat(&pair->diff_sb);
270 tst_init_stat(&pair->diff_ab);
271 tst_init_stat(&pair->spins_avg);
272 pair->delay = 0;
273 pair->delay_bias = 0;
274 pair->sampling = pair->min_samples;
276 pair->exec_loop = 0;
278 pair->a_cntr = 0;
279 pair->b_cntr = 0;
280 pair->exit = 0;
282 SAFE_PTHREAD_CREATE(&pair->thread_b, 0, run_b, 0);
284 pair->exec_time_start = (float)tst_remaining_runtime();
305 static inline void tst_fzsync_pair_info(struct tst_fzsync_pair *pair)
308 pair->exec_loop, pair->delay_bias);
309 tst_fzsync_stat_info(pair->diff_ss, "ns", "start_a - start_b");
310 tst_fzsync_stat_info(pair->diff_sa, "ns", "end_a - start_a");
311 tst_fzsync_stat_info(pair->diff_sb, "ns", "end_b - start_b");
312 tst_fzsync_stat_info(pair->diff_ab, "ns", "end_a - end_b");
313 tst_fzsync_stat_info(pair->spins_avg, " ", "spins");
458 static inline void tst_fzsync_pair_update(struct tst_fzsync_pair *pair)
460 float alpha = pair->avg_alpha;
462 float max_dev = pair->max_dev_ratio;
465 pair->delay = pair->delay_bias;
467 over_max_dev = pair->diff_ss.dev_ratio > max_dev
468 || pair->diff_sa.dev_ratio > max_dev
469 || pair->diff_sb.dev_ratio > max_dev
470 || pair->diff_ab.dev_ratio > max_dev
471 || pair->spins_avg.dev_ratio > max_dev;
473 if (pair->sampling > 0 || over_max_dev) {
474 tst_upd_diff_stat(&pair->diff_ss, alpha,
475 pair->a_start, pair->b_start);
476 tst_upd_diff_stat(&pair->diff_sa, alpha,
477 pair->a_end, pair->a_start);
478 tst_upd_diff_stat(&pair->diff_sb, alpha,
479 pair->b_end, pair->b_start);
480 tst_upd_diff_stat(&pair->diff_ab, alpha,
481 pair->a_end, pair->b_end);
482 tst_upd_stat(&pair->spins_avg, alpha, pair->spins);
483 if (pair->sampling > 0 && --pair->sampling == 0) {
485 tst_fzsync_pair_info(pair);
487 } else if (fabsf(pair->diff_ab.avg) >= 1) {
488 per_spin_time = fabsf(pair->diff_ab.avg) / MAX(pair->spins_avg.avg, 1.0f);
489 time_delay = drand48() * (pair->diff_sa.avg + pair->diff_sb.avg)
490 - pair->diff_sb.avg;
491 pair->delay += (int)(1.1 * time_delay / per_spin_time);
493 if (!pair->sampling) {
496 pair->max_dev_ratio);
498 -(int)(pair->diff_sb.avg / per_spin_time) + pair->delay_bias,
499 (int)(pair->diff_sa.avg / per_spin_time) + pair->delay_bias);
500 tst_fzsync_pair_info(pair);
501 pair->sampling = -1;
503 } else if (!pair->sampling) {
505 tst_fzsync_pair_info(pair);
506 pair->sampling = -1;
509 pair->spins = 0;
606 static inline void tst_fzsync_wait_a(struct tst_fzsync_pair *pair)
608 tst_fzsync_pair_wait(&pair->a_cntr, &pair->b_cntr,
609 NULL, &pair->exit, pair->yield_in_wait);
618 static inline void tst_fzsync_wait_b(struct tst_fzsync_pair *pair)
620 tst_fzsync_pair_wait(&pair->b_cntr, &pair->a_cntr,
621 NULL, &pair->exit, pair->yield_in_wait);
635 static inline int tst_fzsync_run_a(struct tst_fzsync_pair *pair)
637 float rem_p = 1 - tst_remaining_runtime() / pair->exec_time_start;
639 if ((SAMPLING_SLICE < rem_p) && (pair->sampling > 0)) {
642 pair->exec_loop, pair->min_samples);
643 pair->sampling = 0;
644 tst_fzsync_pair_info(pair);
650 tst_atomic_store(1, &pair->exit);
653 if (++pair->exec_loop > pair->exec_loops) {
656 tst_atomic_store(1, &pair->exit);
659 tst_fzsync_wait_a(pair);
661 if (pair->exit) {
662 tst_fzsync_pair_cleanup(pair);
675 static inline int tst_fzsync_run_b(struct tst_fzsync_pair *pair)
677 tst_fzsync_wait_b(pair);
678 return !tst_atomic_load(&pair->exit);
699 static inline void tst_fzsync_start_race_a(struct tst_fzsync_pair *pair)
703 tst_fzsync_pair_update(pair);
705 tst_fzsync_wait_a(pair);
707 delay = pair->delay;
708 if (pair->yield_in_wait) {
718 tst_fzsync_time(&pair->a_start);
727 static inline void tst_fzsync_end_race_a(struct tst_fzsync_pair *pair)
729 tst_fzsync_time(&pair->a_end);
730 tst_fzsync_pair_wait(&pair->a_cntr, &pair->b_cntr,
731 &pair->spins, &pair->exit, pair->yield_in_wait);
740 static inline void tst_fzsync_start_race_b(struct tst_fzsync_pair *pair)
744 tst_fzsync_wait_b(pair);
746 delay = pair->delay;
747 if (pair->yield_in_wait) {
757 tst_fzsync_time(&pair->b_start);
766 static inline void tst_fzsync_end_race_b(struct tst_fzsync_pair *pair)
768 tst_fzsync_time(&pair->b_end);
769 tst_fzsync_pair_wait(&pair->b_cntr, &pair->a_cntr,
770 &pair->spins, &pair->exit, pair->yield_in_wait);
797 static inline void tst_fzsync_pair_add_bias(struct tst_fzsync_pair *pair, int change)
799 if (pair->sampling > 0)
800 pair->delay_bias += change;