Levin,<div><br></div><div>Could you create a bugzilla issue and then attach the complete patch to the bugzilla ticket? This will ensure that your work is not lost and make it easier to track the issue.</div><div><br></div>
<div>Cheers,</div><div><br></div><div>David<br><br><div class="gmail_quote">On Tue, Nov 20, 2012 at 2:02 AM, levin li <span dir="ltr"><<a href="mailto:levin108@gmail.com" target="_blank">levin108@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
Signed-off-by: levin li <<a href="mailto:levin108@gmail.com">levin108@gmail.com</a>><br>
---<br>
src/resmom/catch_child.c | 4 +<br>
src/resmom/mom_cgroup.c | 445 ++++++++++++++++++++++++++++++++++++++++++++++<br>
src/resmom/mom_cgroup.h | 14 ++<br>
src/resmom/mom_comm.c | 10 +-<br>
src/resmom/mom_main.c | 21 ++-<br>
src/resmom/start_exec.c | 19 ++-<br>
6 files changed, 509 insertions(+), 4 deletions(-)<br>
create mode 100644 src/resmom/mom_cgroup.c<br>
create mode 100644 src/resmom/mom_cgroup.h<br>
<br>
diff --git a/src/resmom/catch_child.c b/src/resmom/catch_child.c<br>
index 8e3527f..72d79a8 100644<br>
--- a/src/resmom/catch_child.c<br>
+++ b/src/resmom/catch_child.c<br>
@@ -438,6 +438,10 @@ void scan_for_exiting(void)<br>
pjob->ji_qs.ji_un.ji_momt.ji_exitstat = ptask->ti_qs.ti_exitstat;<br>
}<br>
<br>
+ if (use_cgroup(pjob)) {<br>
+ remove_job_cgroup(pjob);<br>
+ }<br>
+<br>
log_event(<br>
PBSEVENT_JOB,<br>
PBS_EVENTCLASS_JOB,<br>
diff --git a/src/resmom/mom_cgroup.c b/src/resmom/mom_cgroup.c<br>
new file mode 100644<br>
index 0000000..a9f388c<br>
--- /dev/null<br>
+++ b/src/resmom/mom_cgroup.c<br>
@@ -0,0 +1,445 @@<br>
+#include <pbs_config.h> /* the master config generated by configure */<br>
+<br>
+#include <stdio.h><br>
+#include <stdlib.h><br>
+#include <unistd.h><br>
+#ifdef USEJOBCREATE<br>
+#ifndef JOBFAKE<br>
+#include <job.h><br>
+#endif /* JOBFAKE */<br>
+#endif /* USEJOBCREATE */<br>
+#include <errno.h><br>
+#include <fcntl.h><br>
+#include <grp.h><br>
+#include <string.h><br>
+#include <limits.h><br>
+#include <assert.h><br>
+#include <signal.h><br>
+#include <ctype.h><br>
+#include <time.h><br>
+#include <sys/param.h><br>
+#include <sys/types.h><br>
+#include <sys/stat.h><br>
+#include <sys/wait.h><br>
+#include <sys/mman.h><br>
+#include <sys/ioctl.h><br>
+#include <pthread.h><br>
+<br>
+#include "rpp.h"<br>
+#include "libpbs.h"<br>
+#include "portability.h"<br>
+#include "list_link.h"<br>
+#include "server_limits.h"<br>
+#include "attribute.h"<br>
+#include "resource.h"<br>
+#include "resmon.h"<br>
+#include "pbs_job.h"<br>
+#include "log.h"<br>
+#include "../lib/Liblog/pbs_log.h"<br>
+#include "../lib/Liblog/log_event.h"<br>
+#include "mom_mach.h"<br>
+#include "mom_func.h"<br>
+#include "pbs_error.h"<br>
+#include "svrfunc.h"<br>
+#include "dis.h"<br>
+#include "batch_request.h"<br>
+#include "mcom.h"<br>
+#include "resource.h"<br>
+#include "utils.h"<br>
+#include "mom_comm.h"<br>
+#include "mom_cgroup.h"<br>
+#include "server.h"<br>
+#include "svrfunc.h"<br>
+<br>
+char **cpuset_array = NULL;<br>
+int nr_cpus;<br>
+int nr_free_cpus;<br>
+pthread_mutex_t cpuset_lock = PTHREAD_MUTEX_INITIALIZER;<br>
+<br>
+int use_cgroup(job *pjob)<br>
+{<br>
+ if (pjob->ji_wattr[JOB_ATR_cgroup_enable].at_flags & ATR_VFLAG_SET)<br>
+ return TRUE;<br>
+ return FALSE;<br>
+}<br>
+<br>
+static int mm_getsize(resource *pres, unsigned long *ret) {<br>
+ unsigned long value;<br>
+ if (pres->rs_value.at_type != ATR_TYPE_SIZE)<br>
+ return PBSE_ATTRTYPE;<br>
+<br>
+ value = pres->rs_value.at_val.at_size.atsv_num;<br>
+ if (pres->rs_value.at_val.at_size.atsv_units == ATR_SV_WORDSZ) {<br>
+ if (value > ULONG_MAX / sizeof(int))<br>
+ return PBSE_BADATVAL;<br>
+<br>
+ value *= sizeof(int);<br>
+ }<br>
+<br>
+ if (value > (ULONG_MAX >> pres->rs_value.at_val.at_size.atsv_shift))<br>
+ return PBSE_BADATVAL;<br>
+<br>
+ *ret = (value << pres->rs_value.at_val.at_size.atsv_shift);<br>
+<br>
+ return PBSE_NONE;<br>
+} /* END mm_getsize() */<br>
+<br>
+static int get_job_pmem(job *pjob)<br>
+{<br>
+ resource *pres;<br>
+ char *pname = NULL;<br>
+<br>
+ pres = (resource *)GET_NEXT(pjob->ji_wattr[JOB_ATR_resource].at_val.at_list);<br>
+<br>
+ while (pres) {<br>
+ int ret;<br>
+ unsigned long pmem;<br>
+<br>
+ if (pres->rs_defin != NULL)<br>
+ pname = pres->rs_defin->rs_name;<br>
+ else<br>
+ goto next;<br>
+<br>
+ if (strcmp(pname, "pmem"))<br>
+ goto next;<br>
+<br>
+ ret = mm_getsize(pres, &pmem);<br>
+ if (ret != PBSE_NONE) {<br>
+ DBPRT(("Memory restriction not set\n"));<br>
+ return -1;<br>
+ }<br>
+<br>
+ return pmem;<br>
+next:<br>
+ pres = (resource *)GET_NEXT(pres->rs_link);<br>
+ }<br>
+<br>
+ return -1;<br>
+}<br>
+<br>
+static int set_job_mem_limit(job *pjob)<br>
+{<br>
+ unsigned long pmem;<br>
+ unsigned long ppn;<br>
+ char cg_path[MAXPATHLEN], mem_limit[32];<br>
+ int fd, ret;<br>
+<br>
+ pmem = get_job_pmem(pjob);<br>
+<br>
+ ppn = pjob->ji_numvnod / pjob->ji_numnodes;<br>
+ pmem *= ppn;<br>
+<br>
+ sprintf(log_buffer, "job %s set memory limitation to %ld",<br>
+ pjob->ji_qs.ji_jobid, pmem);<br>
+ log_ext(-1, __func__, log_buffer, LOG_INFO);<br>
+<br>
+ if (pmem > 0) {<br>
+ snprintf(cg_path, MAXPATHLEN, "%s/%s/memory.limit_in_bytes",<br>
+ CGROUP_ROOT_PATH, pjob->ji_qs.ji_jobid);<br>
+ fd = open(cg_path, O_RDWR);<br>
+ if (fd < 0) {<br>
+ sprintf(log_buffer, "can not open %s:%m", cg_path);<br>
+ log_err(errno, __func__, log_buffer);<br>
+ return -1;<br>
+ }<br>
+<br>
+ snprintf(mem_limit, sizeof(mem_limit), "%ldM", pmem);<br>
+ ret = write(fd, mem_limit, strlen(mem_limit));<br>
+ if (ret != strlen(mem_limit)) {<br>
+ sprintf(log_buffer, "set memory.limit_in_bytes failed: %m");<br>
+ log_err(errno, __func__, log_buffer);<br>
+ close(fd);<br>
+ return -1;<br>
+ }<br>
+ close(fd);<br>
+ }<br>
+<br>
+ return 0;<br>
+}<br>
+<br>
+static int get_all_cpus(char *buf)<br>
+{<br>
+ char cg_path[MAXPATHLEN];<br>
+ int fd, ret, n;<br>
+<br>
+ /* read cpuset info from root cgroup */<br>
+ snprintf(cg_path, MAXPATHLEN, "%s/cpuset.cpus", CGROUP_ROOT_PATH);<br>
+ fd = open(cg_path, O_RDWR);<br>
+ if (fd < 0) {<br>
+ sprintf(log_buffer, "can not read cpuset info from root cgroup:%m");<br>
+ log_err(errno, __func__, log_buffer);<br>
+<br>
+ return -1;<br>
+ }<br>
+<br>
+ n = 0;<br>
+ memset(buf, 0, sizeof(buf));<br>
+ while (1) {<br>
+ ret = read(fd, buf + n, sizeof(buf) - n);<br>
+ n += ret;<br>
+ if (!ret)<br>
+ break;<br>
+ }<br>
+<br>
+ return 0;<br>
+}<br>
+<br>
+static int get_aval_cpus(char *buf, const char *jobid, int ppn)<br>
+{<br>
+ int i, start, end, count = 0;<br>
+<br>
+ if (!nr_free_cpus)<br>
+ return -1;<br>
+<br>
+ start = 0, end = 0;<br>
+ for (i = 0; i < nr_cpus; i++) {<br>
+ if (strlen(cpuset_array[i]) == 0 && ppn == 1) {<br>
+ memcpy(cpuset_array[i], jobid, strlen(jobid) + 1);<br>
+ sprintf(buf, "%d", i);<br>
+ break;<br>
+ }<br>
+<br>
+ if (strlen(cpuset_array[i]) == 0) {<br>
+ count ++;<br>
+ memcpy(cpuset_array[i], jobid, strlen(jobid) + 1);<br>
+ if (count == ppn) {<br>
+ if (strlen(buf) == 0)<br>
+ sprintf(buf, "%d-%d", start, i);<br>
+ else<br>
+ sprintf(buf, "%s,%d-%d", buf, start, i);<br>
+ break;<br>
+ }<br>
+ } else {<br>
+<br>
+ if (count == 0) {<br>
+ start = i + 1;<br>
+ continue;<br>
+ }<br>
+<br>
+ if (!strcmp(cpuset_array[i - 1], jobid)) {<br>
+ if (strlen(buf) == 0)<br>
+ sprintf(buf, "%d-%d", start, i - 1);<br>
+ else<br>
+ sprintf(buf, "%s,%d-%d", buf, start, i - 1);<br>
+ }<br>
+<br>
+ start = i + 1;<br>
+ }<br>
+ }<br>
+ sprintf(buf, "%s\n", buf);<br>
+ nr_free_cpus -= ppn;<br>
+<br>
+ sprintf(log_buffer, "available cpuset is %s", buf);<br>
+ log_ext(-1, __func__, log_buffer, LOG_INFO);<br>
+<br>
+ return 0;<br>
+}<br>
+<br>
+static int set_job_cpu_limit(job *pjob)<br>
+{<br>
+ char cg_path[MAXPATHLEN];<br>
+ char buf[BUFSIZ];<br>
+ int fd, ret, n;<br>
+ int ppn;<br>
+<br>
+ ppn = pjob->ji_numvnod / pjob->ji_numnodes;<br>
+<br>
+ pthread_mutex_lock(&cpuset_lock);<br>
+ if (ppn > nr_free_cpus)<br>
+ ret = get_all_cpus(buf);<br>
+ else {<br>
+ memset(buf, 0, sizeof(buf));<br>
+ ret = get_aval_cpus(buf, pjob->ji_qs.ji_jobid, ppn);<br>
+ }<br>
+ pthread_mutex_unlock(&cpuset_lock);<br>
+<br>
+ if (ret)<br>
+ return -1;<br>
+<br>
+ /* set cpuset to cpuset of root cgroup */<br>
+ snprintf(cg_path, MAXPATHLEN, "%s/%s/cpuset.cpus",<br>
+ CGROUP_ROOT_PATH, pjob->ji_qs.ji_jobid);<br>
+ fd = open(cg_path, O_RDWR);<br>
+ if (fd < 0) {<br>
+ sprintf(log_buffer, "can not open %s:%m", cg_path);<br>
+ log_err(errno, __func__, log_buffer);<br>
+<br>
+ return -1;<br>
+ }<br>
+<br>
+ ret = write(fd, buf, n);<br>
+ if (ret != n) {<br>
+ sprintf(log_buffer, "set cpuset.cpus failed: %m");<br>
+ log_err(errno, __func__, log_buffer);<br>
+<br>
+ close(fd);<br>
+ return -1;<br>
+ }<br>
+<br>
+ close(fd);<br>
+<br>
+ return 0;<br>
+}<br>
+<br>
+static int set_job_numa_node_limit(job *pjob)<br>
+{<br>
+ char cg_path[MAXPATHLEN];<br>
+ char buf[BUFSIZ];<br>
+ int fd, ret, n;<br>
+<br>
+ /* read NUMA node info from root cgroup */<br>
+ snprintf(cg_path, MAXPATHLEN, "%s/cpuset.mems", CGROUP_ROOT_PATH);<br>
+ fd = open(cg_path, O_RDWR);<br>
+ if (fd < 0) {<br>
+ sprintf(log_buffer, "can not read numa node info from root cgroup:%m");<br>
+ log_err(errno, __func__, log_buffer);<br>
+<br>
+ return -1;<br>
+ }<br>
+<br>
+ n = 0;<br>
+ memset(buf, 0, sizeof(buf));<br>
+ while (1) {<br>
+ ret = read(fd, buf + n, sizeof(buf) - n);<br>
+ n += ret;<br>
+ if (!ret)<br>
+ break;<br>
+ }<br>
+<br>
+ close(fd);<br>
+<br>
+ sprintf(log_buffer, "NUMA node info of root cgroup is: %s", buf);<br>
+ log_ext(-1, __func__, log_buffer, LOG_INFO);<br>
+<br>
+ /* set this cgroup to use memory from all NUMA nodes */<br>
+ snprintf(cg_path, MAXPATHLEN, "%s/%s/cpuset.mems",<br>
+ CGROUP_ROOT_PATH, pjob->ji_qs.ji_jobid);<br>
+ fd = open(cg_path, O_RDWR);<br>
+ if (fd < 0) {<br>
+ sprintf(log_buffer, "can not open %s:%m", cg_path);<br>
+ log_err(errno, __func__, log_buffer);<br>
+<br>
+ return -1;<br>
+ }<br>
+<br>
+ ret = write(fd, buf, n);<br>
+ if (ret != n) {<br>
+ sprintf(log_buffer, "set cpuset.mems failed:%m");<br>
+ log_err(errno, __func__, log_buffer);<br>
+<br>
+ close(fd);<br>
+ return -1;<br>
+ }<br>
+<br>
+ close(fd);<br>
+<br>
+ return 0;<br>
+}<br>
+<br>
+int create_job_cgroup(job *pjob)<br>
+{<br>
+ char cg_path[MAXPATHLEN];<br>
+ int ret;<br>
+<br>
+ sprintf(log_buffer, "creating cgroup for job %s", pjob->ji_qs.ji_jobid);<br>
+ log_ext(-1, __func__, log_buffer, LOG_INFO);<br>
+<br>
+ ret = access(CGROUP_ROOT_PATH, R_OK | W_OK);<br>
+ if (ret) {<br>
+ sprintf(log_buffer, "cgroup mount point '%s' not found", CGROUP_ROOT_PATH);<br>
+ log_err(errno, __func__, log_buffer);<br>
+<br>
+ return -1;<br>
+ }<br>
+<br>
+ snprintf(cg_path, MAXPATHLEN, "%s/%s", CGROUP_ROOT_PATH,<br>
+ pjob->ji_qs.ji_jobid);<br>
+<br>
+ ret = mkdir(cg_path, 0755);<br>
+ if (ret) {<br>
+ sprintf(log_buffer, "create cgroup for %s failed: %m",<br>
+ pjob->ji_qs.ji_jobid);<br>
+ log_err(errno, __func__, log_buffer);<br>
+<br>
+ return -1;<br>
+ }<br>
+<br>
+ ret = set_job_cpu_limit(pjob);<br>
+ if (ret)<br>
+ return -1;<br>
+<br>
+ ret = set_job_numa_node_limit(pjob);<br>
+ if (ret)<br>
+ return -1;<br>
+<br>
+ ret = set_job_mem_limit(pjob);<br>
+ if (ret)<br>
+ return -1;<br>
+<br>
+ return 0;<br>
+}<br>
+<br>
+int move_task_to_cgroup(pid_t pid, job *pjob)<br>
+{<br>
+ char cg_path[MAXPATHLEN], buf[BUFSIZ];<br>
+ int fd, ret;<br>
+<br>
+ sprintf(log_buffer, "moving job %s to cgroup", pjob->ji_qs.ji_jobid);<br>
+ log_ext(-1, __func__, log_buffer, LOG_INFO);<br>
+<br>
+ snprintf(cg_path, MAXPATHLEN, "%s/%s/tasks", CGROUP_ROOT_PATH,<br>
+ pjob->ji_qs.ji_jobid);<br>
+<br>
+ fd = open(cg_path, O_RDWR);<br>
+ if (fd < 0) {<br>
+ sprintf(log_buffer, "failed to open %s:%m", cg_path);<br>
+ log_err(errno, __func__, log_buffer);<br>
+<br>
+ return -1;<br>
+ }<br>
+<br>
+ snprintf(buf, sizeof(buf), "%d\n", pid);<br>
+ ret = write(fd, buf, strlen(buf));<br>
+ if (ret != strlen(buf)) {<br>
+ sprintf(log_buffer, "failed to move task to cgroup: %m");<br>
+ log_err(errno, __func__, log_buffer);<br>
+<br>
+ return -1;<br>
+ }<br>
+<br>
+ close(fd);<br>
+<br>
+ return 0;<br>
+}<br>
+<br>
+int remove_job_cgroup(job *pjob)<br>
+{<br>
+ char cg_path[MAXPATHLEN];<br>
+ int ret, i;<br>
+<br>
+ sprintf(log_buffer, "removing cgroup for job %s", pjob->ji_qs.ji_jobid);<br>
+ log_ext(-1, __func__, log_buffer, LOG_INFO);<br>
+<br>
+ pthread_mutex_lock(&cpuset_lock);<br>
+ for (i = 0; i < nr_cpus; i++) {<br>
+ if (!strcmp(cpuset_array[i], pjob->ji_qs.ji_jobid)) {<br>
+ cpuset_array[i][0] = '\0';<br>
+ nr_free_cpus++;<br>
+ }<br>
+ }<br>
+ pthread_mutex_unlock(&cpuset_lock);<br>
+<br>
+ snprintf(cg_path, MAXPATHLEN, "%s/%s/", CGROUP_ROOT_PATH,<br>
+ pjob->ji_qs.ji_jobid);<br>
+<br>
+ ret = rmdir(cg_path);<br>
+ if (ret) {<br>
+ sprintf(log_buffer, "remove cgroup for job %s failed:%m",<br>
+ pjob->ji_qs.ji_jobid);<br>
+ log_err(errno, __func__, log_buffer);<br>
+<br>
+ return -1;<br>
+ }<br>
+<br>
+ return 0;<br>
+}<br>
diff --git a/src/resmom/mom_cgroup.h b/src/resmom/mom_cgroup.h<br>
new file mode 100644<br>
index 0000000..4e7a006<br>
--- /dev/null<br>
+++ b/src/resmom/mom_cgroup.h<br>
@@ -0,0 +1,14 @@<br>
+#ifndef _MOM_CGROUP_H_<br>
+#define _MOM_CGROUP_H_<br>
+<br>
+#define CGROUP_ROOT_PATH "/dev/torque"<br>
+<br>
+int create_job_cgroup(job *pjob);<br>
+<br>
+int move_task_to_cgroup(pid_t pid, job *pjob);<br>
+<br>
+int remove_job_cgroup(job *pjob);<br>
+<br>
+int use_cgroup(job *pjob);<br>
+<br>
+#endif<br>
diff --git a/src/resmom/mom_comm.c b/src/resmom/mom_comm.c<br>
index 0a34d04..cc54c0e 100644<br>
--- a/src/resmom/mom_comm.c<br>
+++ b/src/resmom/mom_comm.c<br>
@@ -2387,7 +2387,11 @@ int im_join_job_as_sister(<br>
<br>
#endif /* ndef NUMA_SUPPORT */<br>
#endif /* (PENABLE_LINUX26_CPUSETS) */<br>
-<br>
+<br>
+ if (use_cgroup(pjob) == TRUE) {<br>
+ create_job_cgroup(pjob);<br>
+ }<br>
+<br>
ret = run_prologue_scripts(pjob);<br>
if (ret != PBSE_NONE)<br>
{<br>
@@ -2574,6 +2578,10 @@ void im_kill_job_as_sister(<br>
{<br>
momport = pbs_rm_port;<br>
}<br>
+<br>
+ if (use_cgroup(pjob)) {<br>
+ remove_job_cgroup(pjob);<br>
+ }<br>
<br>
job_save(pjob, SAVEJOB_QUICK, momport);<br>
<br>
diff --git a/src/resmom/mom_main.c b/src/resmom/mom_main.c<br>
index c620ae7..4d25284 100644<br>
--- a/src/resmom/mom_main.c<br>
+++ b/src/resmom/mom_main.c<br>
@@ -8708,6 +8708,24 @@ int setup_nodeboards()<br>
#endif /* ifdef NUMA_SUPPORT */<br>
<br>
<br>
+int setup_cpuset_array()<br>
+{<br>
+ /* defined in mom_cgroup.c */<br>
+ extern char **cpuset_array;<br>
+ extern int nr_cpus;<br>
+ extern int nr_free_cpus;<br>
+ int i;<br>
+<br>
+ nr_free_cpus = nr_cpus = sysconf(_SC_NPROCESSORS_ONLN);<br>
+<br>
+ cpuset_array = malloc(nr_cpus * sizeof(char *));<br>
+ for (i = 0; i < nr_cpus; i++) {<br>
+ cpuset_array[i] = malloc(PBS_MAXSVRJOBID + 1);<br>
+ memset(cpuset_array[i], 0, PBS_MAXSVRJOBID + 1);<br>
+ }<br>
+<br>
+ return 0;<br>
+}<br>
<br>
<br>
/*<br>
@@ -8724,7 +8742,6 @@ int main(<br>
int rc;<br>
int tmpFD;<br>
<br>
- tmpFD = sysconf(_SC_OPEN_MAX);<br>
<br>
/* close any inherited extra files, leaving stdin, stdout, and stderr open */<br>
<br>
@@ -8763,6 +8780,8 @@ int main(<br>
<br>
#endif /* NVIDIA_GPUS */<br>
<br>
+ setup_cpuset_array();<br>
+<br>
main_loop();<br>
<br>
if (mom_run_state == MOM_RUN_STATE_KILLALL)<br>
diff --git a/src/resmom/start_exec.c b/src/resmom/start_exec.c<br>
index 4c16414..85c99b8 100644<br>
--- a/src/resmom/start_exec.c<br>
+++ b/src/resmom/start_exec.c<br>
@@ -2294,8 +2294,20 @@ int TMomFinalizeJob2(<br>
<br>
/*NOTREACHED*/<br>
}<br>
-<br>
+<br>
/* parent */<br>
+<br>
+ log_record(PBSEVENT_ERROR, PBS_EVENTCLASS_JOB, __func__, log_buffer);<br>
+<br>
+ if (use_cgroup(pjob) == TRUE) {<br>
+ sprintf(log_buffer, "create cgroup for job %s", pjob->ji_qs.ji_jobid);<br>
+ log_ext(-1, __func__, log_buffer, LOG_DEBUG);<br>
+<br>
+ if (create_job_cgroup(pjob) == 0) {<br>
+ move_task_to_cgroup(cpid, pjob);<br>
+ }<br>
+<br>
+ }<br>
<br>
close(TJE->upfds);<br>
<br>
@@ -3971,7 +3983,6 @@ int TMomFinalizeChild(<br>
}<br>
move_to_job_cpuset(getpid(), pjob);<br>
}<br>
-<br>
#endif /* (PENABLE_LINUX26_CPUSETS) */<br>
<br>
if (site_job_setup(pjob) != 0)<br>
@@ -4736,6 +4747,10 @@ int start_process(<br>
"task set to running/saving task (start_process)");<br>
}<br>
<br>
+ if (use_cgroup(pjob)) {<br>
+ move_task_to_cgroup(ptask->ti_qs.ti_sid, pjob);<br>
+ }<br>
+<br>
task_save(ptask);<br>
<br>
if (pjob->ji_qs.ji_substate != JOB_SUBSTATE_RUNNING)<br>
<span class="HOEnZb"><font color="#888888">--<br>
1.7.6.1<br>
<br>
_______________________________________________<br>
torqueusers mailing list<br>
<a href="mailto:torqueusers@supercluster.org">torqueusers@supercluster.org</a><br>
<a href="http://www.supercluster.org/mailman/listinfo/torqueusers" target="_blank">http://www.supercluster.org/mailman/listinfo/torqueusers</a><br>
</font></span></blockquote></div><br><br clear="all"><div><br></div>-- <br><div>David Beer | Senior Software Engineer</div><div>Adaptive Computing</div><br>
</div>