DMA 測試指南¶
Andy Shevchenko <andriy.shevchenko@linux.intel.com>
這份小文件介紹瞭如何使用 dmatest 模組測試 DMA 驅動程式。
dmatest 模組使用各種長度以及源緩衝區和目標緩衝區的各種偏移量來測試 DMA memcpy、memset、XOR 和 RAID6 P+Q 操作。 它將使用可重複的模式初始化兩個緩衝區,並驗證 DMA 引擎是否複製了請求的區域,而沒有複製其他區域。 它還將驗證位元組是否未被交換,以及源緩衝區是否未被修改。
dmatest 模組可以配置為測試特定通道。它還可以同時測試多個通道,並且可以啟動多個執行緒來競爭同一個通道。
注意
測試套件僅適用於具有以下至少一種能力的通道:DMA_MEMCPY(記憶體到記憶體)、DMA_MEMSET(常量到記憶體或記憶體到記憶體,當模擬時)、DMA_XOR、DMA_PQ。
注意
如有任何相關問題,請使用官方郵件列表 dmaengine@vger.kernel.org。
第 1 部分 - 如何構建測試模組¶
menuconfig 包含一個選項,可以透過以下路徑找到
裝置驅動程式 -> DMA 引擎支援 -> DMA 測試客戶端
在配置檔案中,該選項稱為 CONFIG_DMATEST。dmatest 可以構建為模組或核心內部。 讓我們考慮這些情況。
第 2 部分 - 當 dmatest 構建為模組時¶
用法示例
% modprobe dmatest timeout=2000 iterations=1 channel=dma0chan0 run=1
...或者
% modprobe dmatest
% echo 2000 > /sys/module/dmatest/parameters/timeout
% echo 1 > /sys/module/dmatest/parameters/iterations
% echo dma0chan0 > /sys/module/dmatest/parameters/channel
% echo 1 > /sys/module/dmatest/parameters/run
...或者在核心命令列上
dmatest.timeout=2000 dmatest.iterations=1 dmatest.channel=dma0chan0 dmatest.run=1
多通道測試用法示例(5.0 核心中的新功能)
% modprobe dmatest
% echo 2000 > /sys/module/dmatest/parameters/timeout
% echo 1 > /sys/module/dmatest/parameters/iterations
% echo dma0chan0 > /sys/module/dmatest/parameters/channel
% echo dma0chan1 > /sys/module/dmatest/parameters/channel
% echo dma0chan2 > /sys/module/dmatest/parameters/channel
% echo 1 > /sys/module/dmatest/parameters/run
注意
對於所有測試,從 5.0 核心開始,無論是單通道還是多通道,通道引數必須在所有其他引數之後設定。 此時會獲取現有引數值以供執行緒使用。 所有其他引數都是共享的。 因此,如果對任何其他引數進行了更改,並且指定了其他通道,則用於所有執行緒的(共享)引數將使用新值。 指定通道後,每個執行緒都設定為掛起狀態。 當 run 引數設定為 1 時,所有執行緒開始執行。
提示
可以透過執行以下命令找到可用通道的列表
% ls -1 /sys/class/dma/
啟動後,會發出類似“dmatest: 添加了 1 個使用 dma0chan0 的執行緒”的訊息。 為該特定通道建立一個執行緒,現在處於掛起狀態,一旦 run 為 1,掛起執行緒就會啟動。
請注意,執行新測試不會停止任何正在進行的測試。
以下命令返回測試的狀態。
% cat /sys/module/dmatest/parameters/run
要等待測試完成,使用者空間可以輪詢 ‘run’ 直到它為 false,或者使用 wait 引數。 在載入模組時指定 ‘wait=1’ 會導致模組初始化暫停,直到測試執行完成,而讀取 /sys/module/dmatest/parameters/wait 會等待任何正在執行的測試完成後再返回。 例如,以下指令碼在退出前等待 42 個測試完成。 請注意,如果 ‘iterations’ 設定為 ‘infinite’,則停用等待。
示例
% modprobe dmatest run=1 iterations=42 wait=1
% modprobe -r dmatest
...或者
% modprobe dmatest run=1 iterations=42
% cat /sys/module/dmatest/parameters/wait
% modprobe -r dmatest
第 3 部分 - 內置於核心中時¶
提供給核心命令列的模組引數將用於第一次執行的測試。 使用者獲得控制權後,可以使用相同或不同的引數重新執行測試。 有關詳細資訊,請參見以上部分 第 2 部分 - 當 dmatest 構建為模組時。
在這兩種情況下,模組引數都用作測試用例的實際值。 您始終可以透過執行以下命令在執行時檢查它們
% grep -H . /sys/module/dmatest/parameters/*
第 4 部分 - 收集測試結果¶
測試結果以以下格式列印到核心日誌緩衝區
"dmatest: result <channel>: <test id>: '<error msg>' with src_off=<val> dst_off=<val> len=<val> (<err code>)"
輸出示例
% dmesg | tail -n 1
dmatest: result dma0chan0-copy0: #1: No errors with src_off=0x7bf dst_off=0x8ad len=0x3fea (0)
訊息格式在不同型別的錯誤中是統一的。 括號中的數字表示附加資訊,例如,錯誤程式碼、錯誤計數器或狀態。 測試執行緒還在完成時發出一行摘要,列出執行的測試數量、失敗的數量以及結果程式碼。
示例
% dmesg | tail -n 1
dmatest: dma0chan0-copy0: summary 1 test, 0 failures 1000 iops 100000 KB/s (0)
還會發出資料比較錯誤的詳細資訊,但不遵循上述格式。
第 5 部分 - 處理通道分配¶
分配通道¶
在開始測試執行之前,無需配置通道。 嘗試在不配置通道的情況下執行測試將導致測試任何可用的通道。
示例
% echo 1 > /sys/module/dmatest/parameters/run
dmatest: No channels configured, continue with any
通道使用“channel”引數註冊。 可以按名稱請求通道,一旦請求,通道就會註冊,並且將掛起的執行緒新增到測試列表。
示例
% echo dma0chan2 > /sys/module/dmatest/parameters/channel
dmatest: Added 1 threads using dma0chan2
可以透過重複上面的示例來新增更多通道。 讀回 channel 引數將返回上次成功新增的通道的名稱。
示例
% echo dma0chan1 > /sys/module/dmatest/parameters/channel
dmatest: Added 1 threads using dma0chan1
% echo dma0chan2 > /sys/module/dmatest/parameters/channel
dmatest: Added 1 threads using dma0chan2
% cat /sys/module/dmatest/parameters/channel
dma0chan2
請求通道的另一種方法是使用空字串請求通道。 這樣做將請求所有可用的通道進行測試
示例
% echo "" > /sys/module/dmatest/parameters/channel
dmatest: Added 1 threads using dma0chan0
dmatest: Added 1 threads using dma0chan3
dmatest: Added 1 threads using dma0chan4
dmatest: Added 1 threads using dma0chan5
dmatest: Added 1 threads using dma0chan6
dmatest: Added 1 threads using dma0chan7
dmatest: Added 1 threads using dma0chan8
在測試配置過程中的任何時候,讀取“test_list”引數都會列印當前掛起的測試列表。
示例
% cat /sys/module/dmatest/parameters/test_list
dmatest: 1 threads using dma0chan0
dmatest: 1 threads using dma0chan3
dmatest: 1 threads using dma0chan4
dmatest: 1 threads using dma0chan5
dmatest: 1 threads using dma0chan6
dmatest: 1 threads using dma0chan7
dmatest: 1 threads using dma0chan8
注意:必須為每個測試執行配置通道,因為通道配置不會延續到下一個測試執行。
釋放通道¶
可以透過將 run 設定為 0 來釋放通道。
示例
% echo dma0chan1 > /sys/module/dmatest/parameters/channel
dmatest: Added 1 threads using dma0chan1
% cat /sys/class/dma/dma0chan1/in_use
1
% echo 0 > /sys/module/dmatest/parameters/run
% cat /sys/class/dma/dma0chan1/in_use
0
在完成成功的測試執行後請求新通道時,會自動釋放先前測試執行分配的通道。