parlib: Move the provisioning of cores to a PID Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
diff --git a/tools/dev-util/perf/perf.c b/tools/dev-util/perf/perf.c index b018f9f..6116af3 100644 --- a/tools/dev-util/perf/perf.c +++ b/tools/dev-util/perf/perf.c
@@ -534,8 +534,6 @@ 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 @@ 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);
diff --git a/user/parlib/include/parlib/parlib.h b/user/parlib/include/parlib/parlib.h index e1589e4..447b4c2 100644 --- a/user/parlib/include/parlib/parlib.h +++ b/user/parlib/include/parlib/parlib.h
@@ -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 @@ 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 {
diff --git a/user/parlib/parlib.c b/user/parlib/parlib.c index ce39cd7..d4dd71a 100644 --- a/user/parlib/parlib.c +++ b/user/parlib/parlib.c
@@ -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 @@ } 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; +}