1*ec779b8eSAndroid Build Coastguard Worker /* 2*ec779b8eSAndroid Build Coastguard Worker ** 3*ec779b8eSAndroid Build Coastguard Worker ** Copyright 2023, The Android Open Source Project 4*ec779b8eSAndroid Build Coastguard Worker ** 5*ec779b8eSAndroid Build Coastguard Worker ** Licensed under the Apache License, Version 2.0 (the "License"); 6*ec779b8eSAndroid Build Coastguard Worker ** you may not use this file except in compliance with the License. 7*ec779b8eSAndroid Build Coastguard Worker ** You may obtain a copy of the License at 8*ec779b8eSAndroid Build Coastguard Worker ** 9*ec779b8eSAndroid Build Coastguard Worker ** http://www.apache.org/licenses/LICENSE-2.0 10*ec779b8eSAndroid Build Coastguard Worker ** 11*ec779b8eSAndroid Build Coastguard Worker ** Unless required by applicable law or agreed to in writing, software 12*ec779b8eSAndroid Build Coastguard Worker ** distributed under the License is distributed on an "AS IS" BASIS, 13*ec779b8eSAndroid Build Coastguard Worker ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*ec779b8eSAndroid Build Coastguard Worker ** See the License for the specific language governing permissions and 15*ec779b8eSAndroid Build Coastguard Worker ** limitations under the License. 16*ec779b8eSAndroid Build Coastguard Worker */ 17*ec779b8eSAndroid Build Coastguard Worker 18*ec779b8eSAndroid Build Coastguard Worker #ifndef ANDROID_MEDIA_RESOURCETRACKER_H_ 19*ec779b8eSAndroid Build Coastguard Worker #define ANDROID_MEDIA_RESOURCETRACKER_H_ 20*ec779b8eSAndroid Build Coastguard Worker 21*ec779b8eSAndroid Build Coastguard Worker #include <map> 22*ec779b8eSAndroid Build Coastguard Worker #include <memory> 23*ec779b8eSAndroid Build Coastguard Worker #include <string> 24*ec779b8eSAndroid Build Coastguard Worker #include <vector> 25*ec779b8eSAndroid Build Coastguard Worker #include <media/MediaResource.h> 26*ec779b8eSAndroid Build Coastguard Worker #include <aidl/android/media/ClientInfoParcel.h> 27*ec779b8eSAndroid Build Coastguard Worker #include <aidl/android/media/IResourceManagerClient.h> 28*ec779b8eSAndroid Build Coastguard Worker #include <aidl/android/media/MediaResourceParcel.h> 29*ec779b8eSAndroid Build Coastguard Worker 30*ec779b8eSAndroid Build Coastguard Worker #include "ResourceManagerServiceUtils.h" 31*ec779b8eSAndroid Build Coastguard Worker 32*ec779b8eSAndroid Build Coastguard Worker namespace android { 33*ec779b8eSAndroid Build Coastguard Worker 34*ec779b8eSAndroid Build Coastguard Worker class DeathNotifier; 35*ec779b8eSAndroid Build Coastguard Worker class ResourceManagerServiceNew; 36*ec779b8eSAndroid Build Coastguard Worker class ResourceObserverService; 37*ec779b8eSAndroid Build Coastguard Worker struct ProcessInfoInterface; 38*ec779b8eSAndroid Build Coastguard Worker struct ResourceRequestInfo; 39*ec779b8eSAndroid Build Coastguard Worker struct ClientInfo; 40*ec779b8eSAndroid Build Coastguard Worker 41*ec779b8eSAndroid Build Coastguard Worker /* 42*ec779b8eSAndroid Build Coastguard Worker * ResourceTracker abstracts the resources managed by the ResourceManager. 43*ec779b8eSAndroid Build Coastguard Worker * It keeps track of the resource used by the clients (clientid) and by the process (pid) 44*ec779b8eSAndroid Build Coastguard Worker */ 45*ec779b8eSAndroid Build Coastguard Worker class ResourceTracker { 46*ec779b8eSAndroid Build Coastguard Worker public: 47*ec779b8eSAndroid Build Coastguard Worker ResourceTracker(const std::shared_ptr<ResourceManagerServiceNew>& service, 48*ec779b8eSAndroid Build Coastguard Worker const sp<ProcessInfoInterface>& processInfo); 49*ec779b8eSAndroid Build Coastguard Worker ~ResourceTracker(); 50*ec779b8eSAndroid Build Coastguard Worker 51*ec779b8eSAndroid Build Coastguard Worker /** 52*ec779b8eSAndroid Build Coastguard Worker * Add or update resources for |clientInfo|. 53*ec779b8eSAndroid Build Coastguard Worker * 54*ec779b8eSAndroid Build Coastguard Worker * If |clientInfo| is not tracked yet, it records its associated |client| and adds 55*ec779b8eSAndroid Build Coastguard Worker * |resources| to the tracked resources. If |clientInfo| is already tracked, 56*ec779b8eSAndroid Build Coastguard Worker * it updates the tracked resources by adding |resources| to them (|client| in 57*ec779b8eSAndroid Build Coastguard Worker * this case is unused and unchecked). 58*ec779b8eSAndroid Build Coastguard Worker * 59*ec779b8eSAndroid Build Coastguard Worker * @param clientInfo Info of the calling client. 60*ec779b8eSAndroid Build Coastguard Worker * @param client Interface for the client. 61*ec779b8eSAndroid Build Coastguard Worker * @param resources An array of resources to be added. 62*ec779b8eSAndroid Build Coastguard Worker * 63*ec779b8eSAndroid Build Coastguard Worker * @return true upon successfully adding/updating the resources, false 64*ec779b8eSAndroid Build Coastguard Worker * otherwise. 65*ec779b8eSAndroid Build Coastguard Worker */ 66*ec779b8eSAndroid Build Coastguard Worker bool addResource(const aidl::android::media::ClientInfoParcel& clientInfo, 67*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<::aidl::android::media::IResourceManagerClient>& client, 68*ec779b8eSAndroid Build Coastguard Worker const std::vector<::aidl::android::media::MediaResourceParcel>& resources); 69*ec779b8eSAndroid Build Coastguard Worker 70*ec779b8eSAndroid Build Coastguard Worker // Update the resource info, if there is any changes. 71*ec779b8eSAndroid Build Coastguard Worker bool updateResource(const aidl::android::media::ClientInfoParcel& clientInfo); 72*ec779b8eSAndroid Build Coastguard Worker 73*ec779b8eSAndroid Build Coastguard Worker // Remove a set of resources from the given client. 74*ec779b8eSAndroid Build Coastguard Worker // returns true on success, false otherwise. 75*ec779b8eSAndroid Build Coastguard Worker bool removeResource(const aidl::android::media::ClientInfoParcel& clientInfo, 76*ec779b8eSAndroid Build Coastguard Worker const std::vector<::aidl::android::media::MediaResourceParcel>& resources); 77*ec779b8eSAndroid Build Coastguard Worker 78*ec779b8eSAndroid Build Coastguard Worker /** 79*ec779b8eSAndroid Build Coastguard Worker * Remove all resources tracked for |clientInfo|. 80*ec779b8eSAndroid Build Coastguard Worker * 81*ec779b8eSAndroid Build Coastguard Worker * If |validateCallingPid| is true, the (pid of the) calling process is validated that it 82*ec779b8eSAndroid Build Coastguard Worker * is from a trusted process. 83*ec779b8eSAndroid Build Coastguard Worker * Returns true on success (|clientInfo| was tracked and optionally the caller 84*ec779b8eSAndroid Build Coastguard Worker * was a validated trusted process), false otherwise (|clientInfo| was not tracked, 85*ec779b8eSAndroid Build Coastguard Worker * or the caller was not a trusted process) 86*ec779b8eSAndroid Build Coastguard Worker */ 87*ec779b8eSAndroid Build Coastguard Worker bool removeResource(const aidl::android::media::ClientInfoParcel& clientInfo, 88*ec779b8eSAndroid Build Coastguard Worker bool validateCallingPid); 89*ec779b8eSAndroid Build Coastguard Worker 90*ec779b8eSAndroid Build Coastguard Worker // Mark the client for pending removal. 91*ec779b8eSAndroid Build Coastguard Worker // Such clients are primary candidate for reclaim. 92*ec779b8eSAndroid Build Coastguard Worker // returns true on success, false otherwise. 93*ec779b8eSAndroid Build Coastguard Worker bool markClientForPendingRemoval(const aidl::android::media::ClientInfoParcel& clientInfo); 94*ec779b8eSAndroid Build Coastguard Worker 95*ec779b8eSAndroid Build Coastguard Worker // Get a list of clients that belong to process with given pid and are maked to be 96*ec779b8eSAndroid Build Coastguard Worker // pending removal by markClientForPendingRemoval. 97*ec779b8eSAndroid Build Coastguard Worker // returns true on success, false otherwise. 98*ec779b8eSAndroid Build Coastguard Worker bool getClientsMarkedPendingRemoval(int32_t pid, std::vector<ClientInfo>& targetClients); 99*ec779b8eSAndroid Build Coastguard Worker 100*ec779b8eSAndroid Build Coastguard Worker // Override the pid of originalPid with newPid 101*ec779b8eSAndroid Build Coastguard Worker // To remove the pid entry from the override list, set newPid as -1 102*ec779b8eSAndroid Build Coastguard Worker // returns true on successful override, false otherwise. 103*ec779b8eSAndroid Build Coastguard Worker bool overridePid(int originalPid, int newPid); 104*ec779b8eSAndroid Build Coastguard Worker 105*ec779b8eSAndroid Build Coastguard Worker // Override the process info {state, oom score} of the process with pid. 106*ec779b8eSAndroid Build Coastguard Worker // returns true on success, false otherwise. 107*ec779b8eSAndroid Build Coastguard Worker bool overrideProcessInfo( 108*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<aidl::android::media::IResourceManagerClient>& client, 109*ec779b8eSAndroid Build Coastguard Worker int pid, int procState, int oomScore); 110*ec779b8eSAndroid Build Coastguard Worker 111*ec779b8eSAndroid Build Coastguard Worker // Remove the overridden process info. 112*ec779b8eSAndroid Build Coastguard Worker void removeProcessInfoOverride(int pid); 113*ec779b8eSAndroid Build Coastguard Worker 114*ec779b8eSAndroid Build Coastguard Worker // Find all clients that have given resources. 115*ec779b8eSAndroid Build Coastguard Worker // If applicable, match the primary type too. 116*ec779b8eSAndroid Build Coastguard Worker // The |clients| (list) isn't cleared by this function to allow calling this 117*ec779b8eSAndroid Build Coastguard Worker // function multiple times for different resources. 118*ec779b8eSAndroid Build Coastguard Worker // returns true upon finding at lease one client with the given resource request info, 119*ec779b8eSAndroid Build Coastguard Worker // false otherwise (no clients) 120*ec779b8eSAndroid Build Coastguard Worker bool getAllClients( 121*ec779b8eSAndroid Build Coastguard Worker const ResourceRequestInfo& resourceRequestInfo, 122*ec779b8eSAndroid Build Coastguard Worker std::vector<ClientInfo>& clients, 123*ec779b8eSAndroid Build Coastguard Worker MediaResource::SubType primarySubType = MediaResource::SubType::kUnspecifiedSubType); 124*ec779b8eSAndroid Build Coastguard Worker 125*ec779b8eSAndroid Build Coastguard Worker // Look for the lowest priority process with the given resources. 126*ec779b8eSAndroid Build Coastguard Worker // Upon success lowestPriorityPid and lowestPriority are 127*ec779b8eSAndroid Build Coastguard Worker // set accordingly and it returns true. 128*ec779b8eSAndroid Build Coastguard Worker // If there isn't a lower priority process with the given resources, it will return false 129*ec779b8eSAndroid Build Coastguard Worker // with out updating lowestPriorityPid and lowerPriority. 130*ec779b8eSAndroid Build Coastguard Worker bool getLowestPriorityPid(MediaResource::Type type, MediaResource::SubType subType, 131*ec779b8eSAndroid Build Coastguard Worker int& lowestPriorityPid, int& lowestPriority); 132*ec779b8eSAndroid Build Coastguard Worker 133*ec779b8eSAndroid Build Coastguard Worker // Look for the lowest priority process with the given resources 134*ec779b8eSAndroid Build Coastguard Worker // among the given client list. 135*ec779b8eSAndroid Build Coastguard Worker // If applicable, match the primary type too. 136*ec779b8eSAndroid Build Coastguard Worker // returns true on success, false otherwise. 137*ec779b8eSAndroid Build Coastguard Worker bool getLowestPriorityPid( 138*ec779b8eSAndroid Build Coastguard Worker MediaResource::Type type, MediaResource::SubType subType, 139*ec779b8eSAndroid Build Coastguard Worker MediaResource::SubType primarySubType, 140*ec779b8eSAndroid Build Coastguard Worker const std::vector<ClientInfo>& clients, 141*ec779b8eSAndroid Build Coastguard Worker int& lowestPriorityPid, int& lowestPriority); 142*ec779b8eSAndroid Build Coastguard Worker 143*ec779b8eSAndroid Build Coastguard Worker // Find the biggest client of the given process with given resources, 144*ec779b8eSAndroid Build Coastguard Worker // that is marked as pending to be removed. 145*ec779b8eSAndroid Build Coastguard Worker // returns true on success, false otherwise. 146*ec779b8eSAndroid Build Coastguard Worker bool getBiggestClientPendingRemoval( 147*ec779b8eSAndroid Build Coastguard Worker int pid, MediaResource::Type type, 148*ec779b8eSAndroid Build Coastguard Worker MediaResource::SubType subType, 149*ec779b8eSAndroid Build Coastguard Worker ClientInfo& clientInfo); 150*ec779b8eSAndroid Build Coastguard Worker 151*ec779b8eSAndroid Build Coastguard Worker // Find the biggest client from the process pid, selecting them from the list of clients. 152*ec779b8eSAndroid Build Coastguard Worker // If applicable, match the primary type too. 153*ec779b8eSAndroid Build Coastguard Worker // Returns true when a client is found and clientInfo is updated accordingly. 154*ec779b8eSAndroid Build Coastguard Worker // Upon failure to find a client, it will return false without updating 155*ec779b8eSAndroid Build Coastguard Worker // clientInfo. 156*ec779b8eSAndroid Build Coastguard Worker // Upon failure to find a client, it will return false. 157*ec779b8eSAndroid Build Coastguard Worker bool getBiggestClient( 158*ec779b8eSAndroid Build Coastguard Worker int targetPid, 159*ec779b8eSAndroid Build Coastguard Worker MediaResource::Type type, 160*ec779b8eSAndroid Build Coastguard Worker MediaResource::SubType subType, 161*ec779b8eSAndroid Build Coastguard Worker const std::vector<ClientInfo>& clients, 162*ec779b8eSAndroid Build Coastguard Worker ClientInfo& clientInfo, 163*ec779b8eSAndroid Build Coastguard Worker MediaResource::SubType primarySubType = MediaResource::SubType::kUnspecifiedSubType); 164*ec779b8eSAndroid Build Coastguard Worker 165*ec779b8eSAndroid Build Coastguard Worker // Find the biggest client from the process pid, that has the least importance 166*ec779b8eSAndroid Build Coastguard Worker // (than given importance) among the given list of clients. 167*ec779b8eSAndroid Build Coastguard Worker // If applicable, match the primary type too. 168*ec779b8eSAndroid Build Coastguard Worker // returns true on success, false otherwise. 169*ec779b8eSAndroid Build Coastguard Worker bool getLeastImportantBiggestClient(int targetPid, int32_t importance, 170*ec779b8eSAndroid Build Coastguard Worker MediaResource::Type type, 171*ec779b8eSAndroid Build Coastguard Worker MediaResource::SubType subType, 172*ec779b8eSAndroid Build Coastguard Worker MediaResource::SubType primarySubType, 173*ec779b8eSAndroid Build Coastguard Worker const std::vector<ClientInfo>& clients, 174*ec779b8eSAndroid Build Coastguard Worker ClientInfo& clientInfo); 175*ec779b8eSAndroid Build Coastguard Worker 176*ec779b8eSAndroid Build Coastguard Worker // Find the client that belongs to given process(pid) and with the given clientId. 177*ec779b8eSAndroid Build Coastguard Worker // A nullptr is returned upon failure to find the client. 178*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<::aidl::android::media::IResourceManagerClient> getClient( 179*ec779b8eSAndroid Build Coastguard Worker int pid, const int64_t& clientId) const; 180*ec779b8eSAndroid Build Coastguard Worker 181*ec779b8eSAndroid Build Coastguard Worker // Removes the client from the given process(pid) with the given clientId. 182*ec779b8eSAndroid Build Coastguard Worker // returns true on success, false otherwise. 183*ec779b8eSAndroid Build Coastguard Worker bool removeClient(int pid, const int64_t& clientId); 184*ec779b8eSAndroid Build Coastguard Worker 185*ec779b8eSAndroid Build Coastguard Worker // Set the resource observer service, to which to notify when the resources 186*ec779b8eSAndroid Build Coastguard Worker // are added and removed. 187*ec779b8eSAndroid Build Coastguard Worker void setResourceObserverService( 188*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr<ResourceObserverService>& observerService); 189*ec779b8eSAndroid Build Coastguard Worker 190*ec779b8eSAndroid Build Coastguard Worker // Dump all the resource allocations for all the processes into a given string 191*ec779b8eSAndroid Build Coastguard Worker void dump(std::string& resourceLogs); 192*ec779b8eSAndroid Build Coastguard Worker 193*ec779b8eSAndroid Build Coastguard Worker // get the priority of the process. 194*ec779b8eSAndroid Build Coastguard Worker // If we can't get the priority of the process (with given pid), it will 195*ec779b8eSAndroid Build Coastguard Worker // return false. 196*ec779b8eSAndroid Build Coastguard Worker bool getPriority(int pid, int* priority); 197*ec779b8eSAndroid Build Coastguard Worker 198*ec779b8eSAndroid Build Coastguard Worker // Check if the given resource request has conflicting clients. 199*ec779b8eSAndroid Build Coastguard Worker // The resource conflict is defined by the ResourceModel (such as 200*ec779b8eSAndroid Build Coastguard Worker // co-existence of secure codec with another secure or non-secure codec). 201*ec779b8eSAndroid Build Coastguard Worker // But here, the ResourceTracker only looks for resources from lower 202*ec779b8eSAndroid Build Coastguard Worker // priority processes. 203*ec779b8eSAndroid Build Coastguard Worker // If is/are only higher or same priority process/es with the given resource, 204*ec779b8eSAndroid Build Coastguard Worker // it will return false. 205*ec779b8eSAndroid Build Coastguard Worker // Otherwise, adds all the clients to the list of clients and return true. 206*ec779b8eSAndroid Build Coastguard Worker bool getNonConflictingClients(const ResourceRequestInfo& resourceRequestInfo, 207*ec779b8eSAndroid Build Coastguard Worker std::vector<ClientInfo>& clients); 208*ec779b8eSAndroid Build Coastguard Worker 209*ec779b8eSAndroid Build Coastguard Worker // Returns unmodifiable reference to the resource map. getResourceMap()210*ec779b8eSAndroid Build Coastguard Worker const std::map<int, ResourceInfos>& getResourceMap() const { 211*ec779b8eSAndroid Build Coastguard Worker return mMap; 212*ec779b8eSAndroid Build Coastguard Worker } 213*ec779b8eSAndroid Build Coastguard Worker 214*ec779b8eSAndroid Build Coastguard Worker private: 215*ec779b8eSAndroid Build Coastguard Worker // Get ResourceInfos associated with the given process. 216*ec779b8eSAndroid Build Coastguard Worker // If none exists, this method will create and associate an empty object and return it. 217*ec779b8eSAndroid Build Coastguard Worker ResourceInfos& getResourceInfosForEdit(int pid); 218*ec779b8eSAndroid Build Coastguard Worker 219*ec779b8eSAndroid Build Coastguard Worker // A helper function that returns true if the callingPid has higher priority than pid. 220*ec779b8eSAndroid Build Coastguard Worker // Returns false otherwise. 221*ec779b8eSAndroid Build Coastguard Worker bool isCallingPriorityHigher(int callingPid, int pid); 222*ec779b8eSAndroid Build Coastguard Worker 223*ec779b8eSAndroid Build Coastguard Worker // Locate the resource info corresponding to the process pid and 224*ec779b8eSAndroid Build Coastguard Worker // the client clientId. 225*ec779b8eSAndroid Build Coastguard Worker const ResourceInfo* getResourceInfo(int pid, const int64_t& clientId) const; 226*ec779b8eSAndroid Build Coastguard Worker 227*ec779b8eSAndroid Build Coastguard Worker // Notify when a resource is added for the first time. 228*ec779b8eSAndroid Build Coastguard Worker void onFirstAdded(const MediaResourceParcel& resource, uid_t uid); 229*ec779b8eSAndroid Build Coastguard Worker // Notify when a resource is removed for the last time. 230*ec779b8eSAndroid Build Coastguard Worker void onLastRemoved(const MediaResourceParcel& resource, uid_t uid); 231*ec779b8eSAndroid Build Coastguard Worker 232*ec779b8eSAndroid Build Coastguard Worker private: 233*ec779b8eSAndroid Build Coastguard Worker // Structure that defines process info that needs to be overridden. 234*ec779b8eSAndroid Build Coastguard Worker struct ProcessInfoOverride { 235*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<DeathNotifier> deathNotifier = nullptr; 236*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<::aidl::android::media::IResourceManagerClient> client; 237*ec779b8eSAndroid Build Coastguard Worker }; 238*ec779b8eSAndroid Build Coastguard Worker 239*ec779b8eSAndroid Build Coastguard Worker // Map of Resource information indexed through the process id. 240*ec779b8eSAndroid Build Coastguard Worker std::map<int, ResourceInfos> mMap; 241*ec779b8eSAndroid Build Coastguard Worker // A weak reference (to avoid cyclic dependency) to the ResourceManagerService. 242*ec779b8eSAndroid Build Coastguard Worker // ResourceTracker uses this to communicate back with the ResourceManagerService. 243*ec779b8eSAndroid Build Coastguard Worker std::weak_ptr<ResourceManagerServiceNew> mService; 244*ec779b8eSAndroid Build Coastguard Worker // To notify the ResourceObserverService abour resources are added or removed. 245*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<ResourceObserverService> mObserverService; 246*ec779b8eSAndroid Build Coastguard Worker // Map of pid and their overrided id. 247*ec779b8eSAndroid Build Coastguard Worker std::map<int, int> mOverridePidMap; 248*ec779b8eSAndroid Build Coastguard Worker // Map of pid and their overridden process info. 249*ec779b8eSAndroid Build Coastguard Worker std::map<pid_t, ProcessInfoOverride> mProcessInfoOverrideMap; 250*ec779b8eSAndroid Build Coastguard Worker // Interface that gets process specific information. 251*ec779b8eSAndroid Build Coastguard Worker sp<ProcessInfoInterface> mProcessInfo; 252*ec779b8eSAndroid Build Coastguard Worker }; 253*ec779b8eSAndroid Build Coastguard Worker 254*ec779b8eSAndroid Build Coastguard Worker } // namespace android 255*ec779b8eSAndroid Build Coastguard Worker 256*ec779b8eSAndroid Build Coastguard Worker #endif // ANDROID_MEDIA_RESOURCETRACKER_H_ 257