libprocessgroup: Disable file descriptor caching temporarily

File descriptor caching breaks boot on Android Go and Svelte targets.
Disable it temporarily to fix the builds and investigate the root cause
further.

Bug: 123868658
Test: Android Go device boots after this change

Change-Id: Idd0209029cde8454ea99b9de030f7a317c2988d7
Signed-off-by: Suren Baghdasaryan <surenb@google.com>
This commit is contained in:
Suren Baghdasaryan 2019-02-05 16:44:22 -08:00
parent 5bccd33e0b
commit bee9f5718b
2 changed files with 34 additions and 0 deletions

View file

@ -132,6 +132,7 @@ bool SetCgroupAction::IsAppDependentPath(const std::string& path) {
SetCgroupAction::SetCgroupAction(const CgroupController* c, const std::string& p)
: controller_(c), path_(p) {
#ifdef CACHE_FILE_DESCRIPTORS
// cache file descriptor only if path is app independent
if (IsAppDependentPath(path_)) {
// file descriptor is not cached
@ -155,6 +156,7 @@ SetCgroupAction::SetCgroupAction(const CgroupController* c, const std::string& p
}
fd_ = std::move(fd);
#endif
}
bool SetCgroupAction::AddTidToCgroup(int tid, int fd) {
@ -176,6 +178,7 @@ bool SetCgroupAction::AddTidToCgroup(int tid, int fd) {
}
bool SetCgroupAction::ExecuteForProcess(uid_t uid, pid_t pid) const {
#ifdef CACHE_FILE_DESCRIPTORS
if (fd_ >= 0) {
// fd is cached, reuse it
if (!AddTidToCgroup(pid, fd_)) {
@ -203,9 +206,24 @@ bool SetCgroupAction::ExecuteForProcess(uid_t uid, pid_t pid) const {
}
return true;
#else
std::string procs_path = controller_->GetProcsFilePath(path_.c_str(), uid, pid);
unique_fd tmp_fd(TEMP_FAILURE_RETRY(open(procs_path.c_str(), O_WRONLY | O_CLOEXEC)));
if (tmp_fd < 0) {
// no permissions to access the file, ignore
return true;
}
if (!AddTidToCgroup(pid, tmp_fd)) {
PLOG(ERROR) << "Failed to add task into cgroup";
return false;
}
return true;
#endif
}
bool SetCgroupAction::ExecuteForTask(int tid) const {
#ifdef CACHE_FILE_DESCRIPTORS
if (fd_ >= 0) {
// fd is cached, reuse it
if (!AddTidToCgroup(tid, fd_)) {
@ -223,6 +241,20 @@ bool SetCgroupAction::ExecuteForTask(int tid) const {
// application-dependent path can't be used with tid
PLOG(ERROR) << "Application profile can't be applied to a thread";
return false;
#else
std::string tasks_path = controller_->GetTasksFilePath(path_.c_str());
unique_fd tmp_fd(TEMP_FAILURE_RETRY(open(tasks_path.c_str(), O_WRONLY | O_CLOEXEC)));
if (tmp_fd < 0) {
// no permissions to access the file, ignore
return true;
}
if (!AddTidToCgroup(tid, tmp_fd)) {
PLOG(ERROR) << "Failed to add task into cgroup";
return false;
}
return true;
#endif
}
bool TaskProfile::ExecuteForProcess(uid_t uid, pid_t pid) const {

View file

@ -117,7 +117,9 @@ class SetCgroupAction : public ProfileAction {
private:
const CgroupController* controller_;
std::string path_;
#ifdef CACHE_FILE_DESCRIPTORS
android::base::unique_fd fd_;
#endif
static bool IsAppDependentPath(const std::string& path);
static bool AddTidToCgroup(int tid, int fd);