DMA 屬性¶
本文件描述了 linux/dma-mapping.h 中定義的 DMA 屬性的語義。
DMA_ATTR_WEAK_ORDERING¶
DMA_ATTR_WEAK_ORDERING 指定對對映的讀寫可以是弱有序的,即讀寫操作可能相互超越。
由於平臺實現 DMA_ATTR_WEAK_ORDERING 是可選的,因此未實現的平臺將簡單地忽略該屬性並表現出預設行為。
DMA_ATTR_WRITE_COMBINE¶
DMA_ATTR_WRITE_COMBINE 指定對對映的寫入可以被緩衝以提高效能。
由於平臺實現 DMA_ATTR_WRITE_COMBINE 是可選的,因此未實現的平臺將簡單地忽略該屬性並表現出預設行為。
DMA_ATTR_NO_KERNEL_MAPPING¶
DMA_ATTR_NO_KERNEL_MAPPING 允許平臺避免為已分配的緩衝區建立核心虛擬對映。在某些架構上,建立此類對映並非易事,並且會消耗非常有限的資源(例如核心虛擬地址空間或 DMA 一致性地址空間)。使用此屬性分配的緩衝區只能透過呼叫 dma_mmap_attrs() 傳遞給使用者空間。透過使用此 API,你保證不會解引用 dma_alloc_attr() 返回的指標。你可以將其視為一個必須傳遞給 dma_mmap_attrs() 和 dma_free_attrs() 的“cookie”。確保這兩個函式在每次呼叫時也設定此屬性。
由於平臺實現 DMA_ATTR_NO_KERNEL_MAPPING 是可選的,因此未實現的平臺將簡單地忽略該屬性並表現出預設行為。
DMA_ATTR_SKIP_CPU_SYNC¶
預設情況下,dma_map_{single,page,sg} 函式族將給定的緩衝區從 CPU 域傳輸到裝置域。一些高階用例可能需要在一個以上的裝置之間共享緩衝區。這需要為每個裝置單獨建立對映,並且通常透過對給定緩衝區多次呼叫 dma_map_{single,page,sg} 函式來完成,其中裝置指標指向參與緩衝區共享的每個裝置。第一次呼叫將緩衝區從“CPU”域傳輸到“裝置”域,這會同步給定區域的 CPU 快取(通常這意味著根據 DMA 方向,快取已被重新整理或失效)。然而,對其他裝置後續呼叫 dma_map_{single,page,sg}() 將在 CPU 快取上執行完全相同的同步操作。CPU 快取同步可能是一個耗時的操作,特別是如果緩衝區很大,因此如果可能,強烈建議避免它。DMA_ATTR_SKIP_CPU_SYNC 允許平臺程式碼跳過給定緩衝區的 CPU 快取同步,前提是該緩衝區已傳輸到“裝置”域。此屬性也可以用於 dma_unmap_{single,page,sg} 函式族,以強制緩衝區在釋放其對映後保留在裝置域中。請謹慎使用此屬性!
DMA_ATTR_FORCE_CONTIGUOUS¶
預設情況下,DMA 對映子系統允許將 dma_alloc_attrs() 函式分配的緩衝區從單個頁面組裝起來,前提是它可以作為連續塊對映到裝置 DMA 地址空間中。透過指定此屬性,分配的緩衝區也被強制在物理記憶體中是連續的。
DMA_ATTR_ALLOC_SINGLE_PAGES¶
這是對 DMA 對映子系統的一個提示,表明可能不值得花時間以提供更好 TLB 效率的方式分配記憶體(即不值得嘗試使用更大的頁面來構建對映)。你可能希望在以下情況下指定此屬性:
你知道對這塊記憶體的訪問不會導致 TLB 顛簸。你可能知道訪問很可能是順序的,或者它們不是順序的,但不太可能在許多可能位於不同物理頁面的地址之間來回切換。
你知道訪問記憶體時 TLB 未命中的開銷足夠小,可以忽略不計。如果你正在執行解密或解壓縮等繁重操作,則可能屬於這種情況。
你知道 DMA 對映是相當短暫的。如果你預期對映的生命週期很短,那麼最佳化分配(避免使用大頁面)可能比獲得大頁面帶來的微小效能提升更值得。
設定此提示並不能保證你不會獲得巨頁,但它意味著我們不會那麼努力地去獲取它們。
注意
目前 DMA_ATTR_ALLOC_SINGLE_PAGES 僅在 ARM 上實現,不過 ARM64 的補丁可能很快就會發布。
DMA_ATTR_NO_WARN¶
這會告訴 DMA 對映子系統抑制分配失敗報告(類似於 __GFP_NOWARN)。
在某些架構上,分配失敗會透過錯誤訊息報告到系統日誌。雖然這有助於識別和除錯問題,但那些處理失敗(例如稍後重試)的驅動程式並沒有問題,並且實際上可能會用根本不是問題的錯誤訊息淹沒系統日誌,具體取決於重試機制的實現。
因此,這為驅動程式提供了一種方法,可以在分配失敗不是問題且不應干擾日誌的呼叫中避免這些錯誤訊息。
注意
目前 DMA_ATTR_NO_WARN 僅在 PowerPC 上實現。
DMA_ATTR_PRIVILEGED¶
一些高階外設,例如遠端處理器和 GPU,在特權“supervisor”模式和非特權“user”模式下都執行對 DMA 緩衝區的訪問。此屬性用於向 DMA 對映子系統指示緩衝區在較高特權級別完全可訪問(理想情況下,在較低特權級別不可訪問或至少只讀)。