From e8c84d0c35f8d37a3c5d378af736dcdd990d06de Mon Sep 17 00:00:00 2001 From: yunwei37 <1067852565@qq.com> Date: Mon, 23 Jan 2023 18:58:00 +0800 Subject: [PATCH] fix hardirqs --- 10-hardirqs/bits.bpf.h | 31 +++++++++++++++++++++++++++ 10-hardirqs/hardirqs.bpf.c | 7 +++++- 10-hardirqs/{hardirq.h => hardirqs.h} | 4 ---- 10-hardirqs/maps.bpf.h | 26 ++++++++++++++++++++++ 4 files changed, 63 insertions(+), 5 deletions(-) create mode 100644 10-hardirqs/bits.bpf.h rename 10-hardirqs/{hardirq.h => hardirqs.h} (84%) create mode 100644 10-hardirqs/maps.bpf.h diff --git a/10-hardirqs/bits.bpf.h b/10-hardirqs/bits.bpf.h new file mode 100644 index 0000000..a2b7bb9 --- /dev/null +++ b/10-hardirqs/bits.bpf.h @@ -0,0 +1,31 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ +#ifndef __BITS_BPF_H +#define __BITS_BPF_H + +#define READ_ONCE(x) (*(volatile typeof(x) *)&(x)) +#define WRITE_ONCE(x, val) ((*(volatile typeof(x) *)&(x)) = val) + +static __always_inline u64 log2(u32 v) +{ + u32 shift, r; + + r = (v > 0xFFFF) << 4; v >>= r; + shift = (v > 0xFF) << 3; v >>= shift; r |= shift; + shift = (v > 0xF) << 2; v >>= shift; r |= shift; + shift = (v > 0x3) << 1; v >>= shift; r |= shift; + r |= (v >> 1); + + return r; +} + +static __always_inline u64 log2l(u64 v) +{ + u32 hi = v >> 32; + + if (hi) + return log2(hi) + 32; + else + return log2(v); +} + +#endif /* __BITS_BPF_H */ diff --git a/10-hardirqs/hardirqs.bpf.c b/10-hardirqs/hardirqs.bpf.c index 14c12d9..bbfef05 100644 --- a/10-hardirqs/hardirqs.bpf.c +++ b/10-hardirqs/hardirqs.bpf.c @@ -15,6 +15,10 @@ const volatile bool targ_dist = false; const volatile bool targ_ns = false; const volatile bool do_count = false; +struct irq_key { + char name[32]; +}; + struct { __uint(type, BPF_MAP_TYPE_CGROUP_ARRAY); __type(key, u32); @@ -29,6 +33,7 @@ struct { __type(value, u64); } start SEC(".maps"); +/// @sample {"interval": 1000, "type" : "log2_hist"} struct { __uint(type, BPF_MAP_TYPE_HASH); __uint(max_entries, MAX_ENTRIES); @@ -127,4 +132,4 @@ int BPF_PROG(irq_handler_exit, int irq, struct irqaction *action) return handle_exit(irq, action); } -char LICENSE[] SEC("license") = "GPL"; \ No newline at end of file +char LICENSE[] SEC("license") = "GPL"; diff --git a/10-hardirqs/hardirq.h b/10-hardirqs/hardirqs.h similarity index 84% rename from 10-hardirqs/hardirq.h rename to 10-hardirqs/hardirqs.h index 97fec18..22a1898 100644 --- a/10-hardirqs/hardirq.h +++ b/10-hardirqs/hardirqs.h @@ -4,10 +4,6 @@ #define MAX_SLOTS 20 -struct irq_key { - char name[32]; -}; - struct info { __u64 count; __u32 slots[MAX_SLOTS]; diff --git a/10-hardirqs/maps.bpf.h b/10-hardirqs/maps.bpf.h new file mode 100644 index 0000000..51d1012 --- /dev/null +++ b/10-hardirqs/maps.bpf.h @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) +// Copyright (c) 2020 Anton Protopopov +#ifndef __MAPS_BPF_H +#define __MAPS_BPF_H + +#include +#include + +static __always_inline void * +bpf_map_lookup_or_try_init(void *map, const void *key, const void *init) +{ + void *val; + long err; + + val = bpf_map_lookup_elem(map, key); + if (val) + return val; + + err = bpf_map_update_elem(map, key, init, BPF_NOEXIST); + if (err && err != -EEXIST) + return 0; + + return bpf_map_lookup_elem(map, key); +} + +#endif /* __MAPS_BPF_H */