blob: 1519e0e6e8660a92643f6d1dc038611c03fd6a76 [file] [log] [blame]
Ronghua Wu231c3d12015-03-11 15:10:32 -07001/*
2**
3** Copyright 2015, The Android Open Source Project
4**
5** Licensed under the Apache License, Version 2.0 (the "License");
6** you may not use this file except in compliance with the License.
7** You may obtain a copy of the License at
8**
9** http://www.apache.org/licenses/LICENSE-2.0
10**
11** Unless required by applicable law or agreed to in writing, software
12** distributed under the License is distributed on an "AS IS" BASIS,
13** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14** See the License for the specific language governing permissions and
15** limitations under the License.
16*/
17
Chong Zhang181e6952019-10-09 13:23:39 -070018#ifndef ANDROID_MEDIA_RESOURCEMANAGERSERVICE_H
19#define ANDROID_MEDIA_RESOURCEMANAGERSERVICE_H
Ronghua Wu231c3d12015-03-11 15:10:32 -070020
Wonsik Kimd20e9362020-04-28 10:42:57 -070021#include <map>
Girish9128e242022-11-23 20:52:29 +000022#include <set>
Chong Zhang97d367b2020-09-16 12:53:14 -070023#include <mutex>
Girish9128e242022-11-23 20:52:29 +000024#include <string>
Wonsik Kimd20e9362020-04-28 10:42:57 -070025
Chong Zhangfdd512a2019-11-22 11:03:14 -080026#include <aidl/android/media/BnResourceManagerService.h>
Ronghua Wu231c3d12015-03-11 15:10:32 -070027#include <arpa/inet.h>
Chong Zhang181e6952019-10-09 13:23:39 -070028#include <media/MediaResource.h>
Ronghua Wu231c3d12015-03-11 15:10:32 -070029#include <utils/Errors.h>
30#include <utils/KeyedVector.h>
31#include <utils/String8.h>
32#include <utils/threads.h>
33#include <utils/Vector.h>
34
Ronghua Wu231c3d12015-03-11 15:10:32 -070035namespace android {
36
Chong Zhangfdd512a2019-11-22 11:03:14 -080037class DeathNotifier;
38class ResourceManagerService;
Chong Zhanga9d45c72020-09-09 12:41:17 -070039class ResourceObserverService;
Ronghua Wua8ec8fc2015-05-07 13:58:22 -070040class ServiceLog;
Ronghua Wu231c3d12015-03-11 15:10:32 -070041struct ProcessInfoInterface;
Girish1f002cf2023-02-17 00:36:29 +000042class ResourceManagerMetrics;
Ronghua Wu231c3d12015-03-11 15:10:32 -070043
Chong Zhangfdd512a2019-11-22 11:03:14 -080044using Status = ::ndk::ScopedAStatus;
45using ::aidl::android::media::IResourceManagerClient;
46using ::aidl::android::media::BnResourceManagerService;
47using ::aidl::android::media::MediaResourceParcel;
48using ::aidl::android::media::MediaResourcePolicyParcel;
Girish9128e242022-11-23 20:52:29 +000049using ::aidl::android::media::ClientInfoParcel;
Girish1f002cf2023-02-17 00:36:29 +000050using ::aidl::android::media::ClientConfigParcel;
Chong Zhang181e6952019-10-09 13:23:39 -070051
52typedef std::map<std::tuple<
Jooyung Han3d564ff2020-02-22 00:46:06 +090053 MediaResource::Type, MediaResource::SubType, std::vector<uint8_t>>,
Chong Zhang181e6952019-10-09 13:23:39 -070054 MediaResourceParcel> ResourceList;
55
Ronghua Wu231c3d12015-03-11 15:10:32 -070056struct ResourceInfo {
Chong Zhangee33d642019-08-08 14:26:43 -070057 uid_t uid;
Girish9128e242022-11-23 20:52:29 +000058 int64_t clientId;
59 std::string name;
Chong Zhangfdd512a2019-11-22 11:03:14 -080060 std::shared_ptr<IResourceManagerClient> client;
Chong Zhang97d367b2020-09-16 12:53:14 -070061 uintptr_t cookie{0};
Chong Zhangfb092d32019-08-12 09:45:44 -070062 ResourceList resources;
Wonsik Kimd20e9362020-04-28 10:42:57 -070063 bool pendingRemoval{false};
Ronghua Wu231c3d12015-03-11 15:10:32 -070064};
65
Girish1f002cf2023-02-17 00:36:29 +000066// vector of <PID, UID>
Girish9128e242022-11-23 20:52:29 +000067typedef std::vector<std::pair<int32_t, uid_t>> PidUidVector;
68
Chong Zhangfb092d32019-08-12 09:45:44 -070069// TODO: convert these to std::map
70typedef KeyedVector<int64_t, ResourceInfo> ResourceInfos;
Ronghua Wu231c3d12015-03-11 15:10:32 -070071typedef KeyedVector<int, ResourceInfos> PidResourceInfosMap;
72
Chong Zhangfdd512a2019-11-22 11:03:14 -080073class ResourceManagerService : public BnResourceManagerService {
Ronghua Wu231c3d12015-03-11 15:10:32 -070074public:
Chong Zhangdd726802019-08-21 17:24:13 -070075 struct SystemCallbackInterface : public RefBase {
76 virtual void noteStartVideo(int uid) = 0;
77 virtual void noteStopVideo(int uid) = 0;
78 virtual void noteResetVideo() = 0;
Chong Zhangfdd512a2019-11-22 11:03:14 -080079 virtual bool requestCpusetBoost(bool enable) = 0;
Chong Zhangdd726802019-08-21 17:24:13 -070080 };
81
Ronghua Wu231c3d12015-03-11 15:10:32 -070082 static char const *getServiceName() { return "media.resource_manager"; }
Chong Zhangfdd512a2019-11-22 11:03:14 -080083 static void instantiate();
Ronghua Wu231c3d12015-03-11 15:10:32 -070084
Chong Zhangfdd512a2019-11-22 11:03:14 -080085 virtual inline binder_status_t dump(
86 int /*fd*/, const char** /*args*/, uint32_t /*numArgs*/);
Ronghua Wu8f9dd872015-04-23 15:24:25 -070087
Ronghua Wu231c3d12015-03-11 15:10:32 -070088 ResourceManagerService();
Brian Lindahl64ee9452022-01-14 13:31:16 +010089 explicit ResourceManagerService(const sp<ProcessInfoInterface> &processInfo,
Chong Zhangdd726802019-08-21 17:24:13 -070090 const sp<SystemCallbackInterface> &systemResource);
Chong Zhangfdd512a2019-11-22 11:03:14 -080091 virtual ~ResourceManagerService();
Brian Lindahl64ee9452022-01-14 13:31:16 +010092 void setObserverService(const std::shared_ptr<ResourceObserverService>& observerService);
Ronghua Wu231c3d12015-03-11 15:10:32 -070093
94 // IResourceManagerService interface
Chong Zhang181e6952019-10-09 13:23:39 -070095 Status config(const std::vector<MediaResourcePolicyParcel>& policies) override;
Ronghua Wu231c3d12015-03-11 15:10:32 -070096
Girish9128e242022-11-23 20:52:29 +000097 Status addResource(const ClientInfoParcel& clientInfo,
98 const std::shared_ptr<IResourceManagerClient>& client,
99 const std::vector<MediaResourceParcel>& resources) override;
Ronghua Wu231c3d12015-03-11 15:10:32 -0700100
Girish9128e242022-11-23 20:52:29 +0000101 Status removeResource(const ClientInfoParcel& clientInfo,
102 const std::vector<MediaResourceParcel>& resources) override;
Chong Zhangfb092d32019-08-12 09:45:44 -0700103
Girish9128e242022-11-23 20:52:29 +0000104 Status removeClient(const ClientInfoParcel& clientInfo) override;
Ronghua Wu231c3d12015-03-11 15:10:32 -0700105
Ronghua Wu05d89f12015-07-07 16:47:42 -0700106 // Tries to reclaim resource from processes with lower priority than the calling process
107 // according to the requested resources.
108 // Returns true if any resource has been reclaimed, otherwise returns false.
Girish9128e242022-11-23 20:52:29 +0000109 Status reclaimResource(const ClientInfoParcel& clientInfo,
110 const std::vector<MediaResourceParcel>& resources,
111 bool* _aidl_return) override;
Ronghua Wu231c3d12015-03-11 15:10:32 -0700112
Girish9128e242022-11-23 20:52:29 +0000113 Status overridePid(int32_t originalPid, int32_t newPid) override;
Henry Fang32762922020-01-28 18:40:39 -0800114
Girish9128e242022-11-23 20:52:29 +0000115 Status overrideProcessInfo(const std::shared_ptr<IResourceManagerClient>& client,
116 int32_t pid, int32_t procState, int32_t oomScore) override;
Chong Zhang97d367b2020-09-16 12:53:14 -0700117
Girish9128e242022-11-23 20:52:29 +0000118 Status markClientForPendingRemoval(const ClientInfoParcel& clientInfo) override;
Wonsik Kimd20e9362020-04-28 10:42:57 -0700119
Wonsik Kim271429d2020-10-01 10:12:56 -0700120 Status reclaimResourcesFromClientsPendingRemoval(int32_t pid) override;
121
Girish9128e242022-11-23 20:52:29 +0000122 Status removeResource(const ClientInfoParcel& clientInfo, bool checkValid);
Wonsik Kim3e378962017-01-05 17:00:02 +0900123
Girish1f002cf2023-02-17 00:36:29 +0000124 Status notifyClientCreated(const ClientInfoParcel& clientInfo) override;
125
126 Status notifyClientStarted(const ClientConfigParcel& clientConfig) override;
127
128 Status notifyClientStopped(const ClientConfigParcel& clientConfig) override;
129
Girishde8eb592023-04-13 18:49:17 +0000130 Status notifyClientConfigChanged(const ClientConfigParcel& clientConfig) override;
131
Ronghua Wu231c3d12015-03-11 15:10:32 -0700132private:
133 friend class ResourceManagerServiceTest;
Chong Zhang97d367b2020-09-16 12:53:14 -0700134 friend class DeathNotifier;
135 friend class OverrideProcessInfoDeathNotifier;
Ronghua Wu231c3d12015-03-11 15:10:32 -0700136
Wonsik Kim271429d2020-10-01 10:12:56 -0700137 // Reclaims resources from |clients|. Returns true if reclaim succeeded
138 // for all clients.
Brian Lindahl64ee9452022-01-14 13:31:16 +0100139 bool reclaimUnconditionallyFrom(const Vector<std::shared_ptr<IResourceManagerClient>> &clients);
Wonsik Kim271429d2020-10-01 10:12:56 -0700140
Ronghua Wu231c3d12015-03-11 15:10:32 -0700141 // Gets the list of all the clients who own the specified resource type.
142 // Returns false if any client belongs to a process with higher priority than the
143 // calling process. The clients will remain unchanged if returns false.
Brian Lindahl64ee9452022-01-14 13:31:16 +0100144 bool getAllClients_l(int callingPid, MediaResource::Type type, MediaResource::SubType subType,
Girish9128e242022-11-23 20:52:29 +0000145 PidUidVector* idList,
Chong Zhangfdd512a2019-11-22 11:03:14 -0800146 Vector<std::shared_ptr<IResourceManagerClient>> *clients);
Ronghua Wu231c3d12015-03-11 15:10:32 -0700147
148 // Gets the client who owns specified resource type from lowest possible priority process.
149 // Returns false if the calling process priority is not higher than the lowest process
150 // priority. The client will remain unchanged if returns false.
Ronghua Wuea15fd22016-03-03 13:35:05 -0800151 bool getLowestPriorityBiggestClient_l(int callingPid, MediaResource::Type type,
Girish9128e242022-11-23 20:52:29 +0000152 MediaResource::SubType subType, PidUidVector* idList,
153 std::shared_ptr<IResourceManagerClient> *client);
Ronghua Wu231c3d12015-03-11 15:10:32 -0700154
155 // Gets lowest priority process that has the specified resource type.
156 // Returns false if failed. The output parameters will remain unchanged if failed.
Brian Lindahl64ee9452022-01-14 13:31:16 +0100157 bool getLowestPriorityPid_l(MediaResource::Type type, MediaResource::SubType subType, int *pid,
158 int *priority);
Ronghua Wu231c3d12015-03-11 15:10:32 -0700159
160 // Gets the client who owns biggest piece of specified resource type from pid.
Brian Lindahl64ee9452022-01-14 13:31:16 +0100161 // Returns false with no change to client if there are no clients holdiing resources of thisi
162 // type.
163 bool getBiggestClient_l(int pid, MediaResource::Type type, MediaResource::SubType subType,
Girish9128e242022-11-23 20:52:29 +0000164 uid_t& uid, std::shared_ptr<IResourceManagerClient> *client,
Wonsik Kimd20e9362020-04-28 10:42:57 -0700165 bool pendingRemovalOnly = false);
Brian Lindahl64ee9452022-01-14 13:31:16 +0100166 // Same method as above, but with pendingRemovalOnly as true.
167 bool getBiggestClientPendingRemoval_l(int pid, MediaResource::Type type,
Girish9128e242022-11-23 20:52:29 +0000168 MediaResource::SubType subType, uid_t& uid,
169 std::shared_ptr<IResourceManagerClient> *client);
Ronghua Wu231c3d12015-03-11 15:10:32 -0700170
171 bool isCallingPriorityHigher_l(int callingPid, int pid);
172
Chong Zhangfdd512a2019-11-22 11:03:14 -0800173 // A helper function basically calls getLowestPriorityBiggestClient_l and add
174 // the result client to the given Vector.
175 void getClientForResource_l(int callingPid, const MediaResourceParcel *res,
Girish9128e242022-11-23 20:52:29 +0000176 PidUidVector* idList,
Chong Zhangfdd512a2019-11-22 11:03:14 -0800177 Vector<std::shared_ptr<IResourceManagerClient>> *clients);
Ronghua Wu05d89f12015-07-07 16:47:42 -0700178
Chong Zhang181e6952019-10-09 13:23:39 -0700179 void onFirstAdded(const MediaResourceParcel& res, const ResourceInfo& clientInfo);
180 void onLastRemoved(const MediaResourceParcel& res, const ResourceInfo& clientInfo);
Chong Zhangfb092d32019-08-12 09:45:44 -0700181
Robert Shihc3af31b2019-09-20 21:45:01 -0700182 // Merge r2 into r1
Chong Zhang181e6952019-10-09 13:23:39 -0700183 void mergeResources(MediaResourceParcel& r1, const MediaResourceParcel& r2);
Robert Shihc3af31b2019-09-20 21:45:01 -0700184
Henry Fang32762922020-01-28 18:40:39 -0800185 // Get priority from process's pid
186 bool getPriority_l(int pid, int* priority);
187
Chong Zhang97d367b2020-09-16 12:53:14 -0700188 void removeProcessInfoOverride(int pid);
189
190 void removeProcessInfoOverride_l(int pid);
Arun Johnsond1f59732022-03-25 17:10:29 +0000191 uintptr_t addCookieAndLink_l(const std::shared_ptr<IResourceManagerClient>& client,
192 const sp<DeathNotifier>& notifier);
193 void removeCookieAndUnlink_l(const std::shared_ptr<IResourceManagerClient>& client,
194 uintptr_t cookie);
Chong Zhang97d367b2020-09-16 12:53:14 -0700195
Girish9128e242022-11-23 20:52:29 +0000196 void pushReclaimAtom(const ClientInfoParcel& clientInfo,
197 const Vector<std::shared_ptr<IResourceManagerClient>>& clients,
198 const PidUidVector& idList, bool reclaimed);
199
Girish1f002cf2023-02-17 00:36:29 +0000200 // Get the peak concurrent pixel count (associated with the video codecs) for the process.
201 long getPeakConcurrentPixelCount(int pid) const;
202 // Get the current concurrent pixel count (associated with the video codecs) for the process.
203 long getCurrentConcurrentPixelCount(int pid) const;
204
Ronghua Wu231c3d12015-03-11 15:10:32 -0700205 mutable Mutex mLock;
206 sp<ProcessInfoInterface> mProcessInfo;
Chong Zhangdd726802019-08-21 17:24:13 -0700207 sp<SystemCallbackInterface> mSystemCB;
Ronghua Wua8ec8fc2015-05-07 13:58:22 -0700208 sp<ServiceLog> mServiceLog;
Ronghua Wu231c3d12015-03-11 15:10:32 -0700209 PidResourceInfosMap mMap;
210 bool mSupportsMultipleSecureCodecs;
211 bool mSupportsSecureWithNonSecureCodec;
Chong Zhang79d2b282018-04-17 14:14:31 -0700212 int32_t mCpuBoostCount;
Chong Zhangfdd512a2019-11-22 11:03:14 -0800213 ::ndk::ScopedAIBinder_DeathRecipient mDeathRecipient;
Chong Zhang97d367b2020-09-16 12:53:14 -0700214 struct ProcessInfoOverride {
215 uintptr_t cookie;
216 std::shared_ptr<IResourceManagerClient> client;
217 };
Henry Fang32762922020-01-28 18:40:39 -0800218 std::map<int, int> mOverridePidMap;
Chong Zhang97d367b2020-09-16 12:53:14 -0700219 std::map<pid_t, ProcessInfoOverride> mProcessInfoOverrideMap;
220 static std::mutex sCookieLock;
221 static uintptr_t sCookieCounter GUARDED_BY(sCookieLock);
222 static std::map<uintptr_t, sp<DeathNotifier> > sCookieToDeathNotifierMap
223 GUARDED_BY(sCookieLock);
Chong Zhanga9d45c72020-09-09 12:41:17 -0700224 std::shared_ptr<ResourceObserverService> mObserverService;
Girish1f002cf2023-02-17 00:36:29 +0000225 std::unique_ptr<ResourceManagerMetrics> mResourceManagerMetrics;
Ronghua Wu231c3d12015-03-11 15:10:32 -0700226};
227
228// ----------------------------------------------------------------------------
Chong Zhang181e6952019-10-09 13:23:39 -0700229} // namespace android
Ronghua Wu231c3d12015-03-11 15:10:32 -0700230
Chong Zhang181e6952019-10-09 13:23:39 -0700231#endif // ANDROID_MEDIA_RESOURCEMANAGERSERVICE_H