svn commit: r327714 - user/jeff/numa/usr.bin/numactl
Jeff Roberson
jeff at FreeBSD.org
Tue Jan 9 01:41:57 UTC 2018
Author: jeff
Date: Tue Jan 9 01:41:55 2018
New Revision: 327714
URL: https://svnweb.freebsd.org/changeset/base/327714
Log:
Provide backwards compat for numactl.
Modified:
user/jeff/numa/usr.bin/numactl/numactl.c
Modified: user/jeff/numa/usr.bin/numactl/numactl.c
==============================================================================
--- user/jeff/numa/usr.bin/numactl/numactl.c Tue Jan 9 01:41:06 2018 (r327713)
+++ user/jeff/numa/usr.bin/numactl/numactl.c Tue Jan 9 01:41:55 2018 (r327714)
@@ -29,7 +29,7 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/cpuset.h>
-#include <sys/numa.h>
+#include <sys/domainset.h>
#include <sys/resource.h>
#include <sys/time.h>
@@ -58,58 +58,67 @@ static struct option longopts[] = {
};
static const char *
-policy_to_str(vm_domain_policy_type_t vt)
+policy_to_str(int policy)
{
- switch (vt) {
- case VM_POLICY_NONE:
- return ("none");
- case VM_POLICY_ROUND_ROBIN:
- return ("rr");
- case VM_POLICY_FIXED_DOMAIN:
- return ("fixed-domain");
- case VM_POLICY_FIXED_DOMAIN_ROUND_ROBIN:
- return ("fixed-domain-rr");
- case VM_POLICY_FIRST_TOUCH:
+ switch (policy) {
+ case DOMAINSET_POLICY_INVALID:
+ return ("invalid");
+ case DOMAINSET_POLICY_ROUNDROBIN:
+ return ("round-robin");
+ case DOMAINSET_POLICY_FIRSTTOUCH:
return ("first-touch");
- case VM_POLICY_FIRST_TOUCH_ROUND_ROBIN:
- return ("first-touch-rr");
+ case DOMAINSET_POLICY_PREFER:
+ return ("prefer");
default:
return ("unknown");
}
}
+static void
+domain_print(domainset_t *mask)
+{
+ int once;
+ int bit;
+
+ for (once = 0, bit = 0; bit < DOMAINSET_SETSIZE; bit++) {
+ if (DOMAINSET_ISSET(bit, mask)) {
+ if (once == 0) {
+ printf("%d", bit);
+ once = 1;
+ } else
+ printf(", %d", bit);
+ }
+ }
+ printf("\n");
+}
+
static int
-parse_policy(struct vm_domain_policy_entry *vd, const char *str)
+parse_policy(int *policy, const char *str)
{
if (strcmp(str, "rr") == 0) {
- vd->policy = VM_POLICY_ROUND_ROBIN;
- vd->domain = -1;
+ *policy = DOMAINSET_POLICY_ROUNDROBIN;
return (0);
}
if (strcmp(str, "first-touch-rr") == 0) {
- vd->policy = VM_POLICY_FIRST_TOUCH_ROUND_ROBIN;
- vd->domain = -1;
+ *policy = DOMAINSET_POLICY_FIRSTTOUCH;
return (0);
}
if (strcmp(str, "first-touch") == 0) {
- vd->policy = VM_POLICY_FIRST_TOUCH;
- vd->domain = -1;
+ *policy = DOMAINSET_POLICY_FIRSTTOUCH;
return (0);
}
if (strcmp(str, "fixed-domain") == 0) {
- vd->policy = VM_POLICY_FIXED_DOMAIN;
- vd->domain = 0;
+ *policy = DOMAINSET_POLICY_PREFER;
return (0);
}
if (strcmp(str, "fixed-domain-rr") == 0) {
- vd->policy = VM_POLICY_FIXED_DOMAIN_ROUND_ROBIN;
- vd->domain = 0;
+ *policy = DOMAINSET_POLICY_PREFER;
return (0);
}
@@ -150,10 +159,28 @@ set_numa_domain_cpuaffinity(int cpu_domain, cpuwhich_t
return (0);
}
+/*
+ * Attempt to maintain compatability with old style syscalls.
+ */
+static int
+numa_setaffinity(cpuwhich_t which, id_t id, int policy, int domain)
+{
+ domainset_t mask;
+ int p;
+
+ DOMAINSET_ZERO(&mask);
+ if (policy == DOMAINSET_POLICY_PREFER)
+ DOMAINSET_SET(domain, &mask);
+ else if (cpuset_getdomain(CPU_LEVEL_ROOT, CPU_WHICH_PID, -1,
+ sizeof(mask), &mask, &p) != 0)
+ err(EXIT_FAILURE, "getdomain");
+ return cpuset_setdomain(CPU_LEVEL_WHICH, which, id, sizeof(mask),
+ &mask, policy);
+}
+
int
main(int argc, char *argv[])
{
- struct vm_domain_policy_entry vd;
lwpid_t tid;
pid_t pid;
cpuwhich_t which;
@@ -163,6 +190,8 @@ main(int argc, char *argv[])
int mem_policy_set;
int ch;
int cpu_domain;
+ int policy;
+ int domain;
id = -1;
which = -1;
@@ -172,6 +201,8 @@ main(int argc, char *argv[])
tid = -1;
pid = -1;
cpu_domain = -1;
+ domain = -1;
+ policy = DOMAINSET_POLICY_INVALID;
while ((ch = getopt_long(argc, argv, "c:gl:m:p:st:", longopts,
NULL)) != -1) {
@@ -183,7 +214,7 @@ main(int argc, char *argv[])
is_get = 1;
break;
case 'l':
- if (parse_policy(&vd, optarg) != 0) {
+ if (parse_policy(&policy, optarg) != 0) {
fprintf(stderr,
"Could not parse policy: '%s'\n", optarg);
exit(1);
@@ -191,12 +222,7 @@ main(int argc, char *argv[])
mem_policy_set = 1;
break;
case 'm':
- if (mem_policy_set == 0) {
- fprintf(stderr,
- "Error: set policy first before domain\n");
- exit(1);
- }
- vd.domain = atoi(optarg);
+ domain = atoi(optarg);
break;
case 'p':
pid = atoi(optarg);
@@ -223,7 +249,7 @@ main(int argc, char *argv[])
}
/* Set current memory process policy, will be inherited */
- if (numa_setaffinity(CPU_WHICH_PID, -1, &vd) != 0)
+ if (numa_setaffinity(CPU_WHICH_PID, -1, policy, domain) != 0)
err(1, "numa_setaffinity");
/* If a CPU domain policy was given, include that too */
@@ -261,19 +287,23 @@ main(int argc, char *argv[])
/* If it's get, then get the policy and return */
if (is_get) {
- error = numa_getaffinity(which, id, &vd);
+ domainset_t mask;
+
+ printf("which %d, id %ld\n", which, id);
+ error = cpuset_getdomain(CPU_LEVEL_WHICH, which, id,
+ sizeof(mask), &mask, &policy);
if (error != 0)
- err(1, "numa_getaffinity");
- printf(" Policy: %s; domain: %d\n",
- policy_to_str(vd.policy),
- vd.domain);
+ err(1, "cpuset_getdomain");
+ printf(" Policy: %s; domain: ",
+ policy_to_str(policy));
+ domain_print(&mask);
exit(0);
}
/* Assume it's set */
/* Syscall */
- error = numa_setaffinity(which, id, &vd);
+ error = numa_setaffinity(which, id, policy, domain);
if (error != 0)
err(1, "numa_setaffinity");
More information about the svn-src-user
mailing list