Home | History | Annotate | Download | only in lib
      1 /*
      2  *   Copyright (c) 2012 Fujitsu Ltd.
      3  *   Author: Wanlong Gao <gaowanlong (at) cn.fujitsu.com>
      4  *
      5  *   This program is free software;  you can redistribute it and/or modify
      6  *   it under the terms of the GNU General Public License as published by
      7  *   the Free Software Foundation; either version 2 of the License, or
      8  *   (at your option) any later version.
      9  *
     10  *   This program is distributed in the hope that it will be useful,
     11  *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
     12  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
     13  *   the GNU General Public License for more details.
     14  *
     15  *   You should have received a copy of the GNU General Public License
     16  *   along with this program;  if not, write to the Free Software
     17  *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
     18  */
     19 
     20 #include <stdlib.h>
     21 #include <unistd.h>
     22 #include "test.h"
     23 #include "safe_macros.h"
     24 
     25 long tst_ncpus(void)
     26 {
     27 	long ncpus = -1;
     28 #ifdef _SC_NPROCESSORS_ONLN
     29 	ncpus = SAFE_SYSCONF(NULL, _SC_NPROCESSORS_ONLN);
     30 #else
     31 	tst_brkm(TBROK, NULL, "could not determine number of CPUs online");
     32 #endif
     33 	return ncpus;
     34 }
     35 
     36 long tst_ncpus_conf(void)
     37 {
     38 	long ncpus_conf = -1;
     39 #ifdef _SC_NPROCESSORS_CONF
     40 	ncpus_conf = SAFE_SYSCONF(NULL, _SC_NPROCESSORS_CONF);
     41 #else
     42 	tst_brkm(TBROK, NULL, "could not determine number of CPUs configured");
     43 #endif
     44 	return ncpus_conf;
     45 }
     46 
     47 #define KERNEL_MAX "/sys/devices/system/cpu/kernel_max"
     48 
     49 long tst_ncpus_max(void)
     50 {
     51 	long ncpus_max = -1;
     52 	struct stat buf;
     53 
     54 	/* sched_getaffinity() and sched_setaffinity() cares about number of
     55 	 * possible CPUs the OS or hardware can support, which can be larger
     56 	 * than what sysconf(_SC_NPROCESSORS_CONF) currently provides
     57 	 * (by enumarating /sys/devices/system/cpu/cpu* entries).
     58 	 *
     59 	 *  Use /sys/devices/system/cpu/kernel_max, if available. This
     60 	 *  represents NR_CPUS-1, a compile time option which specifies
     61 	 *  "maximum number of CPUs which this kernel will support".
     62 	 *  This should provide cpu mask size large enough for any purposes. */
     63 	if (stat(KERNEL_MAX, &buf) == 0) {
     64 		SAFE_FILE_SCANF(NULL, KERNEL_MAX, "%ld", &ncpus_max);
     65 		/* this is maximum CPU index allowed by the kernel
     66 		 * configuration, so # of cpus allowed by config is +1 */
     67 		ncpus_max++;
     68 	} else {
     69 		/* fall back to _SC_NPROCESSORS_CONF */
     70 		ncpus_max = tst_ncpus_conf();
     71 	}
     72 	return ncpus_max;
     73 }
     74