过去的 问题表明它SCHED_DEADLINE
从内核 3.14.10 开始可用。我正在尝试在运行内核 3.14.79 的 aarch64 SBC 上运行以下测试程序:
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <sys/syscall.h>
#include <linux/sched.h>
#include <pthread.h>
#include <stdint.h>
#include <unistd.h>
struct sched_attr {
uint32_t size;
uint32_t sched_policy;
uint64_t sched_flags;
int32_t sched_nice;
uint32_t sched_priority;
uint64_t sched_runtime;
uint64_t sched_deadline;
uint64_t sched_period;
};
int sched_setattr(pid_t pid, const struct sched_attr *attr, unsigned int flags)
{
return syscall(__NR_sched_setattr, pid, attr, flags); // Needs unistd.h
}
int main(int argc, char *argv[])
{
struct sched_attr attr = {
.size = sizeof(attr),
.sched_policy = SCHED_DEADLINE,
.sched_runtime = 1 * 1000 * 1000,
.sched_deadline = 1 * 1000 * 1000,
.sched_period = 500 * 1000 * 1000
};
// First arg 0 => current thread
int ret = sched_setattr(0, &attr, 0);
if (ret < 0) {
perror("sched_setattr() failed:");
}
printf("Going into loop...\n");
for (int i=0; ; i++) {
printf("Iteration %d\n", i);
sched_yield();
}
}
该程序挂起sched_yield
(strace
确认该函数是最后一个调用的函数)。我唯一可用于此特定板的其他内核是 3.16,它也挂起。相同的代码在其他平台上运行得很好(一对带有内核 4.4 和 5.4 的 x86-64,另一个带有内核 4.9 的 aarch64 SBC)。因此,内核 3.14的sched_yield
调用(或者可能在设置sched_yield
时调用)似乎存在一些问题。SCHED_DEADLINE
除了构建更新的内核之外,有什么我可以尝试弄清楚的吗?