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

Commit 1e138919 authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge "Allow to drop existing fd cache of cgroup path"

parents 2a6ec6c3 a6abd821
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -39,6 +39,11 @@ static constexpr const char* CGROUPS_RC_PATH = "/dev/cgroup_info/cgroup.rc";

bool UsePerAppMemcg();

// Drop the fd cache of cgroup path. It is used for when resource caching is enabled and a process
// loses the access to the path, the access checking (See SetCgroupAction::EnableResourceCaching)
// should be active again. E.g. Zygote specialization for child process.
void DropTaskProfilesResourceCaching();

// Return 0 and removes the cgroup if there are no longer any processes in it.
// Returns -1 in the case of an error occurring or if there are processes still running
// even after retrying for up to 200ms.
+4 −0
Original line number Diff line number Diff line
@@ -111,6 +111,10 @@ static bool isMemoryCgroupSupported() {
    return memcg_supported;
}

void DropTaskProfilesResourceCaching() {
    TaskProfiles::GetInstance().DropResourceCaching();
}

bool SetProcessProfiles(uid_t uid, pid_t pid, const std::vector<std::string>& profiles,
                        bool use_fd_cache) {
    const TaskProfiles& tp = TaskProfiles::GetInstance();
+27 −0
Original line number Diff line number Diff line
@@ -173,6 +173,15 @@ void SetCgroupAction::EnableResourceCaching() {
    fd_ = std::move(fd);
}

void SetCgroupAction::DropResourceCaching() {
    std::lock_guard<std::mutex> lock(fd_mutex_);
    if (fd_ == FDS_NOT_CACHED) {
        return;
    }

    fd_.reset(FDS_NOT_CACHED);
}

bool SetCgroupAction::AddTidToCgroup(int tid, int fd) {
    if (tid <= 0) {
        return true;
@@ -292,6 +301,24 @@ void TaskProfile::EnableResourceCaching() {
    res_cached_ = true;
}

void TaskProfile::DropResourceCaching() {
    if (!res_cached_) {
        return;
    }

    for (auto& element : elements_) {
        element->DropResourceCaching();
    }

    res_cached_ = false;
}

void TaskProfiles::DropResourceCaching() const {
    for (auto& iter : profiles_) {
        iter.second->DropResourceCaching();
    }
}

TaskProfiles& TaskProfiles::GetInstance() {
    // Deliberately leak this object to avoid a race between destruction on
    // process exit and concurrent access from another thread.
+4 −0
Original line number Diff line number Diff line
@@ -51,6 +51,7 @@ class ProfileAction {
    virtual bool ExecuteForTask(int) const { return false; };

    virtual void EnableResourceCaching() {}
    virtual void DropResourceCaching() {}
};

// Profile actions
@@ -114,6 +115,7 @@ class SetCgroupAction : public ProfileAction {
    virtual bool ExecuteForProcess(uid_t uid, pid_t pid) const;
    virtual bool ExecuteForTask(int tid) const;
    virtual void EnableResourceCaching();
    virtual void DropResourceCaching();

    const CgroupController* controller() const { return &controller_; }
    std::string path() const { return path_; }
@@ -145,6 +147,7 @@ class TaskProfile {
    bool ExecuteForProcess(uid_t uid, pid_t pid) const;
    bool ExecuteForTask(int tid) const;
    void EnableResourceCaching();
    void DropResourceCaching();

  private:
    bool res_cached_;
@@ -158,6 +161,7 @@ class TaskProfiles {

    TaskProfile* GetProfile(const std::string& name) const;
    const ProfileAttribute* GetAttribute(const std::string& name) const;
    void DropResourceCaching() const;

  private:
    std::map<std::string, std::unique_ptr<TaskProfile>> profiles_;