2 * This file is part of sched_xetaffinity strace test.
4 * Copyright (c) 2016 Dmitry V. Levin <ldv@altlinux.org>
7 * SPDX-License-Identifier: GPL-2.0-or-later
11 #include <asm/unistd.h>
14 #if defined __NR_sched_getaffinity && defined __NR_sched_setaffinity \
15 && defined CPU_ISSET_S && defined CPU_ZERO_S && defined CPU_SET_S
22 static const char *errstr;
25 getaffinity(unsigned long pid, unsigned long size, void *set)
27 int rc = syscall(__NR_sched_getaffinity, pid, size, set);
28 errstr = sprintrc(rc);
33 setaffinity(unsigned long pid, unsigned long size, void *set)
35 int rc = syscall(__NR_sched_setaffinity, pid, size, set);
36 errstr = sprintrc(rc);
43 unsigned int cpuset_size = 1;
44 const pid_t pid = getpid();
47 assert(getaffinity(pid, cpuset_size, NULL) == -1);
51 perror_msg_and_skip("sched_getaffinity");
52 printf("sched_getaffinity(%d, %u, NULL) = %s\n",
53 pid, cpuset_size, errstr);
57 printf("sched_getaffinity(%d, %u, NULL) = %s\n",
58 pid, cpuset_size, errstr);
60 cpu_set_t *cpuset = tail_alloc(cpuset_size);
61 getaffinity(pid, cpuset_size, cpuset + 1);
62 printf("sched_getaffinity(%d, %u, %p) = %s\n",
63 pid, cpuset_size, cpuset + 1, errstr);
65 int ret_size = getaffinity(pid, cpuset_size, cpuset);
67 perror_msg_and_fail("sched_getaffinity(%d, %u, %p) = %s\n",
68 pid, (unsigned) cpuset_size, cpuset, errstr);
69 assert(ret_size <= (int) cpuset_size);
71 printf("sched_getaffinity(%d, %u, [", pid, cpuset_size);
74 for (i = 0, cpu = 0, sep = ""; i < (unsigned) ret_size * 8; ++i) {
75 if (CPU_ISSET_S(i, (unsigned) ret_size, cpuset)) {
76 printf("%s%u", sep, i);
81 printf("]) = %s\n", errstr);
83 CPU_ZERO_S(cpuset_size, cpuset);
84 CPU_SET_S(cpu, cpuset_size, cpuset);
85 if (setaffinity(pid, cpuset_size, cpuset))
86 perror_msg_and_skip("sched_setaffinity");
87 printf("sched_setaffinity(%d, %u, [%u]) = 0\n",
88 pid, cpuset_size, cpu);
90 const unsigned int big_size = cpuset_size < 128 ? 128 : cpuset_size * 2;
91 cpuset = tail_alloc(big_size);
92 ret_size = getaffinity(pid, big_size, cpuset);
94 perror_msg_and_fail("sched_getaffinity(%d, %u, %p) = %s\n",
95 pid, big_size, cpuset, errstr);
96 assert(ret_size <= (int) big_size);
97 printf("sched_getaffinity(%d, %u, [", pid, big_size);
98 for (i = 0, sep = ""; i < (unsigned) ret_size * 8; ++i) {
99 if (CPU_ISSET_S(i, (unsigned) ret_size, cpuset)) {
100 printf("%s%u", sep, i);
104 printf("]) = %s\n", errstr);
106 puts("+++ exited with 0 +++");
112 SKIP_MAIN_UNDEFINED("__NR_sched_getaffinity && __NR_sched_setaffinity"
113 " && CPU_ISSET_S && CPU_ZERO_S && CPU_SET_S")