From 5398ce49d44a422a830c534a2e0b7bccba89bd39 Mon Sep 17 00:00:00 2001 From: kartnema Date: Fri, 20 Feb 2026 11:57:04 +0530 Subject: [PATCH 1/2] Add duplicate checks --- .../ContextualClassifier.cpp | 5 +++++ .../Include/ContextualClassifier.h | 18 ++++++++++------- modula/CoreModules/AuxRoutines.cpp | 20 +++++++++++++++++++ modula/CoreModules/Include/AuxRoutines.h | 19 ++++++++++++++++-- resource-tuner/core/Include/RequestManager.h | 15 +------------- resource-tuner/core/RequestManager.cpp | 20 ------------------- 6 files changed, 54 insertions(+), 43 deletions(-) diff --git a/contextual-classifier/ContextualClassifier.cpp b/contextual-classifier/ContextualClassifier.cpp index d29b03534..1b28ca28a 100644 --- a/contextual-classifier/ContextualClassifier.cpp +++ b/contextual-classifier/ContextualClassifier.cpp @@ -326,7 +326,12 @@ int32_t ContextualClassifier::HandleProcEv() { case CC_APP_OPEN: if(!this->shouldProcBeIgnored(ev.type, ev.pid)) { const std::lock_guard lock(mQueueMutex); + if(this->mClassifierPidCache.isPresent(ev.pid)) { + // Duplicate Notification, skip. + continue; + } this->mPendingEv.push(ev); + this->mClassifierPidCache.insert(ev.pid); if(this->mPendingEv.size() > pendingQueueControlSize) { this->mPendingEv.pop(); } diff --git a/contextual-classifier/Include/ContextualClassifier.h b/contextual-classifier/Include/ContextualClassifier.h index 7604e1536..65aa501f5 100644 --- a/contextual-classifier/Include/ContextualClassifier.h +++ b/contextual-classifier/Include/ContextualClassifier.h @@ -4,19 +4,20 @@ #ifndef CONTEXTUAL_CLASSIFIER_H #define CONTEXTUAL_CLASSIFIER_H -#include "ComponentRegistry.h" -#include "NetLinkComm.h" -#include "AppConfigs.h" -#include "Resource.h" - -#include #include #include #include +#include #include #include #include -#include +#include + +#include "Resource.h" +#include "AppConfigs.h" +#include "NetLinkComm.h" +#include "AuxRoutines.h" +#include "ComponentRegistry.h" class Inference; @@ -65,6 +66,9 @@ class ContextualClassifier { Inference *mInference; std::vector mCurrRestuneHandles; + // PID cache to check for duplicates + MinLRUCache mClassifierPidCache; + // Event queue for classifier main thread std::queue mPendingEv; std::mutex mQueueMutex; diff --git a/modula/CoreModules/AuxRoutines.cpp b/modula/CoreModules/AuxRoutines.cpp index 6fe5b1a51..c246addb8 100644 --- a/modula/CoreModules/AuxRoutines.cpp +++ b/modula/CoreModules/AuxRoutines.cpp @@ -244,3 +244,23 @@ int64_t AuxRoutines::getCurrentTimeInMilliseconds() { auto now = std::chrono::system_clock::now(); return std::chrono::duration_cast(now.time_since_epoch()).count(); } + +MinLRUCache::MinLRUCache(int32_t maxSize) { + this->mMaxSize = maxSize; + this->mDataSet.reserve(this->mMaxSize); +} + +void MinLRUCache::insert(int64_t data) { + if(this->mDataSet.size() >= this->mMaxSize) { + int64_t oldestElement = this->mRecencyQueue.front(); + this->mRecencyQueue.pop(); + this->mDataSet.erase(oldestElement); + } + + this->mDataSet.insert(data); + this->mRecencyQueue.push(data); +} + +int8_t MinLRUCache::isPresent(int64_t data) { + return (this->mDataSet.find(data) != this->mDataSet.end()); +} diff --git a/modula/CoreModules/Include/AuxRoutines.h b/modula/CoreModules/Include/AuxRoutines.h index 83aff768d..de91a2c21 100644 --- a/modula/CoreModules/Include/AuxRoutines.h +++ b/modula/CoreModules/Include/AuxRoutines.h @@ -4,19 +4,21 @@ #ifndef AUX_ROUTINES_H #define AUX_ROUTINES_H +#include +#include #include #include #include #include #include #include -#include #include #include +#include #include "Logger.h" -#include "Request.h" #include "Signal.h" +#include "Request.h" #include "UrmSettings.h" #include "ClientEndpoint.h" @@ -98,4 +100,17 @@ class ConnectionManager { } }; +class MinLRUCache { +private: + size_t mMaxSize; + std::unordered_set mDataSet; + std::queue mRecencyQueue; + +public: + MinLRUCache(int32_t maxSize = 30); + + void insert(int64_t data); + int8_t isPresent(int64_t data); +}; + #endif diff --git a/resource-tuner/core/Include/RequestManager.h b/resource-tuner/core/Include/RequestManager.h index 86ed82cb7..ed6f6cdef 100644 --- a/resource-tuner/core/Include/RequestManager.h +++ b/resource-tuner/core/Include/RequestManager.h @@ -26,19 +26,6 @@ enum RequestProcessingStatus : int8_t { REQ_NOT_FOUND = 0x08, }; -class HandleCache { -private: - size_t mMaxSize; - std::unordered_set mHandleSet; - std::queue mRecencyQueue; - -public: - HandleCache(int32_t maxSize = 30); - - void insert(int64_t handle); - int8_t isPresent(int64_t handle); -}; - /** * @brief RequestManager * @details Responsible for Tracking and Maintaining all the active Requests, currently @@ -54,7 +41,7 @@ class RequestManager { int64_t mTotalRequestServed; std::unordered_set mRequestsList[2]; std::unordered_map mActiveRequests; - HandleCache mUntuneCache; + MinLRUCache mUntuneCache; std::shared_timed_mutex mRequestMapMutex; RequestManager(); diff --git a/resource-tuner/core/RequestManager.cpp b/resource-tuner/core/RequestManager.cpp index c2351f966..61edac48b 100644 --- a/resource-tuner/core/RequestManager.cpp +++ b/resource-tuner/core/RequestManager.cpp @@ -291,23 +291,3 @@ void RequestManager::clearPending() { } RequestManager::~RequestManager() {} - -HandleCache::HandleCache(int32_t maxSize) { - this->mMaxSize = maxSize; - this->mHandleSet.reserve(this->mMaxSize); -} - -void HandleCache::insert(int64_t handle) { - if(this->mHandleSet.size() >= this->mMaxSize) { - int64_t oldestHandle = this->mRecencyQueue.front(); - this->mRecencyQueue.pop(); - this->mHandleSet.erase(oldestHandle); - } - - this->mHandleSet.insert(handle); - this->mRecencyQueue.push(handle); -} - -int8_t HandleCache::isPresent(int64_t handle) { - return (this->mHandleSet.find(handle) != this->mHandleSet.end()); -} From 6b7a2f0795081bfd23adf4f6d6e278cd2631161b Mon Sep 17 00:00:00 2001 From: kartnema Date: Fri, 20 Feb 2026 14:01:32 +0530 Subject: [PATCH 2/2] Minor Changes --- contextual-classifier/ContextualClassifier.cpp | 5 +++-- contextual-classifier/Include/ContextualClassifier.h | 7 ++----- modula/CoreModules/Include/UrmSettings.h | 1 - modula/CoreModules/UrmSettings.cpp | 3 --- 4 files changed, 5 insertions(+), 11 deletions(-) diff --git a/contextual-classifier/ContextualClassifier.cpp b/contextual-classifier/ContextualClassifier.cpp index 1b28ca28a..57c3b7958 100644 --- a/contextual-classifier/ContextualClassifier.cpp +++ b/contextual-classifier/ContextualClassifier.cpp @@ -328,7 +328,7 @@ int32_t ContextualClassifier::HandleProcEv() { const std::lock_guard lock(mQueueMutex); if(this->mClassifierPidCache.isPresent(ev.pid)) { // Duplicate Notification, skip. - continue; + break; } this->mPendingEv.push(ev); this->mClassifierPidCache.insert(ev.pid); @@ -389,7 +389,8 @@ void ContextualClassifier::ApplyActions(uint32_t sigId, uint32_t sigType, pid_t incomingPID, pid_t incomingTID) { - Request* request = createTuneRequestFromSignal(sigId, sigType, incomingPID, incomingTID); + Request* request = + createTuneRequestFromSignal(sigId, sigType, incomingPID, incomingTID); if(request != nullptr) { if(request->getResourcesCount() > 0) { // Record: diff --git a/contextual-classifier/Include/ContextualClassifier.h b/contextual-classifier/Include/ContextualClassifier.h index 65aa501f5..f5dc2c97d 100644 --- a/contextual-classifier/Include/ContextualClassifier.h +++ b/contextual-classifier/Include/ContextualClassifier.h @@ -113,17 +113,14 @@ class ContextualClassifier { int32_t cgroupIdentifier); void configureAppSignals(pid_t incomingPID, - pid_t incomingTID, - const std::string& comm); + pid_t incomingTID, + const std::string& comm); void untuneRequestHelper(int64_t handle); public: ContextualClassifier(); ~ContextualClassifier(); - Inference *getInference() { - return mInference; - } ErrCode Init(); ErrCode Terminate(); diff --git a/modula/CoreModules/Include/UrmSettings.h b/modula/CoreModules/Include/UrmSettings.h index 1dba956d6..ca8befd62 100644 --- a/modula/CoreModules/Include/UrmSettings.h +++ b/modula/CoreModules/Include/UrmSettings.h @@ -79,7 +79,6 @@ class UrmSettings { static const std::string mDeviceNamePath; static const std::string mBaseCGroupPath; static const std::string mPersistenceFile; - static const std::string mExtensionPluginsLibPath; // Target Information Stores static MetaConfigs metaConfigs; diff --git a/modula/CoreModules/UrmSettings.cpp b/modula/CoreModules/UrmSettings.cpp index 74704563b..2d2509549 100644 --- a/modula/CoreModules/UrmSettings.cpp +++ b/modula/CoreModules/UrmSettings.cpp @@ -52,9 +52,6 @@ const std::string UrmSettings::mCustomAppConfigPath = const std::string UrmSettings::mDevIndexedAppPath = "/etc/urm/target/PerApp.yaml"; -const std::string UrmSettings::mExtensionPluginsLibPath = - "/usr/lib/urm/"; - const std::string UrmSettings::mDeviceNamePath = "/sys/devices/soc0/machine"; const std::string UrmSettings::mBaseCGroupPath =