| // SPDX-License-Identifier: GPL-2.0 | |
| /* Copyright (c) 2020 Facebook */ | |
| #include "bench.h" | |
| /* COUNT-GLOBAL benchmark */ | |
| static struct count_global_ctx { | |
| struct counter hits; | |
| } count_global_ctx; | |
| static void *count_global_producer(void *input) | |
| { | |
| struct count_global_ctx *ctx = &count_global_ctx; | |
| while (true) { | |
| atomic_inc(&ctx->hits.value); | |
| } | |
| return NULL; | |
| } | |
| static void *count_global_consumer(void *input) | |
| { | |
| return NULL; | |
| } | |
| static void count_global_measure(struct bench_res *res) | |
| { | |
| struct count_global_ctx *ctx = &count_global_ctx; | |
| res->hits = atomic_swap(&ctx->hits.value, 0); | |
| } | |
| /* COUNT-local benchmark */ | |
| static struct count_local_ctx { | |
| struct counter *hits; | |
| } count_local_ctx; | |
| static void count_local_setup() | |
| { | |
| struct count_local_ctx *ctx = &count_local_ctx; | |
| ctx->hits = calloc(env.consumer_cnt, sizeof(*ctx->hits)); | |
| if (!ctx->hits) | |
| exit(1); | |
| } | |
| static void *count_local_producer(void *input) | |
| { | |
| struct count_local_ctx *ctx = &count_local_ctx; | |
| int idx = (long)input; | |
| while (true) { | |
| atomic_inc(&ctx->hits[idx].value); | |
| } | |
| return NULL; | |
| } | |
| static void *count_local_consumer(void *input) | |
| { | |
| return NULL; | |
| } | |
| static void count_local_measure(struct bench_res *res) | |
| { | |
| struct count_local_ctx *ctx = &count_local_ctx; | |
| int i; | |
| for (i = 0; i < env.producer_cnt; i++) { | |
| res->hits += atomic_swap(&ctx->hits[i].value, 0); | |
| } | |
| } | |
| const struct bench bench_count_global = { | |
| .name = "count-global", | |
| .producer_thread = count_global_producer, | |
| .consumer_thread = count_global_consumer, | |
| .measure = count_global_measure, | |
| .report_progress = hits_drops_report_progress, | |
| .report_final = hits_drops_report_final, | |
| }; | |
| const struct bench bench_count_local = { | |
| .name = "count-local", | |
| .setup = count_local_setup, | |
| .producer_thread = count_local_producer, | |
| .consumer_thread = count_local_consumer, | |
| .measure = count_local_measure, | |
| .report_progress = hits_drops_report_progress, | |
| .report_final = hits_drops_report_final, | |
| }; |