如何在Linux中更改可装入内核模块(LKM)中的调度程序策略?

时间:2018-05-23 01:23:40

标签: linux system-calls scheduling kernel-module ioctl

我在Linux上写了一个LKM。 ioctl函数my_ioctl由用户级程序foo.c调用。我想更改foo.c的日程安排政策。因此,我在this linkmy_ioctl函数中执行以下操作:

struct sched_attr attr;
int ret;
unsigned int flags = 0;

attr.size = sizeof(attr);
attr.sched_flags = 0;
attr.sched_nice = 0;
attr.sched_priority = 0;

/* This creates a 10ms/30ms reservation */
attr.sched_policy = SCHED_DEADLINE;
attr.sched_runtime = 10 * 1000 * 1000;
attr.sched_period = attr.sched_deadline = 30 * 1000 * 1000;

ret = sched_setattr(current->pid, &attr, flags);
if (ret < 0) {
    perror("sched_setattr");
    exit(-1);
}

sched_setattr如下:

int sched_setattr(pid_t pid,
          const struct sched_attr *attr,
          unsigned int flags) {
    return syscall(__NR_sched_setattr, pid, attr, flags);
}

我已将syscall更改为sys_mycall because it's LKMstruct sched_attr也在上面提到的Linux内核文档链接中定义。但是,我无法通过此更改调度策略。它会引发我scheduling policy cannot be changed from kernel space之类的错误。 我不明白为什么会这样。有一个实用程序chrt,它对用户空间的进程执行相同的操作;那么为什么LKM无法做到这一点?或者我错过了什么?

0 个答案:

没有答案