1 // SPDX-License-Identifier: GPL-2.0 2 /* Copyright (c) 2020 Facebook */ 3 #include "bench.h" 4 5 /* COUNT-GLOBAL benchmark */ 6 7 static struct count_global_ctx { 8 struct counter hits; 9 } count_global_ctx; 10 11 static 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 21 static 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 30 static struct count_local_ctx { 31 struct counter *hits; 32 } count_local_ctx; 33 34 static 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 43 static 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 54 static 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 64 const 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 72 const 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