Прочистване на кеш паметта за данни на процесора в модула на ядрото на Linux

Имам модул на ядрото на Linux, който изчислява статистика на мрежовите пакети между няколко процесора (в адресното пространство на ядрото). Периодично изчиствам съответната част от паметта и силно се нуждая от това действие, за да влезе в сила незабавно за всички процесори, в противен случай то ще изкриви последващите статистически стойности. Моят целеви CPU е 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
Да приемем, че сме в манипулатор на отложено прекъсване на CPU X. Има част от паметта, отговорна за натрупването на статистически данни за Ethernet пакети, получени от CPU Y (които се обработват от CPU Y). Вероятно тази част е копирана в кеша за данни на CPU Y. Сега изчистваме тази част от CPU X и се нуждаем от гаранция, че нито една от тези стойности (части от частта) няма да бъде увеличена впоследствие от CPU Y. Знам, че синхронизирането е очевидната идея тук, но е твърде скъпо за случая.   -  person ababo    schedule 27.09.2015


Отговори (1)


След известен размисъл разбрах, че проблемът тук всъщност не е свързан с изчистването на кеша за данни. Всъщност се опитвам да избегна банално състояние на състезание (първият процесор изчиства стойността, докато вторият я увеличава). В моя случай е твърде скъпо да се защитават данните чрез mutex, така че си струва да използвате атомен флаг, за да уведомите притежаващия процесор да изчисти стойностите сам.

person ababo    schedule 28.09.2015