]> err.no Git - util-linux/commitdiff
taskset: move NR_CPUS determination to lib/cpuset.c
authorKarel Zak <kzak@redhat.com>
Fri, 28 May 2010 09:08:39 +0000 (11:08 +0200)
committerKarel Zak <kzak@redhat.com>
Tue, 1 Jun 2010 09:11:26 +0000 (11:11 +0200)
Signed-off-by: Karel Zak <kzak@redhat.com>
include/cpuset.h
lib/cpuset.c
schedutils/taskset.c

index 197476ed96057d0c477662090309767060bd0a32..5f6b5bbf69ee7678051b695b3c079ac4492bde57 100644 (file)
@@ -51,6 +51,8 @@ extern int __cpuset_count_s(size_t setsize, const cpu_set_t *set);
 
 #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 void cpuset_free(cpu_set_t *set);
 
index d6cbf5d3042495b3fb86dca12f8d3c26851056d3..27b2349886142f833b64082c62d23b21682edbaa 100644 (file)
@@ -18,6 +18,7 @@
 #include <errno.h>
 #include <string.h>
 #include <ctype.h>
+#include <sys/syscall.h>
 
 #include "cpuset.h"
 
@@ -53,6 +54,38 @@ static const char *nexttoken(const char *q,  int sep)
        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
  */
@@ -200,7 +233,13 @@ int cpumask_parse(const char *str, cpu_set_t *set, size_t setsize)
        CPU_ZERO_S(setsize, set);
 
        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)
                        return -1;
                if (val & 1)
index 66387c8274f3951b947c64bc09150b74a3d25500..2f1bc745fbdaa30ad2aae5300506b62e2cee5206 100644 (file)
@@ -27,7 +27,6 @@
 #include <errno.h>
 #include <string.h>
 #include <ctype.h>
-#include <sys/syscall.h>
 #include <err.h>
 
 #include "cpuset.h"
@@ -64,40 +63,6 @@ static void __attribute__((__noreturn__)) usage(FILE *out)
        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[])
 {
        cpu_set_t *new_set, *cur_set;
@@ -143,7 +108,9 @@ int main(int argc, char *argv[])
                        || (pid && (argc - optind < 1 || argc - optind > 2)))
                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