2012-01-30 1 views
0

В целях обучения я хотел бы выполнить итерацию по всем задачам в модуле и вывести различную информацию о них. Для этой задачи Мне нужно заблокировать список всех задач (я также не уверен, должен ли я это сделать). Я видел в коде ядра код , который блокирует tasklist_lock. Однако этот символ не может использоваться модулями. Его экспорт был удален c59923a15c12d2b3597af913bf234a0ef264a38b фиксация.Альтернатива для tasklist_lock в модуле?

Есть ли другой способ заблокировать список задач?

+0

В какой версии ядра вы работаете? – ciphor

+0

@ciphor На последнем стабильном выпуске - v3.2.2. Но я не понимаю, как это может измениться. – Beginner

ответ

1

stop_machine() представляет незанятые потоки и отключает прерывания в каждом из CPU системы, за исключением тех, которые выполняют пользовательскую функцию, которую вы передаете в качестве аргумента для stop_machine(). Это эквивалентно удерживанию каждой спин-блокировки в ядре и приводит к зависанию системы до тех пор, пока выполняется пользовательская функция. Излишне говорить, что он имеет большое влияние на производительность, но также обеспечивает сильные гарантии последовательности.

Если вы хотите просто прочитать данные из задач системы, и вы не возражаете против абсолютной точности (согласованности), вы можете перебирать список учетных записей процессов в критическом разделе read-copy-update (RCU). Вы также можете проверить RCU in Wikipedia.

struct task_struct *iter; 
rcu_read_lock(); 
list_for_each_entry_rcu(iter, &init_task.tasks, tasks) { 
    printf("The current task of the list is: %s\n.", iter->comm); 
} 
rcu_read_unlock(); 
1

Вы можете использовать stop_machine() следующий образом:

int for_each_task(void * data) 
{ 
    struct task_struct * g, * p; 
    do_each_thread(g, p) { 
    // do the work 
    } while_each_thread(g, p); 
    return 0; 
} 

... 
stop_machine(for_each_task, NULL, NULL); 
... 

stop_machine интерфейса приостанавливает все задачи и ставит приоритетную нить на каждый CPU. Таким образом, при обратном вызове никаких других задач не планируется.

Смежные вопросы