From 45bb22b164e869c2474369da6021e3ab4d75c033 Mon Sep 17 00:00:00 2001 From: Moe Jette <jette1@llnl.gov> Date: Mon, 12 Dec 2005 21:32:39 +0000 Subject: [PATCH] Determine sched_setaffinity() argument count at configure time. remove check of libc version which is not always reliable for this. --- auxdir/Makefile.am | 1 + auxdir/x_ac_affinity.m4 | 29 +++++++++ configure.ac | 7 ++- src/plugins/task/affinity/affinity.c | 72 +++++------------------ src/plugins/task/affinity/affinity.h | 1 - src/plugins/task/affinity/task_affinity.c | 1 - testsuite/expect/test1.89 | 7 --- 7 files changed, 49 insertions(+), 69 deletions(-) create mode 100644 auxdir/x_ac_affinity.m4 diff --git a/auxdir/Makefile.am b/auxdir/Makefile.am index dd05b64986a..9daaa7383e1 100644 --- a/auxdir/Makefile.am +++ b/auxdir/Makefile.am @@ -9,6 +9,7 @@ EXTRA_DIST = \ slurm.m4 \ type_socklen_t.m4 \ x_ac__system_configuration.m4 \ + x_ac_affinity.m4 \ x_ac_aix.m4 \ x_ac_bluegene.m4 \ x_ac_debug.m4 \ diff --git a/auxdir/x_ac_affinity.m4 b/auxdir/x_ac_affinity.m4 new file mode 100644 index 00000000000..f16b423f393 --- /dev/null +++ b/auxdir/x_ac_affinity.m4 @@ -0,0 +1,29 @@ +##***************************************************************************** +# $Id$ +##***************************************************************************** +# AUTHOR: +# Morris Jette <jette1@llnl.gov> +# +# SYNOPSIS: +# X_AC_AFFINITY +# +# DESCRIPTION: +# Test argument count of sched_getaffinity function. +# +# WARNINGS: +# This macro must be placed after AC_PROG_CC or equivalent. +##***************************************************************************** + +AC_DEFUN([X_AC_AFFINITY], [ + AC_TRY_COMPILE( + [#define _GNU_SOURCE + #include <sched.h>], + [cpu_set_t mask; + sched_getaffinity(0, sizeof(cpu_set_t), &mask);], + [AC_DEFINE(SCHED_GETAFFINITY_THREE_ARGS, 1, + [Define to 1 if sched_getaffinity takes three arguments.])]) + + AC_CHECK_FUNCS(sched_setaffinity, [have_sched_setaffinity=yes]) + AM_CONDITIONAL(HAVE_SCHED_SETAFFINITY, test "x$have_sched_setaffinity" = "xyes") +]) + diff --git a/configure.ac b/configure.ac index 7af066370c5..1b613fd196c 100644 --- a/configure.ac +++ b/configure.ac @@ -63,6 +63,10 @@ dnl Check if ptrace takes four or five arguments dnl X_AC_PTRACE +dnl Check of sched_getaffinity exists and it's argument count +dnl +X_AC_AFFINITY + dnl Checks for types. dnl X_AC_SLURM_BIGENDIAN @@ -92,9 +96,6 @@ AC_CHECK_DECLS([hstrerror, strsignal, sys_siglist]) AC_CHECK_FUNCS(unsetenv, [have_unsetenv=yes]) AM_CONDITIONAL(HAVE_UNSETENV, test "x$have_unsetenv" = "xyes") -AC_CHECK_FUNCS(sched_setaffinity, [have_sched_setaffinity=yes]) -AM_CONDITIONAL(HAVE_SCHED_SETAFFINITY, test "x$have_sched_setaffinity" = "xyes") - ACX_PTHREAD([], AC_MSG_ERROR([Error: Cannot figure out how to use pthreads!])) # Always define WITH_PTHREADS if we make it this far diff --git a/src/plugins/task/affinity/affinity.c b/src/plugins/task/affinity/affinity.c index 3e967afaa0e..2efcd9440f0 100644 --- a/src/plugins/task/affinity/affinity.c +++ b/src/plugins/task/affinity/affinity.c @@ -160,57 +160,16 @@ int get_cpuset(cpu_set_t *mask, slurmd_job_t *job) return false; } -/* user_older_affinity - * - * NOTE: some confusion in this. - * At first it seems: - * if glibc 2.3.2 then - * call sched_setaffinity(pid,mask) - * else - * call sched_setaffinity(pid,len,mask) - * but then some 2.4 kernels also have the - * 3 arg version - so its a mess. - */ -#if defined __GLIBC__ -#include <gnu/libc-version.h> /* for gnu_get_libc_version */ -#endif -bool use_3arg_affinity() -{ - static bool has_3arg_affinity = true; - static bool already_checked = false; - if (already_checked) { - return has_3arg_affinity; - } -#if defined __GLIBC__ - const char *glibc_vers = gnu_get_libc_version(); - if (glibc_vers != NULL) { - int scnt = 0, major = 0, minor = 0, point = 0; - scnt = sscanf (glibc_vers, "%d.%d.%d", &major, - &minor, &point); - if (scnt == 3) { - if ((major <= 2) && (minor <= 3) && (point <= 2)) { - has_3arg_affinity = false; - } - } - debug3("glibc version: %d.%d.%d (%d)\n", - major, minor, point, has_3arg_affinity); - } -#endif - already_checked = true; - return has_3arg_affinity; -} - int slurm_setaffinity(pid_t pid, size_t size, const cpu_set_t *mask) { - int (*fptr_sched_setaffinity)() = sched_setaffinity; - int rval = 0; - if (use_3arg_affinity()) { - rval = (*fptr_sched_setaffinity)(pid, size, mask); - } else { - rval = (*fptr_sched_setaffinity)(pid, mask); - } - + int rval; char mstr[1 + CPU_SETSIZE / 4]; + +#ifdef HAVE_SCHED_SETAFFINITY + rval = sched_setaffinity(pid, size, mask); +#else + rval = sched_setaffinity(pid, mask); +#endif if (rval) verbose("sched_setaffinity(%d,%d,0x%s) failed with status %d", pid, size, cpuset_to_str(mask, mstr), rval); @@ -219,16 +178,15 @@ int slurm_setaffinity(pid_t pid, size_t size, const cpu_set_t *mask) int slurm_getaffinity(pid_t pid, size_t size, cpu_set_t *mask) { - int (*fptr_sched_getaffinity)() = sched_getaffinity; - int rval = 0; - CPU_ZERO(mask); - if (use_3arg_affinity()) { - rval = (*fptr_sched_getaffinity)(pid, size, mask); - } else { - rval = (*fptr_sched_getaffinity)(pid, mask); - } - + int rval; char mstr[1 + CPU_SETSIZE / 4]; + + CPU_ZERO(mask); +#ifdef SCHED_GETAFFINITY_THREE_ARGS + rval = sched_getaffinity(pid, size, mask); +#else + rval = sched_getaffinity(pid, mask); +#endif if (rval) verbose("sched_getaffinity(%d,%d,0x%s) failed with status %d", pid, size, cpuset_to_str(mask, mstr), rval); diff --git a/src/plugins/task/affinity/affinity.h b/src/plugins/task/affinity/affinity.h index f87b541aff4..bef29c42616 100644 --- a/src/plugins/task/affinity/affinity.h +++ b/src/plugins/task/affinity/affinity.h @@ -73,7 +73,6 @@ /*** from affinity.c ***/ void slurm_chkaffinity(cpu_set_t *mask, slurmd_job_t *job, int statval); int get_cpuset(cpu_set_t *mask, slurmd_job_t *job); -bool use_3arg_affinity(); int slurm_setaffinity(pid_t pid, size_t size, const cpu_set_t *mask); int slurm_getaffinity(pid_t pid, size_t size, cpu_set_t *mask); diff --git a/src/plugins/task/affinity/task_affinity.c b/src/plugins/task/affinity/task_affinity.c index 1fdb10a6b3b..ffb5c85d7fd 100644 --- a/src/plugins/task/affinity/task_affinity.c +++ b/src/plugins/task/affinity/task_affinity.c @@ -74,7 +74,6 @@ const uint32_t plugin_version = 100; int init ( void ) { verbose("%s loaded", plugin_name); - use_3arg_affinity(); /* initialize check for older affinity */ return SLURM_SUCCESS; } diff --git a/testsuite/expect/test1.89 b/testsuite/expect/test1.89 index 310ff704666..4d3a8e62c21 100755 --- a/testsuite/expect/test1.89 +++ b/testsuite/expect/test1.89 @@ -70,8 +70,6 @@ exec $bin_chmod 700 $file_prog # Create an allocation # spawn $srun --allocate -N1 --verbose -t2 -expect -re "jobid ($number).*" -set job_id $expect_out(1,string) # # Run a job step to get allocated processor count and affinity @@ -94,7 +92,6 @@ expect { timeout { send_user "\nFAILURE: srun (from --allocate) not responding\n" set exit_code 1 - exp_continue } -re $prompt } @@ -117,7 +114,6 @@ expect { timeout { send_user "\nFAILURE: srun (from --allocate) not responding\n" set exit_code 1 - exp_continue } -re $prompt } @@ -149,7 +145,6 @@ expect { timeout { send_user "\nFAILURE: srun (from --allocate) not responding\n" set exit_code 1 - exp_continue } -re $prompt } @@ -180,7 +175,6 @@ expect { timeout { send_user "\nFAILURE: srun (from --allocate) not responding\n" set exit_code 1 - exp_continue } -re $prompt } @@ -202,7 +196,6 @@ expect { send_user "\nFAILURE: srun (from --allocate) not responding\n" kill_srun set exit_code 1 - exp_continue } eof { wait -- GitLab