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());