1// SPDX-License-Identifier: GPL-2.0 2/* Copyright (c) 2020 Facebook */ 3#include "bench.h" 4 5/* COUNT-GLOBAL benchmark */ 6 7static struct count_global_ctx { 8 struct counter hits; 9} count_global_ctx; 10 11static void *count_global_producer(void *input) 12{ 13 struct count_global_ctx *ctx = &count_global_ctx; 14 15 while (true) { 16 atomic_inc(&ctx->hits.value); 17 } 18 return NULL; 19} 20 21static void count_global_measure(struct bench_res *res) 22{ 23 struct count_global_ctx *ctx = &count_global_ctx; 24 25 res->hits = atomic_swap(&ctx->hits.value, 0); 26} 27 28/* COUNT-local benchmark */ 29 30static struct count_local_ctx { 31 struct counter *hits; 32} count_local_ctx; 33 34static void count_local_setup(void) 35{ 36 struct count_local_ctx *ctx = &count_local_ctx; 37 38 ctx->hits = calloc(env.producer_cnt, sizeof(*ctx->hits)); 39 if (!ctx->hits) 40 exit(1); 41} 42 43static void *count_local_producer(void *input) 44{ 45 struct count_local_ctx *ctx = &count_local_ctx; 46 int idx = (long)input; 47 48 while (true) { 49 atomic_inc(&ctx->hits[idx].value); 50 } 51 return NULL; 52} 53 54static void count_local_measure(struct bench_res *res) 55{ 56 struct count_local_ctx *ctx = &count_local_ctx; 57 int i; 58 59 for (i = 0; i < env.producer_cnt; i++) { 60 res->hits += atomic_swap(&ctx->hits[i].value, 0); 61 } 62} 63 64const struct bench bench_count_global = { 65 .name = "count-global", 66 .producer_thread = count_global_producer, 67 .measure = count_global_measure, 68 .report_progress = hits_drops_report_progress, 69 .report_final = hits_drops_report_final, 70}; 71 72const struct bench bench_count_local = { 73 .name = "count-local", 74 .setup = count_local_setup, 75 .producer_thread = count_local_producer, 76 .measure = count_local_measure, 77 .report_progress = hits_drops_report_progress, 78 .report_final = hits_drops_report_final, 79}; 80