2015-09-27 70 views
1

我有一個Linux內核模塊,用於計算多個CPU(內核地址空間)中的網絡數據包統計信息。我定期清除相應的內存塊,強烈需要此操作對所有CPU立即生效,否則會扭曲後續的統計值。我的目標CPU是Power PC,所以它的緩存一致性非常寬鬆。因此,我需要在清零內存後手動刷新所有CPU的數據緩存。在Linux內核模塊中刷新CPU數據緩存

所以我應該把我剛剛清理步驟之後:

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

有關緩存和TLB的所有api位於[Documentation/cachetlb.txt](https://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git/tree/Documentation/ cachetlb.txt?id = refs/tags/v4.2.1),但我也想知道哪一個符合你的要求。 –

+1

短語'需要此操作才能立即生效所有CPU'對於多線程編程沒有意義。如果統計值是某個**不變**的一部分,所有CPU都應該遵守**,則在訪問它們時需要使用鎖定(自旋鎖,互斥鎖)。在某些情況下,*原子操作*或*內存障礙*以較低的成本提供相同的保證。 Linux內核中還有許多其他的同步機制。但是,鑑於信息不足以作出適當的選擇。 – Tsyvarev

+0

假設我們處於CPU X的延遲中斷處理程序中。有一塊內存負責累積由CPU Y(由CPU Y處理)接收到的以太網數據包的統計信息。可能這個塊被複制到CPU Y數據緩存中。現在我們從CPU X中清除這個塊,並且需要保證這些值(塊的一部分)不會隨後由CPU Y增加。我知道同步在這裏是明顯的想法,但對於這種情況來說太昂貴了。 – ababo

回答

0

一些深思熟慮之後,我意識到這裏的問題是不是真的鏈接到數據緩存刷新。其實我試圖避免一個平庸的競爭條件(第一個CPU清除價值,而第二個增加它)。在我的情況下,通過互斥鎖保護數據的成本太高,因此值得使用原子標誌通知擁有的CPU自行清除值。