From e9260f54514d4eb7bd60fb5a8ca889fe950d34b6 Mon Sep 17 00:00:00 2001 From: Martin Kroeker Date: Wed, 6 Jul 2022 17:21:10 +0200 Subject: [PATCH 1/2] Guard against system call returning zero processors --- driver/others/init.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/driver/others/init.c b/driver/others/init.c index a29dce971..cc3145a62 100644 --- a/driver/others/init.c +++ b/driver/others/init.c @@ -877,21 +877,21 @@ void gotoblas_affinity_init(void) { nums = sysconf(_SC_NPROCESSORS_CONF); #if !defined(__GLIBC_PREREQ) - common->num_procs = nums; + common->num_procs = nums >0 ? nums : 2; #else #if !__GLIBC_PREREQ(2, 3) - common->num_procs = nums; + common->num_procs = nums >0 ? nums : 2; #elif __GLIBC_PREREQ(2, 7) - cpusetp = CPU_ALLOC(nums); + cpusetp = CPU_ALLOC(nums>0? nums:1024); if (cpusetp == NULL) { - common->num_procs = nums; + common->num_procs = nums>0 ? nums: 2; } else { size_t size; - size = CPU_ALLOC_SIZE(nums); + size = CPU_ALLOC_SIZE(nums>0? nums: 1024); ret = sched_getaffinity(0,size,cpusetp); if (ret!=0) - common->num_procs = nums; + common->num_procs = nums >0 ? nums : 1; else common->num_procs = CPU_COUNT_S(size,cpusetp); } @@ -899,12 +899,12 @@ void gotoblas_affinity_init(void) { #else ret = sched_getaffinity(0,sizeof(cpu_set_t), &cpuset); if (ret!=0) { - common->num_procs = nums; + common->num_procs = nums >0 ? nums : 2; } else { #if !__GLIBC_PREREQ(2, 6) int i; int n = 0; - for (i=0;i0 ?nums:1024) ;i++) if (CPU_ISSET(i,&cpuset)) n++; common->num_procs = n; } @@ -1022,7 +1022,7 @@ void gotoblas_set_affinity2(int threads) {}; void gotoblas_affinity_reschedule(void) {}; -int get_num_procs(void) { return sysconf(_SC_NPROCESSORS_CONF); } +int get_num_procs(void) { int num = sysconf(_SC_NPROCESSORS_CONF); return (nums >0 ? nums : 2); } int get_num_nodes(void) { return 1; } From 69148ae795f5e737a131fd4f9324bb25e5698b2f Mon Sep 17 00:00:00 2001 From: Martin Kroeker Date: Wed, 6 Jul 2022 17:22:18 +0200 Subject: [PATCH 2/2] Guard against sysconf returning zero processors --- driver/others/memory.c | 46 +++++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/driver/others/memory.c b/driver/others/memory.c index 0f4cbb24d..a9b4650eb 100644 --- a/driver/others/memory.c +++ b/driver/others/memory.c @@ -252,23 +252,23 @@ int get_num_procs(void) { ret = omp_get_num_places(); if (ret >0 ) nums = ret; #endif - return nums; + return (nums > 0 ? nums : 2); #endif #if !defined(OS_LINUX) - return nums; + return (nums > 0 ? nums : 2); #endif #if !defined(__GLIBC_PREREQ) - return nums; + return (nums > 0 ? nums :2); #else #if !__GLIBC_PREREQ(2, 3) - return nums; + return (nums > 0 ? nums :2); #endif #if !__GLIBC_PREREQ(2, 7) ret = sched_getaffinity(0,sizeof(cpuset), &cpuset); - if (ret!=0) return nums; + if (ret!=0) return (nums > 0 ? nums :2); n=0; #if !__GLIBC_PREREQ(2, 6) for (i=0;i 0 ? nums :2); #else if (nums >= CPU_SETSIZE) { cpusetp = CPU_ALLOC(nums); if (cpusetp == NULL) { - return nums; + return (nums > 0 ? nums :2); } size = CPU_ALLOC_SIZE(nums); ret = sched_getaffinity(0,size,cpusetp); if (ret!=0) { CPU_FREE(cpusetp); - return nums; + return (nums > 0 ? nums :2); } ret = CPU_COUNT_S(size,cpusetp); if (ret > 0 && ret < nums) nums = ret; CPU_FREE(cpusetp); - return nums; + return (nums > 0 ? nums :2); } else { ret = sched_getaffinity(0,sizeof(cpuset),&cpuset); if (ret!=0) { - return nums; + return (nums > 0 ? nums :2); } ret = CPU_COUNT(&cpuset); if (ret > 0 && ret < nums) nums = ret; - return nums; + return (nums > 0 ? nums :2); } #endif #endif @@ -1823,56 +1823,56 @@ int get_num_procs(void) { ret = omp_get_num_places(); if (ret >0 ) nums = ret; #endif - return nums; + return (nums > 0 ? nums :2); #endif #if !defined(OS_LINUX) - return nums; + return (nums > 0 ? nums :2); #endif #if !defined(__GLIBC_PREREQ) - return nums; + return (nums > 0 ? nums :2); #else #if !__GLIBC_PREREQ(2, 3) - return nums; + return (nums > 0 ? nums :2); #endif #if !__GLIBC_PREREQ(2, 7) ret = sched_getaffinity(0,sizeof(cpuset), &cpuset); - if (ret!=0) return nums; + if (ret!=0) return (nums > 0 ? nums :2); n=0; #if !__GLIBC_PREREQ(2, 6) - for (i=0;i 0 ? nums :2);i++) if (CPU_ISSET(i,&cpuset)) n++; nums=n; #else nums = CPU_COUNT(sizeof(cpuset),&cpuset); #endif - return nums; + return (nums > 0 ? nums :2); #else if (nums >= CPU_SETSIZE) { cpusetp = CPU_ALLOC(nums); if (cpusetp == NULL) { - return nums; + return (nums > 0 ? nums :2); } size = CPU_ALLOC_SIZE(nums); ret = sched_getaffinity(0,size,cpusetp); if (ret!=0) { CPU_FREE(cpusetp); - return nums; + return (nums > 0 ? nums :2); } ret = CPU_COUNT_S(size,cpusetp); if (ret > 0 && ret < nums) nums = ret; CPU_FREE(cpusetp); - return nums; + return (nums > 0 ? nums :2); } else { ret = sched_getaffinity(0,sizeof(cpuset),&cpuset); if (ret!=0) { - return nums; + return (nums > 0 ? nums :2); } ret = CPU_COUNT(&cpuset); if (ret > 0 && ret < nums) nums = ret; - return nums; + return (nums > 0 ? nums :2); } #endif #endif