我在Linux上写了一个LKM。 ioctl
函数my_ioctl
由用户级程序foo.c
调用。我想更改foo.c
的日程安排政策。因此,我在this link的my_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 LKM。 struct sched_attr
也在上面提到的Linux内核文档链接中定义。但是,我无法通过此更改调度策略。它会引发我scheduling policy cannot be changed from kernel space
之类的错误。
我不明白为什么会这样。有一个实用程序chrt
,它对用户空间的进程执行相同的操作;那么为什么LKM无法做到这一点?或者我错过了什么?