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

Commit 3421354f authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge changes I02e3046b,I5b33ca47 into main am: 50eaceed am: f0e1d510 am:...

Merge changes I02e3046b,I5b33ca47 into main am: 50eaceed am: f0e1d510 am: 543846cb am: 651368b0

Original change: https://android-review.googlesource.com/c/platform/system/core/+/2675707



Change-Id: I9330eb8c7a9c0c42fddbfaeb71d3de3a86331f13
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents 34b57da6 651368b0
Loading
Loading
Loading
Loading
+46 −21
Original line number Diff line number Diff line
@@ -114,9 +114,26 @@ bool FdCacheHelper::IsAppDependentPath(const std::string& path) {

IProfileAttribute::~IProfileAttribute() = default;

void ProfileAttribute::Reset(const CgroupController& controller, const std::string& file_name) {
const std::string& ProfileAttribute::file_name() const {
    if (controller()->version() == 2 && !file_v2_name_.empty()) return file_v2_name_;
    return file_name_;
}

void ProfileAttribute::Reset(const CgroupController& controller, const std::string& file_name,
                             const std::string& file_v2_name) {
    controller_ = controller;
    file_name_ = file_name;
    file_v2_name_ = file_v2_name;
}

bool ProfileAttribute::GetPathForProcess(uid_t uid, pid_t pid, std::string* path) const {
    if (controller()->version() == 2) {
        // all cgroup v2 attributes use the same process group hierarchy
        *path = StringPrintf("%s/uid_%u/pid_%d/%s", controller()->path(), uid, pid,
                             file_name().c_str());
        return true;
    }
    return GetPathForTask(pid, path);
}

bool ProfileAttribute::GetPathForTask(int tid, std::string* path) const {
@@ -129,12 +146,11 @@ bool ProfileAttribute::GetPathForTask(int tid, std::string* path) const {
        return true;
    }

    const std::string& file_name =
            controller()->version() == 2 && !file_v2_name_.empty() ? file_v2_name_ : file_name_;
    if (subgroup.empty()) {
        *path = StringPrintf("%s/%s", controller()->path(), file_name.c_str());
        *path = StringPrintf("%s/%s", controller()->path(), file_name().c_str());
    } else {
        *path = StringPrintf("%s/%s/%s", controller()->path(), subgroup.c_str(), file_name.c_str());
        *path = StringPrintf("%s/%s/%s", controller()->path(), subgroup.c_str(),
                             file_name().c_str());
    }
    return true;
}
@@ -144,9 +160,7 @@ bool ProfileAttribute::GetPathForUID(uid_t uid, std::string* path) const {
        return true;
    }

    const std::string& file_name =
            controller()->version() == 2 && !file_v2_name_.empty() ? file_v2_name_ : file_name_;
    *path = StringPrintf("%s/uid_%u/%s", controller()->path(), uid, file_name.c_str());
    *path = StringPrintf("%s/uid_%u/%s", controller()->path(), uid, file_name().c_str());
    return true;
}

@@ -205,18 +219,7 @@ bool SetTimerSlackAction::ExecuteForTask(int) const {

#endif

bool SetAttributeAction::ExecuteForProcess(uid_t, pid_t pid) const {
    return ExecuteForTask(pid);
}

bool SetAttributeAction::ExecuteForTask(int tid) const {
    std::string path;

    if (!attribute_->GetPathForTask(tid, &path)) {
        LOG(ERROR) << "Failed to find cgroup for tid " << tid;
        return false;
    }

bool SetAttributeAction::WriteValueToFile(const std::string& path) const {
    if (!WriteStringToFile(value_, path)) {
        if (access(path.c_str(), F_OK) < 0) {
            if (optional_) {
@@ -236,6 +239,28 @@ bool SetAttributeAction::ExecuteForTask(int tid) const {
    return true;
}

bool SetAttributeAction::ExecuteForProcess(uid_t uid, pid_t pid) const {
    std::string path;

    if (!attribute_->GetPathForProcess(uid, pid, &path)) {
        LOG(ERROR) << "Failed to find cgroup for uid " << uid << " pid " << pid;
        return false;
    }

    return WriteValueToFile(path);
}

bool SetAttributeAction::ExecuteForTask(int tid) const {
    std::string path;

    if (!attribute_->GetPathForTask(tid, &path)) {
        LOG(ERROR) << "Failed to find cgroup for tid " << tid;
        return false;
    }

    return WriteValueToFile(path);
}

bool SetAttributeAction::ExecuteForUID(uid_t uid) const {
    std::string path;

@@ -816,7 +841,7 @@ bool TaskProfiles::Load(const CgroupMap& cg_map, const std::string& file_name) {
                attributes_[name] =
                        std::make_unique<ProfileAttribute>(controller, file_attr, file_v2_attr);
            } else {
                iter->second->Reset(controller, file_attr);
                iter->second->Reset(controller, file_attr, file_v2_attr);
            }
        } else {
            LOG(WARNING) << "Controller " << controller_name << " is not found";
+9 −3
Original line number Diff line number Diff line
@@ -32,9 +32,11 @@
class IProfileAttribute {
  public:
    virtual ~IProfileAttribute() = 0;
    virtual void Reset(const CgroupController& controller, const std::string& file_name) = 0;
    virtual void Reset(const CgroupController& controller, const std::string& file_name,
                       const std::string& file_v2_name) = 0;
    virtual const CgroupController* controller() const = 0;
    virtual const std::string& file_name() const = 0;
    virtual bool GetPathForProcess(uid_t uid, pid_t pid, std::string* path) const = 0;
    virtual bool GetPathForTask(int tid, std::string* path) const = 0;
    virtual bool GetPathForUID(uid_t uid, std::string* path) const = 0;
};
@@ -50,9 +52,11 @@ class ProfileAttribute : public IProfileAttribute {
    ~ProfileAttribute() = default;

    const CgroupController* controller() const override { return &controller_; }
    const std::string& file_name() const override { return file_name_; }
    void Reset(const CgroupController& controller, const std::string& file_name) override;
    const std::string& file_name() const override;
    void Reset(const CgroupController& controller, const std::string& file_name,
               const std::string& file_v2_name) override;

    bool GetPathForProcess(uid_t uid, pid_t pid, std::string* path) const override;
    bool GetPathForTask(int tid, std::string* path) const override;
    bool GetPathForUID(uid_t uid, std::string* path) const override;

@@ -131,6 +135,8 @@ class SetAttributeAction : public ProfileAction {
    const IProfileAttribute* attribute_;
    std::string value_;
    bool optional_;

    bool WriteValueToFile(const std::string& path) const;
};

// Set cgroup profile element
+6 −4
Original line number Diff line number Diff line
@@ -102,7 +102,8 @@ class ProfileAttributeMock : public IProfileAttribute {
  public:
    ProfileAttributeMock(const std::string& file_name) : file_name_(file_name) {}
    ~ProfileAttributeMock() override = default;
    void Reset(const CgroupController& controller, const std::string& file_name) override {
    void Reset(const CgroupController& controller, const std::string& file_name,
               const std::string& file_v2_name) override {
        CHECK(false);
    }
    const CgroupController* controller() const override {
@@ -110,6 +111,9 @@ class ProfileAttributeMock : public IProfileAttribute {
        return {};
    }
    const std::string& file_name() const override { return file_name_; }
    bool GetPathForProcess(uid_t uid, pid_t pid, std::string* path) const override {
        return GetPathForTask(pid, path);
    }
    bool GetPathForTask(int tid, std::string* path) const override {
#ifdef __ANDROID__
        CHECK(CgroupGetControllerPath(CGROUPV2_CONTROLLER_NAME, path));
@@ -125,9 +129,7 @@ class ProfileAttributeMock : public IProfileAttribute {
        return true;
    };

    bool GetPathForUID(uid_t, std::string*) const override {
        return false;
    }
    bool GetPathForUID(uid_t, std::string*) const override { return false; }

  private:
    const std::string file_name_;