return true;
}
+static bool readFromCgroup(
+ const std::string& cgroup_path, std::string& value, const std::string& what) {
+ char buf[255];
+ ssize_t size;
+ size = util::readFromFile(cgroup_path.c_str(), buf, 255);
+ if (!size) {
+ LOG_W("Cannot read %s", what.c_str());
+ return false;
+ }
+ buf[size-1] = '\0';
+ value = buf;
+ LOG_D("Getting '%s' from '%s'", value.c_str(), cgroup_path.c_str());
+ return true;
+}
+
static bool addPidToTaskList(const std::string& cgroup_path, pid_t pid) {
std::string pid_str = std::to_string(pid);
std::string tasks_path = cgroup_path + "/tasks";
std::string cpu_cgroup_path = nsjconf->cgroup_cpu_mount + '/' + nsjconf->cgroup_cpu_parent +
"/NSJAIL." + std::to_string(pid);
RETURN_ON_FAILURE(createCgroup(cpu_cgroup_path, pid));
-
+#ifndef TIZEN
std::string cpu_ms_per_sec_str = std::to_string(nsjconf->cgroup_cpu_ms_per_sec * 1000U);
RETURN_ON_FAILURE(
writeToCgroup(cpu_cgroup_path + "/cpu.cfs_quota_us", cpu_ms_per_sec_str, "cpu quota"));
RETURN_ON_FAILURE(
writeToCgroup(cpu_cgroup_path + "/cpu.cfs_period_us", "1000000", "cpu period"));
+#else
+ double ratio = (double)nsjconf->cgroup_cpu_ms_per_sec / (double)1000;
+ std::string cpu_shares_str;
+ RETURN_ON_FAILURE(
+ readFromCgroup(nsjconf->cgroup_cpu_mount + "/" + nsjconf->cgroup_cpu_parent + "/cpu.shares", cpu_shares_str, "cpu shares"));
+
+ double cpu_shares = std::stod(cpu_shares_str);
+ int adjusted_cpu_shares = cpu_shares * ratio;
+ LOG_D("cpu_shares = %lf, ratio = %lf, final cpu_shares = %d",cpu_shares, ratio, adjusted_cpu_shares);
+
+ RETURN_ON_FAILURE(
+ writeToCgroup(cpu_cgroup_path + "/cpu.shares", std::to_string(adjusted_cpu_shares), "cpu quota with cpu shares"));
+#endif
return addPidToTaskList(cpu_cgroup_path, pid);
}