On 02/20/2013 06:08 PM, John Fastabend wrote: > Add routine to scan rules.conf file and move matching running tasks > in /proc/pid/* into configured control groups. Then at init time > we can move running tasks into the correct control group. > > Expose this routine via libcg so other applications can use it > to classify existing applications after creating control groups. > > CC: Jan Safranek <jsafr...@redhat.com> > Signed-off-by: John Fastabend <john.r.fastab...@intel.com>
Signed-off-by: Jan Safranek <jsafr...@redhat.com> Merged and pushed, thanks a lot for the patch! Jan > --- > include/libcgroup/tasks.h | 11 +++++++++++ > src/api.c | 46 > +++++++++++++++++++++++++++++++++++++++++++++ > src/daemon/cgrulesengd.c | 5 +++++ > src/libcgroup.map | 1 + > 4 files changed, 63 insertions(+) > > diff --git a/include/libcgroup/tasks.h b/include/libcgroup/tasks.h > index 0f79220..aad438a 100644 > --- a/include/libcgroup/tasks.h > +++ b/include/libcgroup/tasks.h > @@ -121,6 +121,17 @@ void cgroup_print_rules_config(FILE *fp); > */ > > /** > + * Changes the cgroup of all running PIDs based on the rules in the config > + * file. If a rules exists for a PID, then the PID is placed in the correct > + * group. > + * > + * This function may be called after creating new control groups to move > + * running PIDs into the newly created control groups. > + * @return 0 on success, < 0 on error > + */ > +int cgroup_change_all_cgroups(void); > + > +/** > * Changes the cgroup of a program based on the rules in the config file. > * If a rule exists for the given UID, GID or PROCESS NAME, then the given > * PID is placed into the correct group. By default, this function parses > diff --git a/src/api.c b/src/api.c > index 11cd1b4..2851efd 100644 > --- a/src/api.c > +++ b/src/api.c > @@ -3056,6 +3056,52 @@ int cgroup_change_cgroup_path(const char *dest, pid_t > pid, > } > > /** > + * Changes the cgroup of all running PIDs based on the rules in the config > + * file. If a rules exists for a PID, then the PID is placed in the correct > + * group. > + * > + * This function may be called after creating new control groups to move > + * running PIDs into the newly created control groups. > + * @return 0 on success, < 0 on error > + */ > +int cgroup_change_all_cgroups(void) > +{ > + DIR *dir; > + struct dirent *pid_dir = NULL; > + char *path = "/proc/"; > + > + dir = opendir(path); > + if (!dir) > + return -ECGOTHER; > + > + while ((pid_dir = readdir(dir)) != NULL) { > + int err, pid; > + uid_t euid; > + gid_t egid; > + char *procname = NULL; > + > + err = sscanf(pid_dir->d_name, "%i", &pid); > + if (err < 1) > + continue; > + > + err = cgroup_get_uid_gid_from_procfs(pid, &euid, &egid); > + if (err) > + continue; > + > + err = cgroup_get_procname_from_procfs(pid, &procname); > + if (err) > + continue; > + > + err = cgroup_change_cgroup_flags(euid, egid, procname, pid, 0); > + if (err) > + cgroup_dbg("cgroup change pid %i failed\n", pid); > + } > + > + closedir(dir); > + return 0; > +} > + > +/** > * Print the cached rules table. This function should be called only after > * first calling cgroup_parse_config(), but it will work with an empty rule > * list. > diff --git a/src/daemon/cgrulesengd.c b/src/daemon/cgrulesengd.c > index f12db45..42feacc 100644 > --- a/src/daemon/cgrulesengd.c > +++ b/src/daemon/cgrulesengd.c > @@ -1171,6 +1171,11 @@ int main(int argc, char *argv[]) > if (logfile && loglevel >= LOG_INFO) > cgroup_print_rules_config(logfile); > > + /* Scan for running applications with rules */ > + ret = cgroup_change_all_cgroups(); > + if (ret) > + flog(LOG_WARNING, "Failed to initialize running tasks."); > + > flog(LOG_NOTICE, "Started the CGroup Rules Engine Daemon."); > > /* We loop endlesly in this function, unless we encounter an error. */ > diff --git a/src/libcgroup.map b/src/libcgroup.map > index b550a58..7dce2df 100644 > --- a/src/libcgroup.map > +++ b/src/libcgroup.map > @@ -110,4 +110,5 @@ CGROUP_0.39 { > cgroup_reload_cached_templates; > cgroup_init_templates_cache; > cgroup_config_create_template_group; > + cgroup_change_all_cgroups; > } CGROUP_0.38; > > > ------------------------------------------------------------------------------ > Everyone hates slow websites. So do we. > Make your web apps faster with AppDynamics > Download AppDynamics Lite for free today: > http://p.sf.net/sfu/appdyn_d2d_feb > _______________________________________________ > Libcg-devel mailing list > Libcg-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/libcg-devel > ------------------------------------------------------------------------------ Everyone hates slow websites. So do we. Make your web apps faster with AppDynamics Download AppDynamics Lite for free today: http://p.sf.net/sfu/appdyn_d2d_feb _______________________________________________ Libcg-devel mailing list Libcg-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/libcg-devel