bench.h 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #pragma once
  3. #include <stdlib.h>
  4. #include <stdbool.h>
  5. #include <linux/err.h>
  6. #include <errno.h>
  7. #include <unistd.h>
  8. #include <bpf/bpf.h>
  9. #include <bpf/libbpf.h>
  10. #include <math.h>
  11. #include <time.h>
  12. #include <sys/syscall.h>
  13. #include <limits.h>
  14. struct cpu_set {
  15. bool *cpus;
  16. int cpus_len;
  17. int next_cpu;
  18. };
  19. struct env {
  20. char *bench_name;
  21. int duration_sec;
  22. int warmup_sec;
  23. bool verbose;
  24. bool list;
  25. bool affinity;
  26. bool quiet;
  27. bool stacktrace;
  28. int consumer_cnt;
  29. int producer_cnt;
  30. int nr_cpus;
  31. struct cpu_set prod_cpus;
  32. struct cpu_set cons_cpus;
  33. };
  34. struct basic_stats {
  35. double mean;
  36. double stddev;
  37. };
  38. struct bench_res {
  39. long hits;
  40. long drops;
  41. long false_hits;
  42. long important_hits;
  43. unsigned long gp_ns;
  44. unsigned long gp_ct;
  45. unsigned int stime;
  46. unsigned long duration_ns;
  47. };
  48. struct bench {
  49. const char *name;
  50. const struct argp *argp;
  51. void (*validate)(void);
  52. void (*setup)(void);
  53. void *(*producer_thread)(void *ctx);
  54. void *(*consumer_thread)(void *ctx);
  55. void (*measure)(struct bench_res* res);
  56. void (*report_progress)(int iter, struct bench_res* res, long delta_ns);
  57. void (*report_final)(struct bench_res res[], int res_cnt);
  58. };
  59. struct counter {
  60. long value;
  61. } __attribute__((aligned(128)));
  62. extern struct env env;
  63. extern const struct bench *bench;
  64. void setup_libbpf(void);
  65. void hits_drops_report_progress(int iter, struct bench_res *res, long delta_ns);
  66. void hits_drops_report_final(struct bench_res res[], int res_cnt);
  67. void false_hits_report_progress(int iter, struct bench_res *res, long delta_ns);
  68. void false_hits_report_final(struct bench_res res[], int res_cnt);
  69. void ops_report_progress(int iter, struct bench_res *res, long delta_ns);
  70. void ops_report_final(struct bench_res res[], int res_cnt);
  71. void local_storage_report_progress(int iter, struct bench_res *res,
  72. long delta_ns);
  73. void local_storage_report_final(struct bench_res res[], int res_cnt);
  74. void grace_period_latency_basic_stats(struct bench_res res[], int res_cnt,
  75. struct basic_stats *gp_stat);
  76. void grace_period_ticks_basic_stats(struct bench_res res[], int res_cnt,
  77. struct basic_stats *gp_stat);
  78. static inline void atomic_inc(long *value)
  79. {
  80. (void)__atomic_add_fetch(value, 1, __ATOMIC_RELAXED);
  81. }
  82. static inline void atomic_add(long *value, long n)
  83. {
  84. (void)__atomic_add_fetch(value, n, __ATOMIC_RELAXED);
  85. }
  86. static inline long atomic_swap(long *value, long n)
  87. {
  88. return __atomic_exchange_n(value, n, __ATOMIC_RELAXED);
  89. }