void rdm_rma_check_cntrs(uint64_t w, uint64_t r, uint64_t w_e, uint64_t r_e) { writes += w; reads += r; write_errs += w_e; read_errs += r_e; cr_assert(fi_cntr_read(write_cntr) == writes, "Bad write count"); cr_assert(fi_cntr_read(read_cntr) == reads, "Bad read count"); cr_assert(fi_cntr_readerr(write_cntr) == write_errs, "Bad write err count"); cr_assert(fi_cntr_readerr(read_cntr) == read_errs, "Bad read err count"); }
void rdm_sr_check_cntrs(uint64_t s[], uint64_t r[], uint64_t s_e[], uint64_t r_e[]) { int i = 0; for (; i < NUMEPS; i++) { sends[i] += s[i]; recvs[i] += r[i]; send_errs[i] += s_e[i]; recv_errs[i] += r_e[i]; cr_assert(fi_cntr_read(send_cntr[i]) == sends[i], "Bad send count"); cr_assert(fi_cntr_read(recv_cntr[i]) == recvs[i], "Bad recv count"); cr_assert(fi_cntr_readerr(send_cntr[i]) == send_errs[i], "Bad send err count"); cr_assert(fi_cntr_readerr(recv_cntr[i]) == recv_errs[i], "Bad recv err count"); } }
static int cntr_loop() { size_t i, opened, cntr_cnt; uint64_t value, expected; struct timespec start, stop; int ret, testret = FAIL, timeout = 5000; cntr_cnt = MIN(fi->domain_attr->cntr_cnt, MAX_COUNTER_CHECK); struct fid_cntr **cntrs = calloc(cntr_cnt, sizeof(struct fid_cntr *)); if (!cntrs) { perror("calloc"); return -FI_ENOMEM; } for (opened = 0; opened < cntr_cnt; opened++) { ret = ft_cntr_open(&cntrs[opened]); if (ret) { FT_PRINTERR("fi_cntr_open", ret); goto close; } } for (i = 0; i < opened; i++) { ret = fi_cntr_set(cntrs[i], i); if (ret) { FT_PRINTERR("fi_cntr_set", ret); goto close; } ret = fi_cntr_seterr(cntrs[i], i << 1); if (ret) { FT_PRINTERR("fi_cntr_seterr", ret); goto close; } } for (i = 0; i < opened; i++) { ret = fi_cntr_add(cntrs[i], i); if (ret) { FT_PRINTERR("fi_cntr_add", ret); goto close; } ret = fi_cntr_adderr(cntrs[i], i); if (ret) { FT_PRINTERR("fi_cntr_adderr", ret); goto close; } } for (i = 0; i < opened; i++) { clock_gettime(CLOCK_MONOTONIC, &start); expected = i + i; do { value = fi_cntr_read(cntrs[i]); clock_gettime(CLOCK_MONOTONIC, &stop); sched_yield(); } while ((value != expected) && ((stop.tv_sec - start.tv_sec) > timeout)); if (value != expected) { FT_PRINTERR("fi_cntr_read", value); goto close; } clock_gettime(CLOCK_MONOTONIC, &start); expected = (i << 1) + i; do { value = fi_cntr_readerr(cntrs[i]); clock_gettime(CLOCK_MONOTONIC, &stop); sched_yield(); } while ((value != expected) && ((stop.tv_sec - start.tv_sec) > timeout)); if (value != expected) { FT_PRINTERR("fi_cntr_readerr", value); goto close; } } testret = PASS; close: for (i = 0; i < opened; i++) { ret = fi_close(&(cntrs[i])->fid); if (ret) { FT_PRINTERR("fi_cntr_close", ret); break; } } if (i < cntr_cnt) testret = FAIL; free(cntrs); return TEST_RET_VAL(ret, testret); }