Loading libprocessgroup/profiles/task_profiles.json +29 −2 Original line number Diff line number Diff line Loading @@ -15,21 +15,48 @@ "Controller": "cpuset", "File": "top-app/cpus" }, { "Name": "MemStats", "Controller": "memory", "File": "memory.stat" }, { "Name": "MemLimit", "Controller": "memory", "File": "memory.limit_in_bytes" "File": "memory.limit_in_bytes", "FileV2": "memory.max" }, { "Name": "MemSoftLimit", "Controller": "memory", "File": "memory.soft_limit_in_bytes" "File": "memory.soft_limit_in_bytes", "FileV2": "memory.low" }, { "Name": "MemSwappiness", "Controller": "memory", "File": "memory.swappiness" }, { "Name": "MemUsage", "Controller": "memory", "File": "memory.usage_in_bytes" }, { "Name": "MemAndSwapUsage", "Controller": "memory", "File": "memory.memsw.usage_in_bytes" }, { "Name": "MemPressureLevel", "Controller": "memory", "File": "memory.pressure_level" }, { "Name": "MemCgroupEventControl", "Controller": "memory", "File": "cgroup.event_control" }, { "Name": "UClampMin", "Controller": "cpu", Loading libprocessgroup/profiles/task_profiles.proto +3 −2 Original line number Diff line number Diff line Loading @@ -25,12 +25,13 @@ message TaskProfiles { repeated AggregateProfiles aggregateprofiles = 3 [json_name = "AggregateProfiles"]; } // Next: 5 // Next: 6 message Attribute { string name = 1 [json_name = "Name"]; string controller = 2 [json_name = "Controller"]; string file = 3 [json_name = "File"]; string optional = 4 [json_name = "Optional"]; string filev2 = 4 [json_name = "FileV2"]; string optional = 5 [json_name = "Optional"]; } // Next: 3 Loading libprocessgroup/task_profiles.cpp +12 −4 Original line number Diff line number Diff line Loading @@ -129,11 +129,12 @@ 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; } Loading Loading @@ -633,12 +634,19 @@ bool TaskProfiles::Load(const CgroupMap& cg_map, const std::string& file_name) { std::string name = attr[i]["Name"].asString(); std::string controller_name = attr[i]["Controller"].asString(); std::string file_attr = attr[i]["File"].asString(); std::string file_v2_attr = attr[i]["FileV2"].asString(); if (!file_v2_attr.empty() && file_attr.empty()) { LOG(ERROR) << "Attribute " << name << " has FileV2 but no File property"; return false; } auto controller = cg_map.FindController(controller_name); if (controller.HasValue()) { auto iter = attributes_.find(name); if (iter == attributes_.end()) { attributes_[name] = std::make_unique<ProfileAttribute>(controller, file_attr); attributes_[name] = std::make_unique<ProfileAttribute>(controller, file_attr, file_v2_attr); } else { iter->second->Reset(controller, file_attr); } Loading libprocessgroup/task_profiles.h +7 −2 Original line number Diff line number Diff line Loading @@ -37,8 +37,12 @@ class IProfileAttribute { class ProfileAttribute : public IProfileAttribute { public: ProfileAttribute(const CgroupController& controller, const std::string& file_name) : controller_(controller), file_name_(file_name) {} // Cgroup attributes may have different names in the v1 and v2 hierarchies. If `file_v2_name` is // not empty, `file_name` is the name for the v1 hierarchy and `file_v2_name` is the name for // the v2 hierarchy. If `file_v2_name` is empty, `file_name` is used for both hierarchies. ProfileAttribute(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) {} ~ProfileAttribute() = default; const CgroupController* controller() const override { return &controller_; } Loading @@ -50,6 +54,7 @@ class ProfileAttribute : public IProfileAttribute { private: CgroupController controller_; std::string file_name_; std::string file_v2_name_; }; // Abstract profile element Loading Loading
libprocessgroup/profiles/task_profiles.json +29 −2 Original line number Diff line number Diff line Loading @@ -15,21 +15,48 @@ "Controller": "cpuset", "File": "top-app/cpus" }, { "Name": "MemStats", "Controller": "memory", "File": "memory.stat" }, { "Name": "MemLimit", "Controller": "memory", "File": "memory.limit_in_bytes" "File": "memory.limit_in_bytes", "FileV2": "memory.max" }, { "Name": "MemSoftLimit", "Controller": "memory", "File": "memory.soft_limit_in_bytes" "File": "memory.soft_limit_in_bytes", "FileV2": "memory.low" }, { "Name": "MemSwappiness", "Controller": "memory", "File": "memory.swappiness" }, { "Name": "MemUsage", "Controller": "memory", "File": "memory.usage_in_bytes" }, { "Name": "MemAndSwapUsage", "Controller": "memory", "File": "memory.memsw.usage_in_bytes" }, { "Name": "MemPressureLevel", "Controller": "memory", "File": "memory.pressure_level" }, { "Name": "MemCgroupEventControl", "Controller": "memory", "File": "cgroup.event_control" }, { "Name": "UClampMin", "Controller": "cpu", Loading
libprocessgroup/profiles/task_profiles.proto +3 −2 Original line number Diff line number Diff line Loading @@ -25,12 +25,13 @@ message TaskProfiles { repeated AggregateProfiles aggregateprofiles = 3 [json_name = "AggregateProfiles"]; } // Next: 5 // Next: 6 message Attribute { string name = 1 [json_name = "Name"]; string controller = 2 [json_name = "Controller"]; string file = 3 [json_name = "File"]; string optional = 4 [json_name = "Optional"]; string filev2 = 4 [json_name = "FileV2"]; string optional = 5 [json_name = "Optional"]; } // Next: 3 Loading
libprocessgroup/task_profiles.cpp +12 −4 Original line number Diff line number Diff line Loading @@ -129,11 +129,12 @@ 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; } Loading Loading @@ -633,12 +634,19 @@ bool TaskProfiles::Load(const CgroupMap& cg_map, const std::string& file_name) { std::string name = attr[i]["Name"].asString(); std::string controller_name = attr[i]["Controller"].asString(); std::string file_attr = attr[i]["File"].asString(); std::string file_v2_attr = attr[i]["FileV2"].asString(); if (!file_v2_attr.empty() && file_attr.empty()) { LOG(ERROR) << "Attribute " << name << " has FileV2 but no File property"; return false; } auto controller = cg_map.FindController(controller_name); if (controller.HasValue()) { auto iter = attributes_.find(name); if (iter == attributes_.end()) { attributes_[name] = std::make_unique<ProfileAttribute>(controller, file_attr); attributes_[name] = std::make_unique<ProfileAttribute>(controller, file_attr, file_v2_attr); } else { iter->second->Reset(controller, file_attr); } Loading
libprocessgroup/task_profiles.h +7 −2 Original line number Diff line number Diff line Loading @@ -37,8 +37,12 @@ class IProfileAttribute { class ProfileAttribute : public IProfileAttribute { public: ProfileAttribute(const CgroupController& controller, const std::string& file_name) : controller_(controller), file_name_(file_name) {} // Cgroup attributes may have different names in the v1 and v2 hierarchies. If `file_v2_name` is // not empty, `file_name` is the name for the v1 hierarchy and `file_v2_name` is the name for // the v2 hierarchy. If `file_v2_name` is empty, `file_name` is used for both hierarchies. ProfileAttribute(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) {} ~ProfileAttribute() = default; const CgroupController* controller() const override { return &controller_; } Loading @@ -50,6 +54,7 @@ class ProfileAttribute : public IProfileAttribute { private: CgroupController controller_; std::string file_name_; std::string file_v2_name_; }; // Abstract profile element Loading