Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 97d367b2 authored by Chong Zhang's avatar Chong Zhang
Browse files

Allow native process to set procinfo in ResourceManager

And set the override in transcoding service to allow
ResourceManager to reclaim from it.

bug: 168307955
test: mediatranscodingservice unit tests;
ResourceManager unit tests;
CTS ResourceManagerTest; manually verify that binderDied
events are handled correctly.

Change-Id: I3193a0e29c1efbaf641e8c6b391241233d9cc404
parent 2526250c
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -65,6 +65,14 @@ struct FakeProcessInfo : public ProcessInfoInterface {
        return true;
    }

    virtual bool overrideProcessInfo(
            int /* pid */, int /* procState */, int /* oomScore */) {
        return true;
    }

    virtual void removeProcessInfoOverride(int /* pid */) {
    }

private:
    DISALLOW_EVIL_CONSTRUCTORS(FakeProcessInfo);
};
+1 −0
Original line number Diff line number Diff line
@@ -72,6 +72,7 @@ cc_library_shared {

    static_libs: [
        "mediatranscoding_aidl_interface-ndk_platform",
        "resourcemanager_aidl_interface-ndk_platform",
    ],

    cflags: [
+58 −0
Original line number Diff line number Diff line
@@ -17,6 +17,10 @@
//#define LOG_NDEBUG 0
#define LOG_TAG "TranscodingUidPolicy"

#include <aidl/android/media/BnResourceManagerClient.h>
#include <aidl/android/media/IResourceManagerService.h>
#include <android/binder_manager.h>
#include <android/binder_process.h>
#include <binder/ActivityManager.h>
#include <cutils/misc.h>  // FIRST_APPLICATION_UID
#include <inttypes.h>
@@ -30,6 +34,43 @@ namespace android {
constexpr static uid_t OFFLINE_UID = -1;
constexpr static const char* kTranscodingTag = "transcoding";

/*
 * The OOM score we're going to ask ResourceManager to use for our native transcoding
 * service. ResourceManager issues reclaims based on these scores. It gets the scores
 * from ActivityManagerService, which doesn't track native services. The values of the
 * OOM scores are defined in:
 * frameworks/base/services/core/java/com/android/server/am/ProcessList.java
 * We use SERVICE_ADJ which is lower priority than an app possibly visible to the
 * user, but higher priority than a cached app (which could be killed without disruption
 * to the user).
 */
constexpr static int32_t SERVICE_ADJ = 500;

using Status = ::ndk::ScopedAStatus;
using aidl::android::media::BnResourceManagerClient;
using aidl::android::media::IResourceManagerService;

/*
 * Placeholder ResourceManagerClient for registering process info override
 * with the IResourceManagerService. This is only used as a token by the service
 * to get notifications about binder death, not used for reclaiming resources.
 */
struct TranscodingUidPolicy::ResourceManagerClient : public BnResourceManagerClient {
    explicit ResourceManagerClient() = default;

    Status reclaimResource(bool* _aidl_return) override {
        *_aidl_return = false;
        return Status::ok();
    }

    Status getName(::std::string* _aidl_return) override {
        _aidl_return->clear();
        return Status::ok();
    }

    virtual ~ResourceManagerClient() = default;
};

struct TranscodingUidPolicy::UidObserver : public BnUidObserver,
                                           public virtual IBinder::DeathRecipient {
    explicit UidObserver(TranscodingUidPolicy* owner) : mOwner(owner) {}
@@ -74,6 +115,7 @@ TranscodingUidPolicy::TranscodingUidPolicy()
        mRegistered(false),
        mTopUidState(ActivityManager::PROCESS_STATE_UNKNOWN) {
    registerSelf();
    setProcessInfoOverride();
}

TranscodingUidPolicy::~TranscodingUidPolicy() {
@@ -109,6 +151,22 @@ void TranscodingUidPolicy::unregisterSelf() {
    ALOGI("TranscodingUidPolicy: Unregistered with ActivityManager");
}

void TranscodingUidPolicy::setProcessInfoOverride() {
    ::ndk::SpAIBinder binder(AServiceManager_getService("media.resource_manager"));
    std::shared_ptr<IResourceManagerService> service = IResourceManagerService::fromBinder(binder);
    if (service == nullptr) {
        ALOGE("Failed to get IResourceManagerService");
        return;
    }

    mProcInfoOverrideClient = ::ndk::SharedRefBase::make<ResourceManagerClient>();
    Status status = service->overrideProcessInfo(
            mProcInfoOverrideClient, getpid(), ActivityManager::PROCESS_STATE_SERVICE, SERVICE_ADJ);
    if (!status.isOk()) {
        ALOGW("Failed to setProcessInfoOverride.");
    }
}

void TranscodingUidPolicy::setUidObserverRegistered(bool registered) {
    Mutex::Autolock _l(mUidLock);

+3 −0
Original line number Diff line number Diff line
@@ -53,10 +53,12 @@ private:
    void setUidObserverRegistered(bool registerd);
    void registerSelf();
    void unregisterSelf();
    void setProcessInfoOverride();
    int32_t getProcState_l(uid_t uid) NO_THREAD_SAFETY_ANALYSIS;
    void updateTopUid_l() NO_THREAD_SAFETY_ANALYSIS;

    struct UidObserver;
    struct ResourceManagerClient;
    mutable Mutex mUidLock;
    std::shared_ptr<ActivityManager> mAm;
    sp<UidObserver> mUidObserver;
@@ -65,6 +67,7 @@ private:
    std::unordered_map<uid_t, int32_t> mUidStateMap GUARDED_BY(mUidLock);
    std::map<int32_t, std::unordered_set<uid_t>> mStateUidMap GUARDED_BY(mUidLock);
    std::weak_ptr<UidPolicyCallbackInterface> mUidPolicyCallback;
    std::shared_ptr<ResourceManagerClient> mProcInfoOverrideClient;
};  // class TranscodingUidPolicy

}  // namespace android
+12 −0
Original line number Diff line number Diff line
@@ -20,6 +20,9 @@

#include <media/stagefright/foundation/ABase.h>
#include <media/stagefright/ProcessInfoInterface.h>
#include <map>
#include <mutex>
#include <utils/Condition.h>

namespace android {

@@ -28,11 +31,20 @@ struct ProcessInfo : public ProcessInfoInterface {

    virtual bool getPriority(int pid, int* priority);
    virtual bool isValidPid(int pid);
    virtual bool overrideProcessInfo(int pid, int procState, int oomScore);
    virtual void removeProcessInfoOverride(int pid);

protected:
    virtual ~ProcessInfo();

private:
    struct ProcessInfoOverride {
        int procState;
        int oomScore;
    };
    std::mutex mOverrideLock;
    std::map<int, ProcessInfoOverride> mOverrideMap GUARDED_BY(mOverrideLock);

    DISALLOW_EVIL_CONSTRUCTORS(ProcessInfo);
};

Loading