parlib: Move the provisioning of cores to a PID
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 13 Dec 2017 21:06:51 +0000 (16:06 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 14 Dec 2017 18:42:20 +0000 (13:42 -0500)
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
tools/dev-util/perf/perf.c
user/parlib/include/parlib/parlib.h
user/parlib/parlib.c

index b018f9f..6116af3 100644 (file)
@@ -534,8 +534,6 @@ static void run_process_and_wait(int argc, char *argv[],
                                                                 const struct core_set *cores)
 {
        int pid, status;
-       size_t max_cores = parlib_nr_total_cores();
-       struct core_set pvcores;
 
        pid = create_child_with_stdfds(argv[0], argc, argv, environ);
        if (pid < 0) {
@@ -544,19 +542,12 @@ static void run_process_and_wait(int argc, char *argv[],
                exit(1);
        }
        if (cores) {
-               parlib_get_ll_core_set(&pvcores);
-               parlib_not_core_set(&pvcores);
-               parlib_and_core_sets(&pvcores, cores);
-               for (size_t i = 0; i < max_cores; i++) {
-                       if (parlib_get_core(&pvcores, i)) {
-                               if (sys_provision(pid, RES_CORES, i)) {
-                                       fprintf(stderr,
-                                                       "Unable to provision CPU %lu to PID %d: cmd='%s'\n",
-                                                       i, pid, argv[0]);
-                                       sys_proc_destroy(pid, -1);
-                                       exit(1);
-                               }
-                       }
+               if (provision_core_set(pid, cores)) {
+                       fprintf(stderr,
+                                       "Unable to provision all cores to PID %d: cmd='%s'\n",
+                                       pid, argv[0]);
+                       sys_proc_destroy(pid, -1);
+                       exit(1);
                }
        }
        sys_proc_run(pid);
index e1589e4..447b4c2 100644 (file)
@@ -10,6 +10,7 @@
 
 #include <parlib/common.h>
 #include <parlib/vcore.h>
+#include <parlib/core_set.h>
 #include <ros/memlayout.h>
 #include <ros/syscall.h>
 #include <ros/procinfo.h>
@@ -72,6 +73,7 @@ pid_t create_child(const char *exe, int argc, char *const argv[],
                    char *const envp[]);
 pid_t create_child_with_stdfds(const char *exe, int argc, char *const argv[],
                                char *const envp[]);
+int provision_core_set(pid_t pid, const struct core_set *cores);
 
 /* Once */
 typedef struct {
index ce39cd7..d4dd71a 100644 (file)
@@ -3,6 +3,7 @@
  * See LICENSE for details. */
 
 #include <parlib/parlib.h>
+#include <parlib/core_set.h>
 #include <parlib/ros_debug.h>
 #include <stdlib.h>
 
@@ -89,3 +90,21 @@ pid_t create_child_with_stdfds(const char *exe, int argc, char *const argv[],
        }
        return kid;
 }
+
+/* Provisions the CG cores to PID.  Returns -1 if any of them fail. */
+int provision_core_set(pid_t pid, const struct core_set *cores)
+{
+       struct core_set pvcores;
+       size_t max_cores = parlib_nr_total_cores();
+
+       parlib_get_ll_core_set(&pvcores);
+       parlib_not_core_set(&pvcores);
+       parlib_and_core_sets(&pvcores, cores);
+       for (size_t i = 0; i < max_cores; i++) {
+               if (parlib_get_core(&pvcores, i)) {
+                       if (sys_provision(pid, RES_CORES, i))
+                               return -1;
+               }
+       }
+       return 0;
+}