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_rename.c (3647B)


      1// SPDX-License-Identifier: GPL-2.0
      2/* Copyright (c) 2020 Facebook */
      3#include <fcntl.h>
      4#include "bench.h"
      5#include "test_overhead.skel.h"
      6
      7/* BPF triggering benchmarks */
      8static struct ctx {
      9	struct test_overhead *skel;
     10	struct counter hits;
     11	int fd;
     12} ctx;
     13
     14static void validate(void)
     15{
     16	if (env.producer_cnt != 1) {
     17		fprintf(stderr, "benchmark doesn't support multi-producer!\n");
     18		exit(1);
     19	}
     20	if (env.consumer_cnt != 1) {
     21		fprintf(stderr, "benchmark doesn't support multi-consumer!\n");
     22		exit(1);
     23	}
     24}
     25
     26static void *producer(void *input)
     27{
     28	char buf[] = "test_overhead";
     29	int err;
     30
     31	while (true) {
     32		err = write(ctx.fd, buf, sizeof(buf));
     33		if (err < 0) {
     34			fprintf(stderr, "write failed\n");
     35			exit(1);
     36		}
     37		atomic_inc(&ctx.hits.value);
     38	}
     39}
     40
     41static void measure(struct bench_res *res)
     42{
     43	res->hits = atomic_swap(&ctx.hits.value, 0);
     44}
     45
     46static void setup_ctx(void)
     47{
     48	setup_libbpf();
     49
     50	ctx.skel = test_overhead__open_and_load();
     51	if (!ctx.skel) {
     52		fprintf(stderr, "failed to open skeleton\n");
     53		exit(1);
     54	}
     55
     56	ctx.fd = open("/proc/self/comm", O_WRONLY|O_TRUNC);
     57	if (ctx.fd < 0) {
     58		fprintf(stderr, "failed to open /proc/self/comm: %d\n", -errno);
     59		exit(1);
     60	}
     61}
     62
     63static void attach_bpf(struct bpf_program *prog)
     64{
     65	struct bpf_link *link;
     66
     67	link = bpf_program__attach(prog);
     68	if (!link) {
     69		fprintf(stderr, "failed to attach program!\n");
     70		exit(1);
     71	}
     72}
     73
     74static void setup_base(void)
     75{
     76	setup_ctx();
     77}
     78
     79static void setup_kprobe(void)
     80{
     81	setup_ctx();
     82	attach_bpf(ctx.skel->progs.prog1);
     83}
     84
     85static void setup_kretprobe(void)
     86{
     87	setup_ctx();
     88	attach_bpf(ctx.skel->progs.prog2);
     89}
     90
     91static void setup_rawtp(void)
     92{
     93	setup_ctx();
     94	attach_bpf(ctx.skel->progs.prog3);
     95}
     96
     97static void setup_fentry(void)
     98{
     99	setup_ctx();
    100	attach_bpf(ctx.skel->progs.prog4);
    101}
    102
    103static void setup_fexit(void)
    104{
    105	setup_ctx();
    106	attach_bpf(ctx.skel->progs.prog5);
    107}
    108
    109static void *consumer(void *input)
    110{
    111	return NULL;
    112}
    113
    114const struct bench bench_rename_base = {
    115	.name = "rename-base",
    116	.validate = validate,
    117	.setup = setup_base,
    118	.producer_thread = producer,
    119	.consumer_thread = consumer,
    120	.measure = measure,
    121	.report_progress = hits_drops_report_progress,
    122	.report_final = hits_drops_report_final,
    123};
    124
    125const struct bench bench_rename_kprobe = {
    126	.name = "rename-kprobe",
    127	.validate = validate,
    128	.setup = setup_kprobe,
    129	.producer_thread = producer,
    130	.consumer_thread = consumer,
    131	.measure = measure,
    132	.report_progress = hits_drops_report_progress,
    133	.report_final = hits_drops_report_final,
    134};
    135
    136const struct bench bench_rename_kretprobe = {
    137	.name = "rename-kretprobe",
    138	.validate = validate,
    139	.setup = setup_kretprobe,
    140	.producer_thread = producer,
    141	.consumer_thread = consumer,
    142	.measure = measure,
    143	.report_progress = hits_drops_report_progress,
    144	.report_final = hits_drops_report_final,
    145};
    146
    147const struct bench bench_rename_rawtp = {
    148	.name = "rename-rawtp",
    149	.validate = validate,
    150	.setup = setup_rawtp,
    151	.producer_thread = producer,
    152	.consumer_thread = consumer,
    153	.measure = measure,
    154	.report_progress = hits_drops_report_progress,
    155	.report_final = hits_drops_report_final,
    156};
    157
    158const struct bench bench_rename_fentry = {
    159	.name = "rename-fentry",
    160	.validate = validate,
    161	.setup = setup_fentry,
    162	.producer_thread = producer,
    163	.consumer_thread = consumer,
    164	.measure = measure,
    165	.report_progress = hits_drops_report_progress,
    166	.report_final = hits_drops_report_final,
    167};
    168
    169const struct bench bench_rename_fexit = {
    170	.name = "rename-fexit",
    171	.validate = validate,
    172	.setup = setup_fexit,
    173	.producer_thread = producer,
    174	.consumer_thread = consumer,
    175	.measure = measure,
    176	.report_progress = hits_drops_report_progress,
    177	.report_final = hits_drops_report_final,
    178};