bench.h 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  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. int consumer_cnt;
  28. int producer_cnt;
  29. int nr_cpus;
  30. struct cpu_set prod_cpus;
  31. struct cpu_set cons_cpus;
  32. };
  33. struct basic_stats {
  34. double mean;
  35. double stddev;
  36. };
  37. struct bench_res {
  38. long hits;
  39. long drops;
  40. long false_hits;
  41. long important_hits;
  42. unsigned long gp_ns;
  43. unsigned long gp_ct;
  44. unsigned int stime;
  45. };
  46. struct bench {
  47. const char *name;
  48. const struct argp *argp;
  49. void (*validate)(void);
  50. void (*setup)(void);
  51. void *(*producer_thread)(void *ctx);
  52. void *(*consumer_thread)(void *ctx);
  53. void (*measure)(struct bench_res* res);
  54. void (*report_progress)(int iter, struct bench_res* res, long delta_ns);
  55. void (*report_final)(struct bench_res res[], int res_cnt);
  56. };
  57. struct counter {
  58. long value;
  59. } __attribute__((aligned(128)));
  60. extern struct env env;
  61. extern const struct bench *bench;
  62. void setup_libbpf(void);
  63. void hits_drops_report_progress(int iter, struct bench_res *res, long delta_ns);
  64. void hits_drops_report_final(struct bench_res res[], int res_cnt);
  65. void false_hits_report_progress(int iter, struct bench_res *res, long delta_ns);
  66. void false_hits_report_final(struct bench_res res[], int res_cnt);
  67. void ops_report_progress(int iter, struct bench_res *res, long delta_ns);
  68. void ops_report_final(struct bench_res res[], int res_cnt);
  69. void local_storage_report_progress(int iter, struct bench_res *res,
  70. long delta_ns);
  71. void local_storage_report_final(struct bench_res res[], int res_cnt);
  72. void grace_period_latency_basic_stats(struct bench_res res[], int res_cnt,
  73. struct basic_stats *gp_stat);
  74. void grace_period_ticks_basic_stats(struct bench_res res[], int res_cnt,
  75. struct basic_stats *gp_stat);
  76. static inline void atomic_inc(long *value)
  77. {
  78. (void)__atomic_add_fetch(value, 1, __ATOMIC_RELAXED);
  79. }
  80. static inline void atomic_add(long *value, long n)
  81. {
  82. (void)__atomic_add_fetch(value, n, __ATOMIC_RELAXED);
  83. }
  84. static inline long atomic_swap(long *value, long n)
  85. {
  86. return __atomic_exchange_n(value, n, __ATOMIC_RELAXED);
  87. }