From a22d4e1061eeb69484025208ec2198ab32b31368 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20=C5=BBenczykowski?= Date: Sat, 13 Sep 2025 03:21:47 -0700 Subject: [PATCH] BpfNetworkStats: use `atomic` for ifindex cache when possible MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Test: TreeHugger Flag: EXEMPT BUGFIX Signed-off-by: Maciej Żenczykowski Change-Id: Ibc24f079711c36a8bc6ff850fc5b07fb6546b3ae --- .../libs/libnetworkstats/BpfNetworkStats.cpp | 29 ++++++++++++++----- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/service-t/native/libs/libnetworkstats/BpfNetworkStats.cpp b/service-t/native/libs/libnetworkstats/BpfNetworkStats.cpp index da01ed6400..ae8dbbe321 100644 --- a/service-t/native/libs/libnetworkstats/BpfNetworkStats.cpp +++ b/service-t/native/libs/libnetworkstats/BpfNetworkStats.cpp @@ -50,23 +50,38 @@ const BpfMapRO& getIfaceStatsMap() { return ifaceStatsMap; } -#ifndef __riscv -#ifndef __ILP32__ +static constexpr unsigned cacheSize = 1024; // see 'iface_index_name_map' bpf map size + +#if !defined(__ILP32__) && !defined(__riscv) static_assert(std::atomic::is_always_lock_free, "Error: 16-byte IfaceValue is not lock-free on this platform!"); -#endif +#define CACHE_IS_ATOMIC +static std::atomic cache[cacheSize]; +#else +static IfaceValue cache[cacheSize]; #endif -static constexpr unsigned cacheSize = 1024; // see 'iface_index_name_map' bpf map size -static IfaceValue cache[cacheSize]; static inline const IfaceValue& updateCache(unsigned i, const IfaceValue &v) { - if (i < cacheSize) cache[i] = v; + if (i < cacheSize) { +#ifdef CACHE_IS_ATOMIC + cache[i].store(v, std::memory_order_relaxed); +#else + cache[i] = v; +#endif + } return v; } Result ifindex2name(const uint32_t ifindex) { - if (ifindex < cacheSize && cache[ifindex].name[0]) return cache[ifindex]; + if (ifindex < cacheSize) { +#ifdef CACHE_IS_ATOMIC + IfaceValue c = cache[ifindex].load(std::memory_order_relaxed); +#else + IfaceValue c = cache[ifindex]; +#endif + if (c.name[0]) return c; + } Result v = getIfaceIndexNameMap().readValue(ifindex); if (v.ok()) return updateCache(ifindex, v.value());