Использование sched_setaffinity () в ядре Linux - PullRequest
1 голос
/ 06 марта 2019

Много постов на sched_setaffinity, но почти нет при использовании этого в Пространстве ядра.

Я нахожусь на ядре 4.14.79.

Я пытался использовать метод User Space для вызова sched_setaffinity в виде:

cpu_set_t my_set;        
CPU_ZERO(&my_set);       
CPU_SET(7, &my_set);     
sched_setaffinity(0, sizeof(cpu_set_t), &my_set);

Но при попытке скомпилировать ядро ​​я получил ошибки и понял, что эта форма не будет работать в пространстве ядра.

Я вижу, что sched_affinity определен в sched.h и имеет вид:

extern long sched_setaffinity(pid_t pid, const struct cpumask *new_mask);

Но я не совсем понимаю, как правильно создать параметр new_mask с правильным номером ЦП. Документация на это не очень полезна.

Может ли кто-нибудь показать пример того, как использовать эту функцию в пространстве ядра для установки процесса на конкретный процессор?

1 Ответ

1 голос
/ 08 марта 2019

Сам нашел ответ после того, как покопался в файлах ядра, ища, где появляется cpumask.

Вы можете использовать эти две функции:

cpumask_clear(struct cpumask *dstp) //clear the mask you are about to use

cpumask_set_cpu(unsigned int cpu, struct cpumask *dstp) //set the cpu number

Итак, вот что я использовал:

struct cpumask mask;  
cpumask_clear(&mask); 
cpumask_set_cpu(cpuNumber, &mask); 
sched_setaffinity(pid, &mask); 
...