Доброй ночи!
Столкнулся с проблемой реализации работы с двунаправленными списками в ядре linux. А точнее с одновременной работой нескольких потоков ядра с одним списком.
Имеем один список LIST_HEAD(main_head_list);
Он будет содержать список данных структуру:
struct main_struct
{
int number_1;
int number_2;
}
В ядре существует несколько потоков (в моём случае их 16).
Все они обращаются к списку main_head_list, создают, осуществляют поиск а также удаляют записи.
Не знаю, важно ли это, но упомяну. До начала взаимодействия с этим списком потоки, как правило уже удерживают некую спинблокировку.
Вот пример работы одного потока.
1. Выделяет память для структуры main_struct и заносит её в двунаправленный список с помощью list_add.
2. Этот поток производит некие действия, которые для меня являются «чёрным ящиком», т.е. я не знаю как дальше он себя поведёт, будет выгружен, поставлен в очередь на выполнение или что ещё.
3. Тут потоку следует найти в списке main_head_list ту самую структуру которую он занёс в этот список на этапе 1.
Как осуществить корректную работу с этим списком?
При попытках обойтись без синхронизации, с поиском и удалением структуры из списка на этапе 3 при использовании list_for_each_entry происходит зависание системы. (примерно при 80 000 итерации добавления и удаления данных из списка.)