From e734019216d531263702266d83b7fd87040f3f0b Mon Sep 17 00:00:00 2001 From: Joseph Henry Date: Wed, 21 Aug 2024 14:06:25 -0700 Subject: [PATCH] More platform-related build fixes --- osdep/EthernetTap.cpp | 10 ++++++---- osdep/EthernetTap.hpp | 2 ++ osdep/LinuxEthernetTap.cpp | 38 ++++++++------------------------------ osdep/LinuxEthernetTap.hpp | 2 ++ service/OneService.cpp | 2 ++ 5 files changed, 20 insertions(+), 34 deletions(-) diff --git a/osdep/EthernetTap.cpp b/osdep/EthernetTap.cpp index 02fab3d07..4395bc404 100644 --- a/osdep/EthernetTap.cpp +++ b/osdep/EthernetTap.cpp @@ -57,6 +57,8 @@ namespace ZeroTier { std::shared_ptr EthernetTap::newInstance( const char *tapDeviceType, // OS-specific, NULL for default + unsigned int concurrency, + bool pinning, const char *homePath, const MAC &mac, unsigned int mtu, @@ -92,7 +94,7 @@ std::shared_ptr EthernetTap::newInstance( #endif // __APPLE__ #ifdef __LINUX__ - return std::shared_ptr(new LinuxEthernetTap(homePath,mac,mtu,metric,nwid,friendlyName,handler,arg)); + return std::shared_ptr(new LinuxEthernetTap(homePath,concurrency,pinning,mac,mtu,metric,nwid,friendlyName,handler,arg)); #endif // __LINUX__ #ifdef __WINDOWS__ @@ -126,15 +128,15 @@ std::shared_ptr EthernetTap::newInstance( _comInit = true; } } - return std::shared_ptr(new WindowsEthernetTap(homePath,concurrency,mac,mtu,metric,nwid,friendlyName,handler,arg)); + return std::shared_ptr(new WindowsEthernetTap(homePath,mac,mtu,metric,nwid,friendlyName,handler,arg)); #endif // __WINDOWS__ #ifdef __FreeBSD__ - return std::shared_ptr(new BSDEthernetTap(homePath,concurrency,mac,mtu,metric,nwid,friendlyName,handler,arg)); + return std::shared_ptr(new BSDEthernetTap(homePath,concurrency,pinning,mac,mtu,metric,nwid,friendlyName,handler,arg)); #endif // __FreeBSD__ #ifdef __NetBSD__ - return std::shared_ptr(new NetBSDEthernetTap(homePath,concurrency,mac,mtu,metric,nwid,friendlyName,handler,arg)); + return std::shared_ptr(new NetBSDEthernetTap(homePath,mac,mtu,metric,nwid,friendlyName,handler,arg)); #endif // __NetBSD__ #ifdef __OpenBSD__ diff --git a/osdep/EthernetTap.hpp b/osdep/EthernetTap.hpp index e6833c33d..1d97f1256 100644 --- a/osdep/EthernetTap.hpp +++ b/osdep/EthernetTap.hpp @@ -32,6 +32,8 @@ class EthernetTap public: static std::shared_ptr newInstance( const char *tapDeviceType, // OS-specific, NULL for default + unsigned int concurrency, + bool pinning, const char *homePath, const MAC &mac, unsigned int mtu, diff --git a/osdep/LinuxEthernetTap.cpp b/osdep/LinuxEthernetTap.cpp index 7479ca742..14929d176 100644 --- a/osdep/LinuxEthernetTap.cpp +++ b/osdep/LinuxEthernetTap.cpp @@ -111,6 +111,8 @@ static void _base32_5_to_8(const uint8_t *in,char *out) LinuxEthernetTap::LinuxEthernetTap( const char *homePath, + unsigned int concurrency, + bool pinning, const MAC &mac, unsigned int mtu, unsigned int metric, @@ -220,36 +222,12 @@ LinuxEthernetTap::LinuxEthernetTap( (void)::pipe(_shutdownSignalPipe); - bool _enablePinning = false; - char* envvar = std::getenv("ZT_CORE_PINNING"); - if (envvar) { - int tmp = atoi(envvar); - if (tmp > 0) { - _enablePinning = true; - } - } + for (unsigned int i = 0; i < concurrency; ++i) { + _rxThreads.push_back(std::thread([this, i, concurrency, pinning] { - int _concurrency = 1; - char* concurrencyVar = std::getenv("ZT_PACKET_PROCESSING_CONCURRENCY"); - if (concurrencyVar) { - int tmp = atoi(concurrencyVar); - if (tmp > 0) { - _concurrency = tmp; - } - else { - _concurrency = std::max((unsigned int)1,std::thread::hardware_concurrency() / 2); - } - } - else { - _concurrency = std::max((unsigned int)1,std::thread::hardware_concurrency() / 2); - } - - for (unsigned int i = 0; i < _concurrency; ++i) { - _rxThreads.push_back(std::thread([this, i, _concurrency, _enablePinning] { - - if (_enablePinning) { - int pinCore = i % _concurrency; - fprintf(stderr, "pinning tap thread %d to core %d\n", i, pinCore); + if (pinning) { + int pinCore = i % concurrency; + fprintf(stderr, "Pinning tap thread %d to core %d\n", i, pinCore); pthread_t self = pthread_self(); cpu_set_t cpuset; CPU_ZERO(&cpuset); @@ -257,7 +235,7 @@ LinuxEthernetTap::LinuxEthernetTap( int rc = pthread_setaffinity_np(self, sizeof(cpu_set_t), &cpuset); if (rc != 0) { - fprintf(stderr, "failed to pin tap thread %d to core %d: %s\n", i, pinCore, strerror(errno)); + fprintf(stderr, "Failed to pin tap thread %d to core %d: %s\n", i, pinCore, strerror(errno)); exit(1); } } diff --git a/osdep/LinuxEthernetTap.hpp b/osdep/LinuxEthernetTap.hpp index 6406d88d8..41e299823 100644 --- a/osdep/LinuxEthernetTap.hpp +++ b/osdep/LinuxEthernetTap.hpp @@ -35,6 +35,8 @@ class LinuxEthernetTap : public EthernetTap public: LinuxEthernetTap( const char *homePath, + unsigned int concurrency, + bool pinning, const MAC &mac, unsigned int mtu, unsigned int metric, diff --git a/service/OneService.cpp b/service/OneService.cpp index 799f31412..acce0ec9f 100644 --- a/service/OneService.cpp +++ b/service/OneService.cpp @@ -3239,6 +3239,8 @@ public: n.setTap(EthernetTap::newInstance( nullptr, + _concurrency, + _cpuPinningEnabled, _homePath.c_str(), MAC(nwc->mac), nwc->mtu,