From ced0cdca7fb1c82eaeee4aa475bc903a187704be Mon Sep 17 00:00:00 2001
From: Moe Jette <jette1@llnl.gov>
Date: Thu, 9 Oct 2008 23:45:05 +0000
Subject: [PATCH] Process TaskPluginParam to set default task binding within
 srun

---
 src/common/proc_args.c                    |  9 ++-
 src/plugins/task/affinity/task_affinity.c |  2 +
 src/salloc/opt.c                          |  4 +-
 src/sbatch/opt.c                          |  4 +-
 src/srun/opt.c                            | 77 ++++++++++++++++++++---
 5 files changed, 80 insertions(+), 16 deletions(-)

diff --git a/src/common/proc_args.c b/src/common/proc_args.c
index cede1aed102..e0af31276b3 100644
--- a/src/common/proc_args.c
+++ b/src/common/proc_args.c
@@ -408,10 +408,12 @@ bool verify_socket_core_thread_count(const char *arg,
 
  	for (j=0;j<3;j++) {	
 		for (i=0;i<47;i++) {
-			if (*cur_ptr == '\0' || *cur_ptr ==':') break;
+			if (*cur_ptr == '\0' || *cur_ptr ==':')
+				break;
 			buf[j][i] = *cur_ptr++;
 		}
-		if (*cur_ptr == '\0') break;
+		if (*cur_ptr == '\0')
+			break;
 		xassert(*cur_ptr == ':');
 		buf[j][i] = '\0';
 		cur_ptr++;
@@ -499,7 +501,8 @@ bool verify_hint(const char *arg, int *min_sockets, int *max_sockets,
 		        *max_threads = 1;
 			*cpu_bind_type |= CPU_BIND_TO_THREADS;
 		} else {
-			error("unrecognized --hint argument \"%s\", see --hint=help", tok);
+			error("unrecognized --hint argument \"%s\", "
+			      "see --hint=help", tok);
 			xfree(buf);
 			return 1;
 		}
diff --git a/src/plugins/task/affinity/task_affinity.c b/src/plugins/task/affinity/task_affinity.c
index 37526fe6a7c..a21110e8aa1 100644
--- a/src/plugins/task/affinity/task_affinity.c
+++ b/src/plugins/task/affinity/task_affinity.c
@@ -136,7 +136,9 @@ static void _update_bind_type(launch_tasks_request_msg_t *req)
 
 	if (conf->task_plugin_param & CPU_BIND_VERBOSE) {
 		req->cpu_bind_type |= CPU_BIND_VERBOSE;
+		set_bind = true;
 	}
+
 	if (set_bind) {
 		char bind_str[128];
 		slurm_sprint_cpu_bind_type(bind_str, req->cpu_bind_type);
diff --git a/src/salloc/opt.c b/src/salloc/opt.c
index 16799bd3aa6..85bcd1e4942 100644
--- a/src/salloc/opt.c
+++ b/src/salloc/opt.c
@@ -62,12 +62,12 @@
 #include "src/common/log.h"
 #include "src/common/parse_time.h"
 #include "src/common/proc_args.h"
+#include "src/common/read_config.h" /* contains getnodename() */
 #include "src/common/slurm_protocol_api.h"
+#include "src/common/slurm_rlimits_info.h"
 #include "src/common/uid.h"
 #include "src/common/xmalloc.h"
 #include "src/common/xstring.h"
-#include "src/common/slurm_rlimits_info.h"
-#include "src/common/read_config.h" /* contains getnodename() */
 
 #include "src/salloc/salloc.h"
 #include "src/salloc/opt.h"
diff --git a/src/sbatch/opt.c b/src/sbatch/opt.c
index 40cca296d81..edbb5f4a1bd 100644
--- a/src/sbatch/opt.c
+++ b/src/sbatch/opt.c
@@ -62,12 +62,12 @@
 #include "src/common/log.h"
 #include "src/common/parse_time.h"
 #include "src/common/proc_args.h"
+#include "src/common/read_config.h" /* contains getnodename() */
 #include "src/common/slurm_protocol_api.h"
+#include "src/common/slurm_rlimits_info.h"
 #include "src/common/uid.h"
 #include "src/common/xmalloc.h"
 #include "src/common/xstring.h"
-#include "src/common/slurm_rlimits_info.h"
-#include "src/common/read_config.h" /* contains getnodename() */
 
 #include "src/sbatch/opt.h"
 
diff --git a/src/srun/opt.c b/src/srun/opt.c
index cfb94b654ec..6a77665ee8b 100644
--- a/src/srun/opt.c
+++ b/src/srun/opt.c
@@ -71,22 +71,23 @@
 
 #include "src/common/list.h"
 #include "src/common/log.h"
+#include "src/common/mpi.h"
+#include "src/common/optz.h"
 #include "src/common/parse_time.h"
+#include "src/common/plugstack.h"
 #include "src/common/proc_args.h"
 #include "src/common/slurm_protocol_api.h"
 #include "src/common/slurm_protocol_interface.h"
+#include "src/common/slurm_rlimits_info.h"
 #include "src/common/uid.h"
 #include "src/common/xmalloc.h"
 #include "src/common/xstring.h"
-#include "src/common/slurm_rlimits_info.h"
-#include "src/common/plugstack.h"
-#include "src/common/optz.h"
+
 #include "src/api/pmi_server.h"
 
 #include "src/srun/multi_prog.h"
 #include "src/srun/opt.h"
 #include "src/srun/debugger.h"
-#include "src/common/mpi.h"
 
 /* generic OPT_ definitions -- mainly for use with env vars  */
 #define OPT_NONE        0x00
@@ -200,7 +201,6 @@ static bool _opt_verify(void);
 static void _process_env_var(env_vars_t *e, const char *val);
 
 static bool  _under_parallel_debugger(void);
-
 static void  _usage(void);
 static bool  _valid_node_list(char **node_list_pptr);
 static int   _verify_cpu_bind(const char *arg, char **cpu_bind,
@@ -340,11 +340,41 @@ static int _verify_cpu_bind(const char *arg, char **cpu_bind,
 		CPU_BIND_NONE|CPU_BIND_RANK|CPU_BIND_MAP|CPU_BIND_MASK;
 	int bind_to_bits =
 		CPU_BIND_TO_SOCKETS|CPU_BIND_TO_CORES|CPU_BIND_TO_THREADS;
+	uint16_t task_plugin_param = slurm_get_task_plugin_param();
 
 	if (arg == NULL) {
+		if ((*flags != 0) || 		/* already set values */
+		    (task_plugin_param == 0))	/* no system defaults */
+			return 0;
+
+		/* set system defaults */
+		xfree(*cpu_bind);
+		if (task_plugin_param & CPU_BIND_NONE) {
+			*flags = CPU_BIND_NONE;
+		} else if (task_plugin_param & CPU_BIND_TO_SOCKETS) {
+			*flags = CPU_BIND_TO_SOCKETS;
+			*cpu_bind = xstrdup("sockets");
+		} else if (task_plugin_param & CPU_BIND_TO_CORES) {
+			*flags = CPU_BIND_TO_CORES;
+			*cpu_bind = xstrdup("cores");
+		} else if (task_plugin_param & CPU_BIND_TO_THREADS) {
+			*flags |= CPU_BIND_TO_THREADS;
+			*cpu_bind = xstrdup("threads");
+		}
+		if (task_plugin_param & CPU_BIND_VERBOSE) {
+			*flags |= CPU_BIND_VERBOSE;
+			if (*cpu_bind)
+				xstrcat(*cpu_bind, ",verbose");
+			else
+				*cpu_bind = xstrdup("verbose");
+		}
 	    	return 0;
 	}
 
+	/* Start with system default verbose flag (if set) */
+	if (task_plugin_param & CPU_BIND_VERBOSE)
+		*flags |= CPU_BIND_VERBOSE;
+
     	buf = xstrdup(arg);
     	p = buf;
 	/* change all ',' delimiters not followed by a digit to ';'  */
@@ -399,28 +429,52 @@ static int _verify_cpu_bind(const char *arg, char **cpu_bind,
 			} else {
 				error("missing list for \"--cpu_bind=mask_cpu:<list>\"");
 				xfree(buf);
-				return 1;
+				return -1;
 			}
 		} else if ((strcasecmp(tok, "socket") == 0) ||
 		           (strcasecmp(tok, "sockets") == 0)) {
+			if (task_plugin_param & 
+			    (CPU_BIND_NONE | CPU_BIND_TO_CORES | 
+			     CPU_BIND_TO_THREADS)) {
+				error("--cpu_bind=sockets incompatable with "
+				      "TaskPluginParam configuration "
+				      "parameter");
+				return -1;
+			}
 			clear_then_set((int *)flags, bind_to_bits,
 				       CPU_BIND_TO_SOCKETS);
 		} else if ((strcasecmp(tok, "core") == 0) ||
 		           (strcasecmp(tok, "cores") == 0)) {
+			if (task_plugin_param & 
+			    (CPU_BIND_NONE | CPU_BIND_TO_SOCKETS | 
+			     CPU_BIND_TO_THREADS)) {
+				error("--cpu_bind=cores incompatable with "
+				      "TaskPluginParam configuration "
+				      "parameter");
+				return -1;
+			}
 			clear_then_set((int *)flags, bind_to_bits,
 				       CPU_BIND_TO_CORES);
 		} else if ((strcasecmp(tok, "thread") == 0) ||
 		           (strcasecmp(tok, "threads") == 0)) {
+			if (task_plugin_param & 
+			    (CPU_BIND_NONE | CPU_BIND_TO_SOCKETS | 
+			     CPU_BIND_TO_CORES)) {
+				error("--cpu_bind=threads incompatable with "
+				      "TaskPluginParam configuration "
+				      "parameter");
+				return -1;
+			}
 			clear_then_set((int *)flags, bind_to_bits,
 				       CPU_BIND_TO_THREADS);
 		} else {
 			error("unrecognized --cpu_bind argument \"%s\"", tok);
 			xfree(buf);
-			return 1;
+			return -1;
 		}
 	}
-
 	xfree(buf);
+
 	return 0;
 }
 
@@ -1517,7 +1571,8 @@ static void set_options(const int argc, char **argv)
 			opt.reboot = true;
 			break;
 		case LONG_OPT_GET_USER_ENV:
-			error("--get-user-env is no longer supported in srun, use sbatch");
+			error("--get-user-env is no longer supported in srun, "
+			      "use sbatch");
 			break;
 		case LONG_OPT_PTY:
 #ifdef HAVE_PTY_H
@@ -2018,6 +2073,10 @@ static bool _opt_verify(void)
 		xfree(sched_name);
 	}
 
+	 if (_verify_cpu_bind(NULL, &opt.cpu_bind,
+			      &opt.cpu_bind_type))
+		exit(1);
+
 	return verified;
 }
 
-- 
GitLab