0

过去的 问题表明它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_yieldstrace确认该函数是最后一个调用的函数)。我唯一可用于此特定板的其他内核是 3.16,它也挂起。相同的代码在其他平台上运行得很好(一对带有内核 4.4 和 5.4 的 x86-64,另一个带有内核 4.9 的 aarch64 SBC)。因此,内核 3.14的sched_yield调用(或者可能在设置sched_yield时调用)似乎存在一些问题。SCHED_DEADLINE除了构建更新的内核之外,有什么我可以尝试弄清楚的吗?

4

0 回答 0