Очистить кеши данных ЦП в модуле ядра Linux

У меня есть модуль ядра Linux, который вычисляет статистику сетевых пакетов между несколькими процессорами (в адресном пространстве ядра). Периодически я очищаю соответствующий фрагмент памяти и настоятельно нуждаюсь в том, чтобы это действие немедленно вступило в силу для всех процессоров, в противном случае это исказит последующие значения статистики. Мой целевой ЦП - Power PC, поэтому согласованность его кэша очень ослаблена. Таким образом, мне нужно вручную очистить кеши данных всех процессоров сразу после обнуления памяти.

Итак, что я должен разместить сразу после процедуры очистки:

memset(ptr, 0, size);
// what's going here?

person ababo    schedule 27.09.2015    source источник
comment
Все API о кешировании и TLB находятся в Documentation / cachetlb.txt, но мне также интересно, какой из них отвечает вашим требованиям.   -  person Chris Tsui    schedule 27.09.2015
comment
Фраза need this action to take immediate effect for all CPUs не имеет смысла для многопоточного программирования. Если значения статистики являются частью некоторого инварианта, который должен соблюдаться всеми процессорами, вам необходимо использовать блокировки (спин-блокировки, мьютексы) при доступе к ним. В некоторых случаях атомарные операции или барьеры памяти предоставляют такую ​​же гарантию с меньшими затратами. В ядре Linux есть много других механизмов синхронизации. Но данной информации недостаточно для правильного выбора.   -  person Tsyvarev    schedule 27.09.2015
comment
Предположим, что мы находимся в обработчике отложенных прерываний на ЦП X. Есть блок памяти, отвечающий за накопление статистики пакетов Ethernet, полученных ЦП Y (которые обрабатываются ЦП Y). Вероятно, этот кусок копируется в кэш данных CPU Y. Теперь мы очищаем этот фрагмент от ЦП X и нуждаемся в гарантии, что ни одно из этих значений (частей фрагмента) не будет впоследствии увеличено ЦП Y. Я знаю, что синхронизация здесь очевидная идея, но это слишком дорого для случая.   -  person ababo    schedule 27.09.2015


Ответы (1)


После некоторого размышления я понял, что проблема здесь на самом деле не связана с очисткой кеша данных. На самом деле я стараюсь избегать банального состояния гонки (первый процессор очищает значение, а второй увеличивает его). В моем случае защищать данные с помощью мьютекса слишком дорого, поэтому стоит использовать атомарный флаг, чтобы уведомить собственный ЦП, чтобы он сам очистил значения.

person ababo    schedule 28.09.2015