SYSERROR("Failed to retrieve namespace flags");
ctx->ns_clone_flags = ret;
- ctx->core_sched_cookie = core_scheduling_cookie_get(ctx->init_pid);
- if (!core_scheduling_cookie_valid(ctx->core_sched_cookie))
+ ret = core_scheduling_cookie_get(ctx->init_pid, &ctx->core_sched_cookie);
+ if (ret || !core_scheduling_cookie_valid(ctx->core_sched_cookie))
INFO("Container does not run in a separate core scheduling domain");
else
INFO("Container runs in separate core scheduling domain %llu",
goto on_error;
}
- core_sched_cookie = core_scheduling_cookie_get(getpid());
- if (!core_scheduling_cookie_valid(core_sched_cookie) &&
- ctx->core_sched_cookie != core_sched_cookie) {
+ ret = core_scheduling_cookie_get(getpid(), &core_sched_cookie);
+ if (ret || !core_scheduling_cookie_valid(core_sched_cookie) ||
+ (ctx->core_sched_cookie != core_sched_cookie)) {
SYSERROR("Invalid core scheduling domain cookie %llu != %llu",
(llu)core_sched_cookie,
(llu)ctx->core_sched_cookie);
ret = core_scheduling_cookie_create_threadgroup(handler->pid);
if (ret < 0) {
+ if (ret == -ENODEV) {
+ INFO("The kernel doesn't support or doesn't use simultaneous multithreading (SMT)");
+ conf->sched_core = false;
+ return 0;
+ }
if (ret == -EINVAL)
return syserror("The kernel does not support core scheduling");
return syserror("Failed to create new core scheduling domain");
}
- conf->sched_core_cookie = core_scheduling_cookie_get(handler->pid);
- if (!core_scheduling_cookie_valid(conf->sched_core_cookie))
+ ret = core_scheduling_cookie_get(handler->pid, &conf->sched_core_cookie);
+ if (ret || !core_scheduling_cookie_valid(conf->sched_core_cookie))
return syserror("Failed to retrieve core scheduling domain cookie");
TRACE("Created new core scheduling domain with cookie %llu",
return (cookie > 0) && (cookie != INVALID_SCHED_CORE_COOKIE);
}
-static inline __u64 core_scheduling_cookie_get(pid_t pid)
+static inline int core_scheduling_cookie_get(pid_t pid, __u64 *cookie)
{
- __u64 cookie;
int ret;
+ if (!cookie)
+ return ret_errno(EINVAL);
+
ret = prctl(PR_SCHED_CORE, PR_SCHED_CORE_GET, pid,
- PR_SCHED_CORE_SCOPE_THREAD, (unsigned long)&cookie);
- if (ret)
- return INVALID_SCHED_CORE_COOKIE;
+ PR_SCHED_CORE_SCOPE_THREAD, (unsigned long)cookie);
+ if (ret) {
+ *cookie = INVALID_SCHED_CORE_COOKIE;
+ return -errno;
+ }
- return cookie;
+ return 0;
}
static inline int core_scheduling_cookie_create_threadgroup(pid_t pid)