| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- /* SPDX-License-Identifier: GPL-2.0 */
- #pragma once
- #include <stdlib.h>
- #include <stdbool.h>
- #include <linux/err.h>
- #include <errno.h>
- #include <unistd.h>
- #include <bpf/bpf.h>
- #include <bpf/libbpf.h>
- #include <math.h>
- #include <time.h>
- #include <sys/syscall.h>
- #include <limits.h>
- struct cpu_set {
- bool *cpus;
- int cpus_len;
- int next_cpu;
- };
- struct env {
- char *bench_name;
- int duration_sec;
- int warmup_sec;
- bool verbose;
- bool list;
- bool affinity;
- bool quiet;
- bool stacktrace;
- int consumer_cnt;
- int producer_cnt;
- int nr_cpus;
- struct cpu_set prod_cpus;
- struct cpu_set cons_cpus;
- };
- struct basic_stats {
- double mean;
- double stddev;
- };
- struct bench_res {
- long hits;
- long drops;
- long false_hits;
- long important_hits;
- unsigned long gp_ns;
- unsigned long gp_ct;
- unsigned int stime;
- unsigned long duration_ns;
- };
- struct bench {
- const char *name;
- const struct argp *argp;
- void (*validate)(void);
- void (*setup)(void);
- void *(*producer_thread)(void *ctx);
- void *(*consumer_thread)(void *ctx);
- void (*measure)(struct bench_res* res);
- void (*report_progress)(int iter, struct bench_res* res, long delta_ns);
- void (*report_final)(struct bench_res res[], int res_cnt);
- };
- struct counter {
- long value;
- } __attribute__((aligned(128)));
- extern struct env env;
- extern const struct bench *bench;
- void setup_libbpf(void);
- void hits_drops_report_progress(int iter, struct bench_res *res, long delta_ns);
- void hits_drops_report_final(struct bench_res res[], int res_cnt);
- void false_hits_report_progress(int iter, struct bench_res *res, long delta_ns);
- void false_hits_report_final(struct bench_res res[], int res_cnt);
- void ops_report_progress(int iter, struct bench_res *res, long delta_ns);
- void ops_report_final(struct bench_res res[], int res_cnt);
- void local_storage_report_progress(int iter, struct bench_res *res,
- long delta_ns);
- void local_storage_report_final(struct bench_res res[], int res_cnt);
- void grace_period_latency_basic_stats(struct bench_res res[], int res_cnt,
- struct basic_stats *gp_stat);
- void grace_period_ticks_basic_stats(struct bench_res res[], int res_cnt,
- struct basic_stats *gp_stat);
- static inline void atomic_inc(long *value)
- {
- (void)__atomic_add_fetch(value, 1, __ATOMIC_RELAXED);
- }
- static inline void atomic_add(long *value, long n)
- {
- (void)__atomic_add_fetch(value, n, __ATOMIC_RELAXED);
- }
- static inline long atomic_swap(long *value, long n)
- {
- return __atomic_exchange_n(value, n, __ATOMIC_RELAXED);
- }
|