taskset: move NR_CPUS determination to lib/cpuset.c
Signed-off-by: Karel Zak <kzak@redhat.com>
This commit is contained in:
parent
d50363cd62
commit
bae91ecf07
|
@ -51,6 +51,8 @@ extern int __cpuset_count_s(size_t setsize, const cpu_set_t *set);
|
||||||
|
|
||||||
#define cpuset_nbits(setsize) (8 * (setsize))
|
#define cpuset_nbits(setsize) (8 * (setsize))
|
||||||
|
|
||||||
|
extern int get_max_number_of_cpus(void);
|
||||||
|
|
||||||
extern cpu_set_t *cpuset_alloc(int ncpus, size_t *setsize, size_t *nbits);
|
extern cpu_set_t *cpuset_alloc(int ncpus, size_t *setsize, size_t *nbits);
|
||||||
extern void cpuset_free(cpu_set_t *set);
|
extern void cpuset_free(cpu_set_t *set);
|
||||||
|
|
||||||
|
|
41
lib/cpuset.c
41
lib/cpuset.c
|
@ -18,6 +18,7 @@
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
#include <sys/syscall.h>
|
||||||
|
|
||||||
#include "cpuset.h"
|
#include "cpuset.h"
|
||||||
|
|
||||||
|
@ -53,6 +54,38 @@ static const char *nexttoken(const char *q, int sep)
|
||||||
return q;
|
return q;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Number of bits in a CPU bitmask on current system
|
||||||
|
*/
|
||||||
|
int get_max_number_of_cpus(void)
|
||||||
|
{
|
||||||
|
int n, cpus = 2048;
|
||||||
|
size_t setsize;
|
||||||
|
cpu_set_t *set = cpuset_alloc(cpus, &setsize, NULL);
|
||||||
|
|
||||||
|
if (!set)
|
||||||
|
return -1; /* error */
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
CPU_ZERO_S(setsize, set);
|
||||||
|
|
||||||
|
/* the library version does not return size of cpumask_t */
|
||||||
|
n = syscall(SYS_sched_getaffinity, 0, setsize, set);
|
||||||
|
|
||||||
|
if (n < 0 && errno == EINVAL && cpus < 1024 * 1024) {
|
||||||
|
cpuset_free(set);
|
||||||
|
cpus *= 2;
|
||||||
|
set = cpuset_alloc(cpus, &setsize, NULL);
|
||||||
|
if (!set)
|
||||||
|
return -1; /* error */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
cpuset_free(set);
|
||||||
|
return n * 8;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Allocates a new set for ncpus and returns size in bytes and size in bits
|
* Allocates a new set for ncpus and returns size in bytes and size in bits
|
||||||
*/
|
*/
|
||||||
|
@ -200,7 +233,13 @@ int cpumask_parse(const char *str, cpu_set_t *set, size_t setsize)
|
||||||
CPU_ZERO_S(setsize, set);
|
CPU_ZERO_S(setsize, set);
|
||||||
|
|
||||||
while (ptr >= str) {
|
while (ptr >= str) {
|
||||||
char val = char_to_val(*ptr);
|
char val;
|
||||||
|
|
||||||
|
/* cpu masks in /sys uses comma as a separator */
|
||||||
|
if (*ptr == ',')
|
||||||
|
ptr--;
|
||||||
|
|
||||||
|
val = char_to_val(*ptr);
|
||||||
if (val == (char) -1)
|
if (val == (char) -1)
|
||||||
return -1;
|
return -1;
|
||||||
if (val & 1)
|
if (val & 1)
|
||||||
|
|
|
@ -27,7 +27,6 @@
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <sys/syscall.h>
|
|
||||||
#include <err.h>
|
#include <err.h>
|
||||||
|
|
||||||
#include "cpuset.h"
|
#include "cpuset.h"
|
||||||
|
@ -64,40 +63,6 @@ static void __attribute__((__noreturn__)) usage(FILE *out)
|
||||||
exit(out == stderr ? EXIT_FAILURE : EXIT_SUCCESS);
|
exit(out == stderr ? EXIT_FAILURE : EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Number of bits in a CPU bitmask on current system
|
|
||||||
*/
|
|
||||||
static int max_number_of_cpus(void)
|
|
||||||
{
|
|
||||||
int n, cpus = 2048;
|
|
||||||
size_t setsize;
|
|
||||||
cpu_set_t *set = cpuset_alloc(cpus, &setsize, NULL);
|
|
||||||
|
|
||||||
if (!set)
|
|
||||||
goto err;
|
|
||||||
|
|
||||||
for (;;) {
|
|
||||||
CPU_ZERO_S(setsize, set);
|
|
||||||
|
|
||||||
/* the library version does not return size of cpumask_t */
|
|
||||||
n = syscall(SYS_sched_getaffinity, 0, setsize, set);
|
|
||||||
|
|
||||||
if (n < 0 && errno == EINVAL && cpus < 1024 * 1024) {
|
|
||||||
cpuset_free(set);
|
|
||||||
cpus *= 2;
|
|
||||||
set = cpuset_alloc(cpus, &setsize, NULL);
|
|
||||||
if (!set)
|
|
||||||
goto err;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
cpuset_free(set);
|
|
||||||
return n * 8;
|
|
||||||
}
|
|
||||||
err:
|
|
||||||
errx(EXIT_FAILURE, _("cannot determine NR_CPUS; aborting"));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
cpu_set_t *new_set, *cur_set;
|
cpu_set_t *new_set, *cur_set;
|
||||||
|
@ -143,7 +108,9 @@ int main(int argc, char *argv[])
|
||||||
|| (pid && (argc - optind < 1 || argc - optind > 2)))
|
|| (pid && (argc - optind < 1 || argc - optind > 2)))
|
||||||
usage(stderr);
|
usage(stderr);
|
||||||
|
|
||||||
ncpus = max_number_of_cpus();
|
ncpus = get_max_number_of_cpus();
|
||||||
|
if (ncpus <= 0)
|
||||||
|
errx(EXIT_FAILURE, _("cannot determine NR_CPUS; aborting"));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* cur_set is always used for the sched_getaffinity call
|
* cur_set is always used for the sched_getaffinity call
|
||||||
|
|
Loading…
Reference in New Issue