Я написал LKM в Linux.Функция ioctl
, my_ioctl
вызывается программой уровня пользователя foo.c
.Я хочу изменить политику планирования на foo.c
.Поэтому я делаю следующее в моей 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
, потому что это LKM .struct sched_attr
также определено в вышеупомянутой ссылке на документацию по ядру Linux.Однако я не мог изменить политику планирования этим.Это выдает ошибку как scheduling policy cannot be changed from kernel space
.Я не понимаю, почему это так.Существует утилита chrt
, которая делает то же самое для процесса из пространства пользователя;тогда почему это невозможно из LKM?Или я что-то упустил?