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">&lt;<a href="mailto:levin108@gmail.com" target="_blank">levin108@gmail.com</a>&gt;</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 &lt;<a href="mailto:levin108@gmail.com">levin108@gmail.com</a>&gt;<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-&gt;ji_qs.ji_un.ji_momt.ji_exitstat = ptask-&gt;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 &lt;pbs_config.h&gt;   /* the master config generated by configure */<br>
+<br>
+#include &lt;stdio.h&gt;<br>
+#include &lt;stdlib.h&gt;<br>
+#include &lt;unistd.h&gt;<br>
+#ifdef USEJOBCREATE<br>
+#ifndef JOBFAKE<br>
+#include &lt;job.h&gt;<br>
+#endif /* JOBFAKE */<br>
+#endif /* USEJOBCREATE */<br>
+#include &lt;errno.h&gt;<br>
+#include &lt;fcntl.h&gt;<br>
+#include &lt;grp.h&gt;<br>
+#include &lt;string.h&gt;<br>
+#include &lt;limits.h&gt;<br>
+#include &lt;assert.h&gt;<br>
+#include &lt;signal.h&gt;<br>
+#include &lt;ctype.h&gt;<br>
+#include &lt;time.h&gt;<br>
+#include &lt;sys/param.h&gt;<br>
+#include &lt;sys/types.h&gt;<br>
+#include &lt;sys/stat.h&gt;<br>
+#include &lt;sys/wait.h&gt;<br>
+#include &lt;sys/mman.h&gt;<br>
+#include &lt;sys/ioctl.h&gt;<br>
+#include &lt;pthread.h&gt;<br>
+<br>
+#include &quot;rpp.h&quot;<br>
+#include &quot;libpbs.h&quot;<br>
+#include &quot;portability.h&quot;<br>
+#include &quot;list_link.h&quot;<br>
+#include &quot;server_limits.h&quot;<br>
+#include &quot;attribute.h&quot;<br>
+#include &quot;resource.h&quot;<br>
+#include &quot;resmon.h&quot;<br>
+#include &quot;pbs_job.h&quot;<br>
+#include &quot;log.h&quot;<br>
+#include &quot;../lib/Liblog/pbs_log.h&quot;<br>
+#include &quot;../lib/Liblog/log_event.h&quot;<br>
+#include &quot;mom_mach.h&quot;<br>
+#include &quot;mom_func.h&quot;<br>
+#include &quot;pbs_error.h&quot;<br>
+#include &quot;svrfunc.h&quot;<br>
+#include &quot;dis.h&quot;<br>
+#include &quot;batch_request.h&quot;<br>
+#include &quot;mcom.h&quot;<br>
+#include &quot;resource.h&quot;<br>
+#include &quot;utils.h&quot;<br>
+#include &quot;mom_comm.h&quot;<br>
+#include &quot;mom_cgroup.h&quot;<br>
+#include &quot;server.h&quot;<br>
+#include &quot;svrfunc.h&quot;<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-&gt;ji_wattr[JOB_ATR_cgroup_enable].at_flags &amp; 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-&gt;rs_value.at_type != ATR_TYPE_SIZE)<br>
+    return PBSE_ATTRTYPE;<br>
+<br>
+  value = pres-&gt;rs_value.at_val.at_size.atsv_num;<br>
+  if (pres-&gt;rs_value.at_val.at_size.atsv_units == ATR_SV_WORDSZ) {<br>
+    if (value &gt; ULONG_MAX / sizeof(int))<br>
+      return PBSE_BADATVAL;<br>
+<br>
+    value *= sizeof(int);<br>
+  }<br>
+<br>
+  if (value &gt; (ULONG_MAX &gt;&gt; pres-&gt;rs_value.at_val.at_size.atsv_shift))<br>
+    return PBSE_BADATVAL;<br>
+<br>
+  *ret = (value &lt;&lt; pres-&gt;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-&gt;ji_wattr[JOB_ATR_resource].at_val.at_list);<br>
+<br>
+  while (pres) {<br>
+    int ret;<br>
+    unsigned long pmem;<br>
+<br>
+    if (pres-&gt;rs_defin != NULL)<br>
+      pname = pres-&gt;rs_defin-&gt;rs_name;<br>
+    else<br>
+      goto next;<br>
+<br>
+    if (strcmp(pname, &quot;pmem&quot;))<br>
+      goto next;<br>
+<br>
+    ret = mm_getsize(pres, &amp;pmem);<br>
+    if (ret != PBSE_NONE) {<br>
+      DBPRT((&quot;Memory restriction not set\n&quot;));<br>
+      return -1;<br>
+    }<br>
+<br>
+    return pmem;<br>
+next:<br>
+    pres = (resource *)GET_NEXT(pres-&gt;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-&gt;ji_numvnod / pjob-&gt;ji_numnodes;<br>
+  pmem *= ppn;<br>
+<br>
+  sprintf(log_buffer, &quot;job %s set memory limitation to %ld&quot;,<br>
+          pjob-&gt;ji_qs.ji_jobid, pmem);<br>
+  log_ext(-1, __func__, log_buffer, LOG_INFO);<br>
+<br>
+  if (pmem &gt; 0) {<br>
+    snprintf(cg_path, MAXPATHLEN, &quot;%s/%s/memory.limit_in_bytes&quot;,<br>
+             CGROUP_ROOT_PATH, pjob-&gt;ji_qs.ji_jobid);<br>
+    fd = open(cg_path, O_RDWR);<br>
+    if (fd &lt; 0) {<br>
+      sprintf(log_buffer, &quot;can not open %s:%m&quot;, cg_path);<br>
+      log_err(errno, __func__, log_buffer);<br>
+      return -1;<br>
+    }<br>
+<br>
+    snprintf(mem_limit, sizeof(mem_limit), &quot;%ldM&quot;, pmem);<br>
+    ret = write(fd, mem_limit, strlen(mem_limit));<br>
+    if (ret != strlen(mem_limit)) {<br>
+      sprintf(log_buffer, &quot;set memory.limit_in_bytes failed: %m&quot;);<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, &quot;%s/cpuset.cpus&quot;, CGROUP_ROOT_PATH);<br>
+  fd = open(cg_path, O_RDWR);<br>
+  if (fd &lt; 0) {<br>
+    sprintf(log_buffer, &quot;can not read cpuset info from root cgroup:%m&quot;);<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 &lt; nr_cpus; i++) {<br>
+    if (strlen(cpuset_array[i]) == 0 &amp;&amp; ppn == 1) {<br>
+      memcpy(cpuset_array[i], jobid, strlen(jobid) + 1);<br>
+      sprintf(buf, &quot;%d&quot;, 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, &quot;%d-%d&quot;, start, i);<br>
+        else<br>
+          sprintf(buf, &quot;%s,%d-%d&quot;, 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, &quot;%d-%d&quot;, start, i - 1);<br>
+        else<br>
+          sprintf(buf, &quot;%s,%d-%d&quot;, buf, start, i - 1);<br>
+      }<br>
+<br>
+      start = i + 1;<br>
+    }<br>
+  }<br>
+  sprintf(buf, &quot;%s\n&quot;, buf);<br>
+  nr_free_cpus -= ppn;<br>
+<br>
+  sprintf(log_buffer, &quot;available cpuset is %s&quot;, 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-&gt;ji_numvnod / pjob-&gt;ji_numnodes;<br>
+<br>
+  pthread_mutex_lock(&amp;cpuset_lock);<br>
+  if (ppn &gt; nr_free_cpus)<br>
+    ret = get_all_cpus(buf);<br>
+  else {<br>
+    memset(buf, 0, sizeof(buf));<br>
+    ret = get_aval_cpus(buf, pjob-&gt;ji_qs.ji_jobid, ppn);<br>
+  }<br>
+  pthread_mutex_unlock(&amp;cpuset_lock);<br>
+<br>
+  if (ret)<br>
+    return -1;<br>
+<br>
+  /* set cpuset to cpuset of root cgroup */<br>
+  snprintf(cg_path, MAXPATHLEN, &quot;%s/%s/cpuset.cpus&quot;,<br>
+           CGROUP_ROOT_PATH, pjob-&gt;ji_qs.ji_jobid);<br>
+  fd = open(cg_path, O_RDWR);<br>
+  if (fd &lt; 0) {<br>
+    sprintf(log_buffer, &quot;can not open %s:%m&quot;, 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, &quot;set cpuset.cpus failed: %m&quot;);<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, &quot;%s/cpuset.mems&quot;, CGROUP_ROOT_PATH);<br>
+  fd = open(cg_path, O_RDWR);<br>
+  if (fd &lt; 0) {<br>
+    sprintf(log_buffer, &quot;can not read numa node info from root cgroup:%m&quot;);<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, &quot;NUMA node info of root cgroup is: %s&quot;, 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, &quot;%s/%s/cpuset.mems&quot;,<br>
+           CGROUP_ROOT_PATH, pjob-&gt;ji_qs.ji_jobid);<br>
+  fd = open(cg_path, O_RDWR);<br>
+  if (fd &lt; 0) {<br>
+    sprintf(log_buffer, &quot;can not open %s:%m&quot;, 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, &quot;set cpuset.mems failed:%m&quot;);<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, &quot;creating cgroup for job %s&quot;, pjob-&gt;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, &quot;cgroup mount point &#39;%s&#39; not found&quot;, CGROUP_ROOT_PATH);<br>
+    log_err(errno, __func__, log_buffer);<br>
+<br>
+    return -1;<br>
+  }<br>
+<br>
+  snprintf(cg_path, MAXPATHLEN, &quot;%s/%s&quot;, CGROUP_ROOT_PATH,<br>
+           pjob-&gt;ji_qs.ji_jobid);<br>
+<br>
+  ret = mkdir(cg_path, 0755);<br>
+  if (ret) {<br>
+    sprintf(log_buffer, &quot;create cgroup for %s failed: %m&quot;,<br>
+            pjob-&gt;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, &quot;moving job %s to cgroup&quot;, pjob-&gt;ji_qs.ji_jobid);<br>
+  log_ext(-1, __func__, log_buffer, LOG_INFO);<br>
+<br>
+  snprintf(cg_path, MAXPATHLEN, &quot;%s/%s/tasks&quot;, CGROUP_ROOT_PATH,<br>
+           pjob-&gt;ji_qs.ji_jobid);<br>
+<br>
+  fd = open(cg_path, O_RDWR);<br>
+  if (fd &lt; 0) {<br>
+    sprintf(log_buffer, &quot;failed to open %s:%m&quot;, cg_path);<br>
+    log_err(errno, __func__, log_buffer);<br>
+<br>
+    return -1;<br>
+  }<br>
+<br>
+  snprintf(buf, sizeof(buf), &quot;%d\n&quot;, pid);<br>
+  ret = write(fd, buf, strlen(buf));<br>
+  if (ret != strlen(buf)) {<br>
+    sprintf(log_buffer, &quot;failed to move task to cgroup: %m&quot;);<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, &quot;removing cgroup for job %s&quot;, pjob-&gt;ji_qs.ji_jobid);<br>
+  log_ext(-1, __func__, log_buffer, LOG_INFO);<br>
+<br>
+  pthread_mutex_lock(&amp;cpuset_lock);<br>
+  for (i = 0; i &lt; nr_cpus; i++) {<br>
+    if (!strcmp(cpuset_array[i], pjob-&gt;ji_qs.ji_jobid)) {<br>
+      cpuset_array[i][0] = &#39;\0&#39;;<br>
+      nr_free_cpus++;<br>
+    }<br>
+  }<br>
+  pthread_mutex_unlock(&amp;cpuset_lock);<br>
+<br>
+  snprintf(cg_path, MAXPATHLEN, &quot;%s/%s/&quot;, CGROUP_ROOT_PATH,<br>
+           pjob-&gt;ji_qs.ji_jobid);<br>
+<br>
+  ret = rmdir(cg_path);<br>
+  if (ret) {<br>
+    sprintf(log_buffer, &quot;remove cgroup for job %s failed:%m&quot;,<br>
+           pjob-&gt;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 &quot;/dev/torque&quot;<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 &lt; 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, &quot;create cgroup for job %s&quot;, pjob-&gt;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-&gt;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>
         &quot;task set to running/saving task (start_process)&quot;);<br>
       }<br>
<br>
+    if (use_cgroup(pjob)) {<br>
+      move_task_to_cgroup(ptask-&gt;ti_qs.ti_sid, pjob);<br>
+    }<br>
+<br>
     task_save(ptask);<br>
<br>
     if (pjob-&gt;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>