Зачем атомарное чтение считать переменную в структуре тасклета?
В подпрограмме tasklet_action - при обработке записи из списка tasklet_vec
ядро, мы атомарно читаем atomic_read(&t->count), я не вижу
любое из его использования в рутине, что является значительным?
if (tasklet_trylock(t)) { // check is it is not already being executed
if (!atomic_read(&t->count)) {
if (!test_and_clear_bit(TASKLET_STATE_SCHED, &t->state))
BUG();
t->func(t->data); // call tasklet action routine
tasklet_unlock(t);
continue;
}
tasklet_unlock(t);
}
1 ответ
Тасклет считается деактивированным / отключенным, если счетчик не равен нулю.
В некоторых архитектурах операция чтения не выполняется в одной инструкции сборки. Например, если вы читаете 64-битное значение, компилятор может реализовать чтение, используя две инструкции загрузки сборки, так что 1-я инструкция читает младшие 32 бита, а 2-я команда читает старшие 32 бита. Это в свою очередь может привести к состоянию гонки. Таким образом, атомарные чтения предпочтительнее.