cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

bench_bpf_loop.c (1868B)


      1// SPDX-License-Identifier: GPL-2.0
      2/* Copyright (c) 2021 Facebook */
      3
      4#include <argp.h>
      5#include "bench.h"
      6#include "bpf_loop_bench.skel.h"
      7
      8/* BPF triggering benchmarks */
      9static struct ctx {
     10	struct bpf_loop_bench *skel;
     11} ctx;
     12
     13static struct {
     14	__u32 nr_loops;
     15} args = {
     16	.nr_loops = 10,
     17};
     18
     19enum {
     20	ARG_NR_LOOPS = 4000,
     21};
     22
     23static const struct argp_option opts[] = {
     24	{ "nr_loops", ARG_NR_LOOPS, "nr_loops", 0,
     25		"Set number of loops for the bpf_loop helper"},
     26	{},
     27};
     28
     29static error_t parse_arg(int key, char *arg, struct argp_state *state)
     30{
     31	switch (key) {
     32	case ARG_NR_LOOPS:
     33		args.nr_loops = strtol(arg, NULL, 10);
     34		break;
     35	default:
     36		return ARGP_ERR_UNKNOWN;
     37	}
     38
     39	return 0;
     40}
     41
     42/* exported into benchmark runner */
     43const struct argp bench_bpf_loop_argp = {
     44	.options = opts,
     45	.parser = parse_arg,
     46};
     47
     48static void validate(void)
     49{
     50	if (env.consumer_cnt != 1) {
     51		fprintf(stderr, "benchmark doesn't support multi-consumer!\n");
     52		exit(1);
     53	}
     54}
     55
     56static void *producer(void *input)
     57{
     58	while (true)
     59		/* trigger the bpf program */
     60		syscall(__NR_getpgid);
     61
     62	return NULL;
     63}
     64
     65static void *consumer(void *input)
     66{
     67	return NULL;
     68}
     69
     70static void measure(struct bench_res *res)
     71{
     72	res->hits = atomic_swap(&ctx.skel->bss->hits, 0);
     73}
     74
     75static void setup(void)
     76{
     77	struct bpf_link *link;
     78
     79	setup_libbpf();
     80
     81	ctx.skel = bpf_loop_bench__open_and_load();
     82	if (!ctx.skel) {
     83		fprintf(stderr, "failed to open skeleton\n");
     84		exit(1);
     85	}
     86
     87	link = bpf_program__attach(ctx.skel->progs.benchmark);
     88	if (!link) {
     89		fprintf(stderr, "failed to attach program!\n");
     90		exit(1);
     91	}
     92
     93	ctx.skel->bss->nr_loops = args.nr_loops;
     94}
     95
     96const struct bench bench_bpf_loop = {
     97	.name = "bpf-loop",
     98	.validate = validate,
     99	.setup = setup,
    100	.producer_thread = producer,
    101	.consumer_thread = consumer,
    102	.measure = measure,
    103	.report_progress = ops_report_progress,
    104	.report_final = ops_report_final,
    105};