xref: /aosp_15_r20/frameworks/av/services/mediaresourcemanager/ResourceManagerServiceNew.cpp (revision ec779b8e0859a360c3d303172224686826e6e0e1)
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 //#define LOG_NDEBUG 0
19*ec779b8eSAndroid Build Coastguard Worker #define LOG_TAG "ResourceManagerServiceNew"
20*ec779b8eSAndroid Build Coastguard Worker #include <utils/Log.h>
21*ec779b8eSAndroid Build Coastguard Worker #include <binder/IPCThreadState.h>
22*ec779b8eSAndroid Build Coastguard Worker #include <mediautils/ProcessInfo.h>
23*ec779b8eSAndroid Build Coastguard Worker 
24*ec779b8eSAndroid Build Coastguard Worker #include "DefaultResourceModel.h"
25*ec779b8eSAndroid Build Coastguard Worker #include "ClientImportanceReclaimPolicy.h"
26*ec779b8eSAndroid Build Coastguard Worker #include "ProcessPriorityReclaimPolicy.h"
27*ec779b8eSAndroid Build Coastguard Worker #include "ResourceManagerServiceNew.h"
28*ec779b8eSAndroid Build Coastguard Worker #include "ResourceTracker.h"
29*ec779b8eSAndroid Build Coastguard Worker #include "ServiceLog.h"
30*ec779b8eSAndroid Build Coastguard Worker 
31*ec779b8eSAndroid Build Coastguard Worker namespace android {
32*ec779b8eSAndroid Build Coastguard Worker 
ResourceManagerServiceNew(const sp<ProcessInfoInterface> & processInfo,const sp<SystemCallbackInterface> & systemResource)33*ec779b8eSAndroid Build Coastguard Worker ResourceManagerServiceNew::ResourceManagerServiceNew(
34*ec779b8eSAndroid Build Coastguard Worker         const sp<ProcessInfoInterface>& processInfo,
35*ec779b8eSAndroid Build Coastguard Worker         const sp<SystemCallbackInterface>& systemResource) :
36*ec779b8eSAndroid Build Coastguard Worker   ResourceManagerService(processInfo, systemResource) {}
37*ec779b8eSAndroid Build Coastguard Worker 
~ResourceManagerServiceNew()38*ec779b8eSAndroid Build Coastguard Worker ResourceManagerServiceNew::~ResourceManagerServiceNew() {}
39*ec779b8eSAndroid Build Coastguard Worker 
init()40*ec779b8eSAndroid Build Coastguard Worker void ResourceManagerServiceNew::init() {
41*ec779b8eSAndroid Build Coastguard Worker     // Create the Resource Tracker
42*ec779b8eSAndroid Build Coastguard Worker     mResourceTracker = std::make_shared<ResourceTracker>(ref<ResourceManagerServiceNew>(),
43*ec779b8eSAndroid Build Coastguard Worker                                                          mProcessInfo);
44*ec779b8eSAndroid Build Coastguard Worker     setUpResourceModels();
45*ec779b8eSAndroid Build Coastguard Worker     setUpReclaimPolicies();
46*ec779b8eSAndroid Build Coastguard Worker }
47*ec779b8eSAndroid Build Coastguard Worker 
setUpResourceModels()48*ec779b8eSAndroid Build Coastguard Worker void ResourceManagerServiceNew::setUpResourceModels() {
49*ec779b8eSAndroid Build Coastguard Worker     std::scoped_lock lock{mLock};
50*ec779b8eSAndroid Build Coastguard Worker     // Create/Configure the default resource model.
51*ec779b8eSAndroid Build Coastguard Worker     if (mDefaultResourceModel == nullptr) {
52*ec779b8eSAndroid Build Coastguard Worker         mDefaultResourceModel = std::make_unique<DefaultResourceModel>(
53*ec779b8eSAndroid Build Coastguard Worker                 mResourceTracker,
54*ec779b8eSAndroid Build Coastguard Worker                 mSupportsMultipleSecureCodecs,
55*ec779b8eSAndroid Build Coastguard Worker                 mSupportsSecureWithNonSecureCodec);
56*ec779b8eSAndroid Build Coastguard Worker     } else {
57*ec779b8eSAndroid Build Coastguard Worker         DefaultResourceModel* resourceModel =
58*ec779b8eSAndroid Build Coastguard Worker             static_cast<DefaultResourceModel*>(mDefaultResourceModel.get());
59*ec779b8eSAndroid Build Coastguard Worker         resourceModel->config(mSupportsMultipleSecureCodecs, mSupportsSecureWithNonSecureCodec);
60*ec779b8eSAndroid Build Coastguard Worker     }
61*ec779b8eSAndroid Build Coastguard Worker }
62*ec779b8eSAndroid Build Coastguard Worker 
setUpReclaimPolicies()63*ec779b8eSAndroid Build Coastguard Worker void ResourceManagerServiceNew::setUpReclaimPolicies() {
64*ec779b8eSAndroid Build Coastguard Worker     mReclaimPolicies.clear();
65*ec779b8eSAndroid Build Coastguard Worker     // Add Reclaim policies based on:
66*ec779b8eSAndroid Build Coastguard Worker     // - the Process priority (oom score)
67*ec779b8eSAndroid Build Coastguard Worker     // - the client/codec importance.
68*ec779b8eSAndroid Build Coastguard Worker     setReclaimPolicy(true /* processPriority */, true /* clientImportance */);
69*ec779b8eSAndroid Build Coastguard Worker }
70*ec779b8eSAndroid Build Coastguard Worker 
config(const std::vector<MediaResourcePolicyParcel> & policies)71*ec779b8eSAndroid Build Coastguard Worker Status ResourceManagerServiceNew::config(const std::vector<MediaResourcePolicyParcel>& policies) {
72*ec779b8eSAndroid Build Coastguard Worker     Status status = ResourceManagerService::config(policies);
73*ec779b8eSAndroid Build Coastguard Worker     // Change in the config dictates update to the resource model.
74*ec779b8eSAndroid Build Coastguard Worker     setUpResourceModels();
75*ec779b8eSAndroid Build Coastguard Worker     return status;
76*ec779b8eSAndroid Build Coastguard Worker }
77*ec779b8eSAndroid Build Coastguard Worker 
setObserverService(const std::shared_ptr<ResourceObserverService> & observerService)78*ec779b8eSAndroid Build Coastguard Worker void ResourceManagerServiceNew::setObserverService(
79*ec779b8eSAndroid Build Coastguard Worker         const std::shared_ptr<ResourceObserverService>& observerService) {
80*ec779b8eSAndroid Build Coastguard Worker     ResourceManagerService::setObserverService(observerService);
81*ec779b8eSAndroid Build Coastguard Worker     mResourceTracker->setResourceObserverService(observerService);
82*ec779b8eSAndroid Build Coastguard Worker }
83*ec779b8eSAndroid Build Coastguard Worker 
addResource(const ClientInfoParcel & clientInfo,const std::shared_ptr<IResourceManagerClient> & client,const std::vector<MediaResourceParcel> & resources)84*ec779b8eSAndroid Build Coastguard Worker Status ResourceManagerServiceNew::addResource(
85*ec779b8eSAndroid Build Coastguard Worker         const ClientInfoParcel& clientInfo,
86*ec779b8eSAndroid Build Coastguard Worker         const std::shared_ptr<IResourceManagerClient>& client,
87*ec779b8eSAndroid Build Coastguard Worker         const std::vector<MediaResourceParcel>& resources) {
88*ec779b8eSAndroid Build Coastguard Worker     int32_t pid = clientInfo.pid;
89*ec779b8eSAndroid Build Coastguard Worker     int32_t uid = clientInfo.uid;
90*ec779b8eSAndroid Build Coastguard Worker     int64_t clientId = clientInfo.id;
91*ec779b8eSAndroid Build Coastguard Worker     String8 log = String8::format("addResource(pid %d, uid %d clientId %lld, resources %s)",
92*ec779b8eSAndroid Build Coastguard Worker             pid, uid, (long long) clientId, getString(resources).c_str());
93*ec779b8eSAndroid Build Coastguard Worker     mServiceLog->add(log);
94*ec779b8eSAndroid Build Coastguard Worker 
95*ec779b8eSAndroid Build Coastguard Worker     std::scoped_lock lock{mLock};
96*ec779b8eSAndroid Build Coastguard Worker     mResourceTracker->addResource(clientInfo, client, resources);
97*ec779b8eSAndroid Build Coastguard Worker     notifyResourceGranted(pid, resources);
98*ec779b8eSAndroid Build Coastguard Worker 
99*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
100*ec779b8eSAndroid Build Coastguard Worker }
101*ec779b8eSAndroid Build Coastguard Worker 
removeResource(const ClientInfoParcel & clientInfo,const std::vector<MediaResourceParcel> & resources)102*ec779b8eSAndroid Build Coastguard Worker Status ResourceManagerServiceNew::removeResource(
103*ec779b8eSAndroid Build Coastguard Worker         const ClientInfoParcel& clientInfo,
104*ec779b8eSAndroid Build Coastguard Worker         const std::vector<MediaResourceParcel>& resources) {
105*ec779b8eSAndroid Build Coastguard Worker     int32_t pid = clientInfo.pid;
106*ec779b8eSAndroid Build Coastguard Worker     int32_t uid = clientInfo.uid;
107*ec779b8eSAndroid Build Coastguard Worker     int64_t clientId = clientInfo.id;
108*ec779b8eSAndroid Build Coastguard Worker     String8 log = String8::format("removeResource(pid %d, uid %d clientId %lld, resources %s)",
109*ec779b8eSAndroid Build Coastguard Worker             pid, uid, (long long) clientId, getString(resources).c_str());
110*ec779b8eSAndroid Build Coastguard Worker     mServiceLog->add(log);
111*ec779b8eSAndroid Build Coastguard Worker 
112*ec779b8eSAndroid Build Coastguard Worker     std::scoped_lock lock{mLock};
113*ec779b8eSAndroid Build Coastguard Worker     mResourceTracker->removeResource(clientInfo, resources);
114*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
115*ec779b8eSAndroid Build Coastguard Worker }
116*ec779b8eSAndroid Build Coastguard Worker 
removeClient(const ClientInfoParcel & clientInfo)117*ec779b8eSAndroid Build Coastguard Worker Status ResourceManagerServiceNew::removeClient(const ClientInfoParcel& clientInfo) {
118*ec779b8eSAndroid Build Coastguard Worker     removeResource(clientInfo, true /*checkValid*/);
119*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
120*ec779b8eSAndroid Build Coastguard Worker }
121*ec779b8eSAndroid Build Coastguard Worker 
removeResource(const ClientInfoParcel & clientInfo,bool checkValid)122*ec779b8eSAndroid Build Coastguard Worker Status ResourceManagerServiceNew::removeResource(const ClientInfoParcel& clientInfo,
123*ec779b8eSAndroid Build Coastguard Worker                                                  bool checkValid) {
124*ec779b8eSAndroid Build Coastguard Worker     int32_t pid = clientInfo.pid;
125*ec779b8eSAndroid Build Coastguard Worker     int32_t uid = clientInfo.uid;
126*ec779b8eSAndroid Build Coastguard Worker     int64_t clientId = clientInfo.id;
127*ec779b8eSAndroid Build Coastguard Worker     String8 log = String8::format("removeResource(pid %d, uid %d clientId %lld)",
128*ec779b8eSAndroid Build Coastguard Worker             pid, uid, (long long) clientId);
129*ec779b8eSAndroid Build Coastguard Worker     mServiceLog->add(log);
130*ec779b8eSAndroid Build Coastguard Worker 
131*ec779b8eSAndroid Build Coastguard Worker     std::scoped_lock lock{mLock};
132*ec779b8eSAndroid Build Coastguard Worker     if (mResourceTracker->removeResource(clientInfo, checkValid)) {
133*ec779b8eSAndroid Build Coastguard Worker         notifyClientReleased(clientInfo);
134*ec779b8eSAndroid Build Coastguard Worker     }
135*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
136*ec779b8eSAndroid Build Coastguard Worker }
137*ec779b8eSAndroid Build Coastguard Worker 
reclaimResource(const ClientInfoParcel & clientInfo,const std::vector<MediaResourceParcel> & resources,bool * _aidl_return)138*ec779b8eSAndroid Build Coastguard Worker Status ResourceManagerServiceNew::reclaimResource(
139*ec779b8eSAndroid Build Coastguard Worker         const ClientInfoParcel& clientInfo,
140*ec779b8eSAndroid Build Coastguard Worker         const std::vector<MediaResourceParcel>& resources,
141*ec779b8eSAndroid Build Coastguard Worker         bool* _aidl_return) {
142*ec779b8eSAndroid Build Coastguard Worker     return ResourceManagerService::reclaimResource(clientInfo, resources, _aidl_return);
143*ec779b8eSAndroid Build Coastguard Worker }
144*ec779b8eSAndroid Build Coastguard Worker 
overridePid_l(int32_t originalPid,int32_t newPid)145*ec779b8eSAndroid Build Coastguard Worker bool ResourceManagerServiceNew::overridePid_l(int32_t originalPid, int32_t newPid) {
146*ec779b8eSAndroid Build Coastguard Worker     return mResourceTracker->overridePid(originalPid, newPid);
147*ec779b8eSAndroid Build Coastguard Worker }
148*ec779b8eSAndroid Build Coastguard Worker 
overridePid(int originalPid,int newPid)149*ec779b8eSAndroid Build Coastguard Worker Status ResourceManagerServiceNew::overridePid(int originalPid, int newPid) {
150*ec779b8eSAndroid Build Coastguard Worker     return ResourceManagerService::overridePid(originalPid, newPid);
151*ec779b8eSAndroid Build Coastguard Worker }
152*ec779b8eSAndroid Build Coastguard Worker 
overrideProcessInfo_l(const std::shared_ptr<IResourceManagerClient> & client,int pid,int procState,int oomScore)153*ec779b8eSAndroid Build Coastguard Worker bool ResourceManagerServiceNew::overrideProcessInfo_l(
154*ec779b8eSAndroid Build Coastguard Worker         const std::shared_ptr<IResourceManagerClient>& client,
155*ec779b8eSAndroid Build Coastguard Worker         int pid,
156*ec779b8eSAndroid Build Coastguard Worker         int procState,
157*ec779b8eSAndroid Build Coastguard Worker         int oomScore) {
158*ec779b8eSAndroid Build Coastguard Worker     return mResourceTracker->overrideProcessInfo(client, pid, procState, oomScore);
159*ec779b8eSAndroid Build Coastguard Worker }
160*ec779b8eSAndroid Build Coastguard Worker 
overrideProcessInfo(const std::shared_ptr<IResourceManagerClient> & client,int pid,int procState,int oomScore)161*ec779b8eSAndroid Build Coastguard Worker Status ResourceManagerServiceNew::overrideProcessInfo(
162*ec779b8eSAndroid Build Coastguard Worker         const std::shared_ptr<IResourceManagerClient>& client,
163*ec779b8eSAndroid Build Coastguard Worker         int pid,
164*ec779b8eSAndroid Build Coastguard Worker         int procState,
165*ec779b8eSAndroid Build Coastguard Worker         int oomScore) {
166*ec779b8eSAndroid Build Coastguard Worker     return ResourceManagerService::overrideProcessInfo(client, pid, procState, oomScore);
167*ec779b8eSAndroid Build Coastguard Worker }
168*ec779b8eSAndroid Build Coastguard Worker 
removeProcessInfoOverride(int pid)169*ec779b8eSAndroid Build Coastguard Worker void ResourceManagerServiceNew::removeProcessInfoOverride(int pid) {
170*ec779b8eSAndroid Build Coastguard Worker     std::scoped_lock lock{mLock};
171*ec779b8eSAndroid Build Coastguard Worker 
172*ec779b8eSAndroid Build Coastguard Worker     mResourceTracker->removeProcessInfoOverride(pid);
173*ec779b8eSAndroid Build Coastguard Worker }
174*ec779b8eSAndroid Build Coastguard Worker 
markClientForPendingRemoval(const ClientInfoParcel & clientInfo)175*ec779b8eSAndroid Build Coastguard Worker Status ResourceManagerServiceNew::markClientForPendingRemoval(const ClientInfoParcel& clientInfo) {
176*ec779b8eSAndroid Build Coastguard Worker     int32_t pid = clientInfo.pid;
177*ec779b8eSAndroid Build Coastguard Worker     int64_t clientId = clientInfo.id;
178*ec779b8eSAndroid Build Coastguard Worker     String8 log = String8::format(
179*ec779b8eSAndroid Build Coastguard Worker             "markClientForPendingRemoval(pid %d, clientId %lld)",
180*ec779b8eSAndroid Build Coastguard Worker             pid, (long long) clientId);
181*ec779b8eSAndroid Build Coastguard Worker     mServiceLog->add(log);
182*ec779b8eSAndroid Build Coastguard Worker 
183*ec779b8eSAndroid Build Coastguard Worker     std::scoped_lock lock{mLock};
184*ec779b8eSAndroid Build Coastguard Worker     mResourceTracker->markClientForPendingRemoval(clientInfo);
185*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
186*ec779b8eSAndroid Build Coastguard Worker }
187*ec779b8eSAndroid Build Coastguard Worker 
reclaimResourcesFromClientsPendingRemoval(int32_t pid)188*ec779b8eSAndroid Build Coastguard Worker Status ResourceManagerServiceNew::reclaimResourcesFromClientsPendingRemoval(int32_t pid) {
189*ec779b8eSAndroid Build Coastguard Worker     String8 log = String8::format("reclaimResourcesFromClientsPendingRemoval(pid %d)", pid);
190*ec779b8eSAndroid Build Coastguard Worker     mServiceLog->add(log);
191*ec779b8eSAndroid Build Coastguard Worker 
192*ec779b8eSAndroid Build Coastguard Worker     std::vector<ClientInfo> targetClients;
193*ec779b8eSAndroid Build Coastguard Worker     {
194*ec779b8eSAndroid Build Coastguard Worker         std::scoped_lock lock{mLock};
195*ec779b8eSAndroid Build Coastguard Worker         mResourceTracker->getClientsMarkedPendingRemoval(pid, targetClients);
196*ec779b8eSAndroid Build Coastguard Worker     }
197*ec779b8eSAndroid Build Coastguard Worker 
198*ec779b8eSAndroid Build Coastguard Worker     if (!targetClients.empty()) {
199*ec779b8eSAndroid Build Coastguard Worker         reclaimUnconditionallyFrom(targetClients);
200*ec779b8eSAndroid Build Coastguard Worker     }
201*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
202*ec779b8eSAndroid Build Coastguard Worker }
203*ec779b8eSAndroid Build Coastguard Worker 
notifyClientCreated(const ClientInfoParcel & clientInfo)204*ec779b8eSAndroid Build Coastguard Worker Status ResourceManagerServiceNew::notifyClientCreated(const ClientInfoParcel& clientInfo) {
205*ec779b8eSAndroid Build Coastguard Worker     return ResourceManagerService::notifyClientCreated(clientInfo);
206*ec779b8eSAndroid Build Coastguard Worker }
207*ec779b8eSAndroid Build Coastguard Worker 
notifyClientStarted(const ClientConfigParcel & clientConfig)208*ec779b8eSAndroid Build Coastguard Worker Status ResourceManagerServiceNew::notifyClientStarted(const ClientConfigParcel& clientConfig) {
209*ec779b8eSAndroid Build Coastguard Worker     return ResourceManagerService::notifyClientStarted(clientConfig);
210*ec779b8eSAndroid Build Coastguard Worker }
211*ec779b8eSAndroid Build Coastguard Worker 
notifyClientStopped(const ClientConfigParcel & clientConfig)212*ec779b8eSAndroid Build Coastguard Worker Status ResourceManagerServiceNew::notifyClientStopped(const ClientConfigParcel& clientConfig) {
213*ec779b8eSAndroid Build Coastguard Worker     return ResourceManagerService::notifyClientStopped(clientConfig);
214*ec779b8eSAndroid Build Coastguard Worker }
215*ec779b8eSAndroid Build Coastguard Worker 
notifyClientConfigChanged(const ClientConfigParcel & clientConfig)216*ec779b8eSAndroid Build Coastguard Worker Status ResourceManagerServiceNew::notifyClientConfigChanged(
217*ec779b8eSAndroid Build Coastguard Worker         const ClientConfigParcel& clientConfig) {
218*ec779b8eSAndroid Build Coastguard Worker     {
219*ec779b8eSAndroid Build Coastguard Worker         // Update the ResourceTracker about the change in the configuration.
220*ec779b8eSAndroid Build Coastguard Worker         std::scoped_lock lock{mLock};
221*ec779b8eSAndroid Build Coastguard Worker         mResourceTracker->updateResource(clientConfig.clientInfo);
222*ec779b8eSAndroid Build Coastguard Worker     }
223*ec779b8eSAndroid Build Coastguard Worker     return ResourceManagerService::notifyClientConfigChanged(clientConfig);
224*ec779b8eSAndroid Build Coastguard Worker }
225*ec779b8eSAndroid Build Coastguard Worker 
getResourceDump(std::string & resourceLog) const226*ec779b8eSAndroid Build Coastguard Worker void ResourceManagerServiceNew::getResourceDump(std::string& resourceLog) const {
227*ec779b8eSAndroid Build Coastguard Worker     std::scoped_lock lock{mLock};
228*ec779b8eSAndroid Build Coastguard Worker     mResourceTracker->dump(resourceLog);
229*ec779b8eSAndroid Build Coastguard Worker }
230*ec779b8eSAndroid Build Coastguard Worker 
dump(int fd,const char ** args,uint32_t numArgs)231*ec779b8eSAndroid Build Coastguard Worker binder_status_t ResourceManagerServiceNew::dump(int fd, const char** args, uint32_t numArgs) {
232*ec779b8eSAndroid Build Coastguard Worker     return ResourceManagerService::dump(fd, args, numArgs);
233*ec779b8eSAndroid Build Coastguard Worker }
234*ec779b8eSAndroid Build Coastguard Worker 
getTargetClients(const ClientInfoParcel & clientInfo,const std::vector<MediaResourceParcel> & resources,std::vector<ClientInfo> & targetClients)235*ec779b8eSAndroid Build Coastguard Worker bool ResourceManagerServiceNew::getTargetClients(
236*ec779b8eSAndroid Build Coastguard Worker         const ClientInfoParcel& clientInfo,
237*ec779b8eSAndroid Build Coastguard Worker         const std::vector<MediaResourceParcel>& resources,
238*ec779b8eSAndroid Build Coastguard Worker         std::vector<ClientInfo>& targetClients) {
239*ec779b8eSAndroid Build Coastguard Worker     int32_t callingPid = clientInfo.pid;
240*ec779b8eSAndroid Build Coastguard Worker     std::scoped_lock lock{mLock};
241*ec779b8eSAndroid Build Coastguard Worker     if (!mProcessInfo->isPidTrusted(callingPid)) {
242*ec779b8eSAndroid Build Coastguard Worker         pid_t actualCallingPid = IPCThreadState::self()->getCallingPid();
243*ec779b8eSAndroid Build Coastguard Worker         ALOGW("%s called with untrusted pid %d, using actual calling pid %d", __FUNCTION__,
244*ec779b8eSAndroid Build Coastguard Worker                 callingPid, actualCallingPid);
245*ec779b8eSAndroid Build Coastguard Worker         callingPid = actualCallingPid;
246*ec779b8eSAndroid Build Coastguard Worker     }
247*ec779b8eSAndroid Build Coastguard Worker 
248*ec779b8eSAndroid Build Coastguard Worker     // Use the Resource Model to get a list of all the clients that hold the
249*ec779b8eSAndroid Build Coastguard Worker     // needed/requested resources.
250*ec779b8eSAndroid Build Coastguard Worker     uint32_t callingImportance = std::max(0, clientInfo.importance);
251*ec779b8eSAndroid Build Coastguard Worker     ReclaimRequestInfo reclaimRequestInfo{callingPid, clientInfo.id, callingImportance, resources};
252*ec779b8eSAndroid Build Coastguard Worker     std::vector<ClientInfo> clients;
253*ec779b8eSAndroid Build Coastguard Worker     if (!mDefaultResourceModel->getAllClients(reclaimRequestInfo, clients)) {
254*ec779b8eSAndroid Build Coastguard Worker         if (clients.empty()) {
255*ec779b8eSAndroid Build Coastguard Worker             ALOGI("%s: There aren't any clients with given resources. Nothing to reclaim",
256*ec779b8eSAndroid Build Coastguard Worker                   __func__);
257*ec779b8eSAndroid Build Coastguard Worker             return false;
258*ec779b8eSAndroid Build Coastguard Worker         }
259*ec779b8eSAndroid Build Coastguard Worker         // Since there was a conflict, we need to reclaim all clients.
260*ec779b8eSAndroid Build Coastguard Worker         targetClients = std::move(clients);
261*ec779b8eSAndroid Build Coastguard Worker     } else {
262*ec779b8eSAndroid Build Coastguard Worker         // Select a client among those have the needed resources.
263*ec779b8eSAndroid Build Coastguard Worker         getClientForResource_l(reclaimRequestInfo, clients, targetClients);
264*ec779b8eSAndroid Build Coastguard Worker     }
265*ec779b8eSAndroid Build Coastguard Worker     return !targetClients.empty();
266*ec779b8eSAndroid Build Coastguard Worker }
267*ec779b8eSAndroid Build Coastguard Worker 
getClientForResource_l(const ReclaimRequestInfo & reclaimRequestInfo,const std::vector<ClientInfo> & clients,std::vector<ClientInfo> & targetClients)268*ec779b8eSAndroid Build Coastguard Worker void ResourceManagerServiceNew::getClientForResource_l(
269*ec779b8eSAndroid Build Coastguard Worker         const ReclaimRequestInfo& reclaimRequestInfo,
270*ec779b8eSAndroid Build Coastguard Worker         const std::vector<ClientInfo>& clients,
271*ec779b8eSAndroid Build Coastguard Worker         std::vector<ClientInfo>& targetClients) {
272*ec779b8eSAndroid Build Coastguard Worker     int callingPid = reclaimRequestInfo.mCallingPid;
273*ec779b8eSAndroid Build Coastguard Worker 
274*ec779b8eSAndroid Build Coastguard Worker     // Before looking into other processes, check if we have clients marked for
275*ec779b8eSAndroid Build Coastguard Worker     // pending removal in the same process.
276*ec779b8eSAndroid Build Coastguard Worker     ClientInfo targetClient;
277*ec779b8eSAndroid Build Coastguard Worker     for (const MediaResourceParcel& resource : reclaimRequestInfo.mResources) {
278*ec779b8eSAndroid Build Coastguard Worker         if (mResourceTracker->getBiggestClientPendingRemoval(callingPid, resource.type,
279*ec779b8eSAndroid Build Coastguard Worker                                                              resource.subType, targetClient)) {
280*ec779b8eSAndroid Build Coastguard Worker             targetClients.emplace_back(targetClient);
281*ec779b8eSAndroid Build Coastguard Worker             return;
282*ec779b8eSAndroid Build Coastguard Worker         }
283*ec779b8eSAndroid Build Coastguard Worker     }
284*ec779b8eSAndroid Build Coastguard Worker 
285*ec779b8eSAndroid Build Coastguard Worker     // Run through all the reclaim policies until a client to reclaim from is identified.
286*ec779b8eSAndroid Build Coastguard Worker     for (std::unique_ptr<IReclaimPolicy>& reclaimPolicy : mReclaimPolicies) {
287*ec779b8eSAndroid Build Coastguard Worker         if (reclaimPolicy->getClients(reclaimRequestInfo, clients, targetClients)) {
288*ec779b8eSAndroid Build Coastguard Worker             return;
289*ec779b8eSAndroid Build Coastguard Worker         }
290*ec779b8eSAndroid Build Coastguard Worker     }
291*ec779b8eSAndroid Build Coastguard Worker }
292*ec779b8eSAndroid Build Coastguard Worker 
getLowestPriorityBiggestClient_l(const ResourceRequestInfo & resourceRequestInfo,ClientInfo & clientInfo)293*ec779b8eSAndroid Build Coastguard Worker bool ResourceManagerServiceNew::getLowestPriorityBiggestClient_l(
294*ec779b8eSAndroid Build Coastguard Worker         const ResourceRequestInfo& resourceRequestInfo,
295*ec779b8eSAndroid Build Coastguard Worker         ClientInfo& clientInfo) {
296*ec779b8eSAndroid Build Coastguard Worker     //NOTE: This function is used only by the test: ResourceManagerServiceTest
297*ec779b8eSAndroid Build Coastguard Worker     if (resourceRequestInfo.mResource == nullptr) {
298*ec779b8eSAndroid Build Coastguard Worker         return false;
299*ec779b8eSAndroid Build Coastguard Worker     }
300*ec779b8eSAndroid Build Coastguard Worker 
301*ec779b8eSAndroid Build Coastguard Worker     // Use the DefaultResourceModel to get all the clients with the resources requested.
302*ec779b8eSAndroid Build Coastguard Worker     std::vector<MediaResourceParcel> resources{*resourceRequestInfo.mResource};
303*ec779b8eSAndroid Build Coastguard Worker     ReclaimRequestInfo reclaimRequestInfo{resourceRequestInfo.mCallingPid,
304*ec779b8eSAndroid Build Coastguard Worker                                           resourceRequestInfo.mClientId,
305*ec779b8eSAndroid Build Coastguard Worker                                           0, // default importance
306*ec779b8eSAndroid Build Coastguard Worker                                           resources};
307*ec779b8eSAndroid Build Coastguard Worker     std::vector<ClientInfo> clients;
308*ec779b8eSAndroid Build Coastguard Worker     mDefaultResourceModel->getAllClients(reclaimRequestInfo, clients);
309*ec779b8eSAndroid Build Coastguard Worker 
310*ec779b8eSAndroid Build Coastguard Worker     // Use the ProcessPriorityReclaimPolicy to select a client to reclaim from.
311*ec779b8eSAndroid Build Coastguard Worker     std::unique_ptr<IReclaimPolicy> reclaimPolicy
312*ec779b8eSAndroid Build Coastguard Worker         = std::make_unique<ProcessPriorityReclaimPolicy>(mResourceTracker);
313*ec779b8eSAndroid Build Coastguard Worker     std::vector<ClientInfo> targetClients;
314*ec779b8eSAndroid Build Coastguard Worker     if (reclaimPolicy->getClients(reclaimRequestInfo, clients, targetClients)) {
315*ec779b8eSAndroid Build Coastguard Worker         if (!targetClients.empty()) {
316*ec779b8eSAndroid Build Coastguard Worker             clientInfo = targetClients[0];
317*ec779b8eSAndroid Build Coastguard Worker             return true;
318*ec779b8eSAndroid Build Coastguard Worker         }
319*ec779b8eSAndroid Build Coastguard Worker     }
320*ec779b8eSAndroid Build Coastguard Worker 
321*ec779b8eSAndroid Build Coastguard Worker     return false;
322*ec779b8eSAndroid Build Coastguard Worker }
323*ec779b8eSAndroid Build Coastguard Worker 
getPriority_l(int pid,int * priority) const324*ec779b8eSAndroid Build Coastguard Worker bool ResourceManagerServiceNew::getPriority_l(int pid, int* priority) const {
325*ec779b8eSAndroid Build Coastguard Worker     return mResourceTracker->getPriority(pid, priority);
326*ec779b8eSAndroid Build Coastguard Worker }
327*ec779b8eSAndroid Build Coastguard Worker 
getLowestPriorityPid_l(MediaResource::Type type,MediaResource::SubType subType,int * lowestPriorityPid,int * lowestPriority)328*ec779b8eSAndroid Build Coastguard Worker bool ResourceManagerServiceNew::getLowestPriorityPid_l(
329*ec779b8eSAndroid Build Coastguard Worker         MediaResource::Type type, MediaResource::SubType subType,
330*ec779b8eSAndroid Build Coastguard Worker         int* lowestPriorityPid, int* lowestPriority) {
331*ec779b8eSAndroid Build Coastguard Worker     //NOTE: This function is used only by the test: ResourceManagerServiceTest
332*ec779b8eSAndroid Build Coastguard Worker     return mResourceTracker->getLowestPriorityPid(type, subType,
333*ec779b8eSAndroid Build Coastguard Worker                                                   *lowestPriorityPid,
334*ec779b8eSAndroid Build Coastguard Worker                                                   *lowestPriority);
335*ec779b8eSAndroid Build Coastguard Worker }
336*ec779b8eSAndroid Build Coastguard Worker 
getAllClients_l(const ResourceRequestInfo & resourceRequestInfo,std::vector<ClientInfo> & clientsInfo)337*ec779b8eSAndroid Build Coastguard Worker bool ResourceManagerServiceNew::getAllClients_l(
338*ec779b8eSAndroid Build Coastguard Worker         const ResourceRequestInfo& resourceRequestInfo,
339*ec779b8eSAndroid Build Coastguard Worker         std::vector<ClientInfo>& clientsInfo) {
340*ec779b8eSAndroid Build Coastguard Worker     //NOTE: This function is used only by the test: ResourceManagerServiceTest
341*ec779b8eSAndroid Build Coastguard Worker     MediaResource::Type type = resourceRequestInfo.mResource->type;
342*ec779b8eSAndroid Build Coastguard Worker     // Get the list of all clients that has requested resources.
343*ec779b8eSAndroid Build Coastguard Worker     std::vector<ClientInfo> clients;
344*ec779b8eSAndroid Build Coastguard Worker     mResourceTracker->getAllClients(resourceRequestInfo, clients);
345*ec779b8eSAndroid Build Coastguard Worker 
346*ec779b8eSAndroid Build Coastguard Worker     // Check is there any high priority process holding up the resources already.
347*ec779b8eSAndroid Build Coastguard Worker     for (const ClientInfo& info : clients) {
348*ec779b8eSAndroid Build Coastguard Worker         if (!isCallingPriorityHigher_l(resourceRequestInfo.mCallingPid, info.mPid)) {
349*ec779b8eSAndroid Build Coastguard Worker             // some higher/equal priority process owns the resource,
350*ec779b8eSAndroid Build Coastguard Worker             // this request can't be fulfilled.
351*ec779b8eSAndroid Build Coastguard Worker             ALOGE("%s: can't reclaim resource %s from pid %d", __func__, asString(type), info.mPid);
352*ec779b8eSAndroid Build Coastguard Worker             return false;
353*ec779b8eSAndroid Build Coastguard Worker         }
354*ec779b8eSAndroid Build Coastguard Worker         clientsInfo.emplace_back(info);
355*ec779b8eSAndroid Build Coastguard Worker     }
356*ec779b8eSAndroid Build Coastguard Worker     if (clientsInfo.size() == 0) {
357*ec779b8eSAndroid Build Coastguard Worker         ALOGV("%s: didn't find any resource %s", __func__, asString(type));
358*ec779b8eSAndroid Build Coastguard Worker     }
359*ec779b8eSAndroid Build Coastguard Worker     return true;
360*ec779b8eSAndroid Build Coastguard Worker }
361*ec779b8eSAndroid Build Coastguard Worker 
getClient_l(int pid,const int64_t & clientId) const362*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<IResourceManagerClient> ResourceManagerServiceNew::getClient_l(
363*ec779b8eSAndroid Build Coastguard Worker         int pid, const int64_t& clientId) const {
364*ec779b8eSAndroid Build Coastguard Worker     return mResourceTracker->getClient(pid, clientId);
365*ec779b8eSAndroid Build Coastguard Worker }
366*ec779b8eSAndroid Build Coastguard Worker 
removeClient_l(int pid,const int64_t & clientId)367*ec779b8eSAndroid Build Coastguard Worker bool ResourceManagerServiceNew::removeClient_l(int pid, const int64_t& clientId) {
368*ec779b8eSAndroid Build Coastguard Worker     return mResourceTracker->removeClient(pid, clientId);
369*ec779b8eSAndroid Build Coastguard Worker }
370*ec779b8eSAndroid Build Coastguard Worker 
getResourceMap() const371*ec779b8eSAndroid Build Coastguard Worker const std::map<int, ResourceInfos>& ResourceManagerServiceNew::getResourceMap() const {
372*ec779b8eSAndroid Build Coastguard Worker     return mResourceTracker->getResourceMap();
373*ec779b8eSAndroid Build Coastguard Worker }
374*ec779b8eSAndroid Build Coastguard Worker 
setReclaimPolicy(bool processPriority,bool clientImportance)375*ec779b8eSAndroid Build Coastguard Worker void ResourceManagerServiceNew::setReclaimPolicy(bool processPriority, bool clientImportance) {
376*ec779b8eSAndroid Build Coastguard Worker     mReclaimPolicies.clear();
377*ec779b8eSAndroid Build Coastguard Worker     if (processPriority) {
378*ec779b8eSAndroid Build Coastguard Worker         // Process priority (oom score) as the Default reclaim policy.
379*ec779b8eSAndroid Build Coastguard Worker         mReclaimPolicies.push_back(std::make_unique<ProcessPriorityReclaimPolicy>(
380*ec779b8eSAndroid Build Coastguard Worker             mResourceTracker));
381*ec779b8eSAndroid Build Coastguard Worker     }
382*ec779b8eSAndroid Build Coastguard Worker     if (clientImportance) {
383*ec779b8eSAndroid Build Coastguard Worker         mReclaimPolicies.push_back(std::make_unique<ClientImportanceReclaimPolicy>(
384*ec779b8eSAndroid Build Coastguard Worker             mResourceTracker));
385*ec779b8eSAndroid Build Coastguard Worker     }
386*ec779b8eSAndroid Build Coastguard Worker }
387*ec779b8eSAndroid Build Coastguard Worker 
388*ec779b8eSAndroid Build Coastguard Worker } // namespace android
389