libprocessgroup: optimize SetAttributeAction::ExecuteForProcess performance am: 1e81ee1363
Original change: https://googleplex-android-review.googlesource.com/c/platform/system/core/+/24271776 Change-Id: I9a9ec1f34199302ac89e2605c3839224cfbf62e4 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
commit
d3be6e0d67
3 changed files with 40 additions and 12 deletions
|
|
@ -126,6 +126,16 @@ void ProfileAttribute::Reset(const CgroupController& controller, const std::stri
|
||||||
file_v2_name_ = file_v2_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 {
|
bool ProfileAttribute::GetPathForTask(int tid, std::string* path) const {
|
||||||
std::string subgroup;
|
std::string subgroup;
|
||||||
if (!controller()->GetTaskGroup(tid, &subgroup)) {
|
if (!controller()->GetTaskGroup(tid, &subgroup)) {
|
||||||
|
|
@ -209,18 +219,7 @@ bool SetTimerSlackAction::ExecuteForTask(int) const {
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
bool SetAttributeAction::ExecuteForProcess(uid_t, pid_t pid) const {
|
bool SetAttributeAction::WriteValueToFile(const std::string& path) 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!WriteStringToFile(value_, path)) {
|
if (!WriteStringToFile(value_, path)) {
|
||||||
if (access(path.c_str(), F_OK) < 0) {
|
if (access(path.c_str(), F_OK) < 0) {
|
||||||
if (optional_) {
|
if (optional_) {
|
||||||
|
|
@ -240,6 +239,28 @@ bool SetAttributeAction::ExecuteForTask(int tid) const {
|
||||||
return true;
|
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 {
|
bool SetAttributeAction::ExecuteForUID(uid_t uid) const {
|
||||||
std::string path;
|
std::string path;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -36,6 +36,7 @@ class IProfileAttribute {
|
||||||
const std::string& file_v2_name) = 0;
|
const std::string& file_v2_name) = 0;
|
||||||
virtual const CgroupController* controller() const = 0;
|
virtual const CgroupController* controller() const = 0;
|
||||||
virtual const std::string& file_name() 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 GetPathForTask(int tid, std::string* path) const = 0;
|
||||||
virtual bool GetPathForUID(uid_t uid, std::string* path) const = 0;
|
virtual bool GetPathForUID(uid_t uid, std::string* path) const = 0;
|
||||||
};
|
};
|
||||||
|
|
@ -55,6 +56,7 @@ class ProfileAttribute : public IProfileAttribute {
|
||||||
void Reset(const CgroupController& controller, const std::string& file_name,
|
void Reset(const CgroupController& controller, const std::string& file_name,
|
||||||
const std::string& file_v2_name) override;
|
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 GetPathForTask(int tid, std::string* path) const override;
|
||||||
bool GetPathForUID(uid_t uid, std::string* path) const override;
|
bool GetPathForUID(uid_t uid, std::string* path) const override;
|
||||||
|
|
||||||
|
|
@ -133,6 +135,8 @@ class SetAttributeAction : public ProfileAction {
|
||||||
const IProfileAttribute* attribute_;
|
const IProfileAttribute* attribute_;
|
||||||
std::string value_;
|
std::string value_;
|
||||||
bool optional_;
|
bool optional_;
|
||||||
|
|
||||||
|
bool WriteValueToFile(const std::string& path) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Set cgroup profile element
|
// Set cgroup profile element
|
||||||
|
|
|
||||||
|
|
@ -111,6 +111,9 @@ class ProfileAttributeMock : public IProfileAttribute {
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
const std::string& file_name() const override { return file_name_; }
|
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 {
|
bool GetPathForTask(int tid, std::string* path) const override {
|
||||||
#ifdef __ANDROID__
|
#ifdef __ANDROID__
|
||||||
CHECK(CgroupGetControllerPath(CGROUPV2_CONTROLLER_NAME, path));
|
CHECK(CgroupGetControllerPath(CGROUPV2_CONTROLLER_NAME, path));
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue