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