DRM 客戶端使用統計¶
DRM 驅動程式可以選擇透過 fops->show_fdinfo() 作為在 struct drm_driver 物件中註冊的驅動程式特定檔案操作的一部分,匯出部分標準化的文字輸出,該物件已註冊到 DRM 核心。
此輸出的一個目的是儘可能通用地編寫類似 top(1) 的使用者空間監控工具。
鑑於各種 DRM 驅動程式之間的差異,輸出的規範分為通用部分和驅動程式特定部分。 也就是說,在可能的情況下,仍應努力盡可能地標準化。
檔案格式規範¶
檔案應包含每行文字一個鍵值對。
冒號字元 (:) 必須用於分隔鍵和值。
所有標準化的鍵都應以 drm- 為字首。
驅動程式特定的鍵應以 driver_name- 為字首,其中 driver_name 理想情況下應與
struct drm_driver中的 name 欄位相同,儘管這不是強制性的。解析時應忽略分隔符和第一個非空白字元之間的空白。
不允許鍵包含空白字元。
數字鍵值對可以以可選的單位字串結尾。
值的資料型別已固定,如規範中所定義。
鍵型別¶
強制性,完全標準化。
可選,完全標準化。
驅動程式特定。
資料型別¶
<uint> - 無符號整數,不定義最大值。
<keystr> - 字串,不包含任何上述定義的保留字元或空格。
<valstr> - 字串。
強制性完全標準化鍵¶
drm-driver: <valstr>
字串應包含此驅動程式透過各自的 struct drm_driver 資料結構註冊的名稱。
可選的完全標準化鍵¶
標識¶
drm-pdev: <aaaa:bb.cc.d>
對於 PCI 裝置,這應包含相關裝置的 PCI 插槽地址。
drm-client-id: <uint>
與開啟的 DRM 檔案描述符相關的唯一值,用於區分重複和共享的檔案描述符。 從概念上講,該值應 1:1 對映到 struct drm_file 例項的核心表示形式。
該值的唯一性應是全域性唯一的,或者在每個裝置的範圍內是唯一的,在這種情況下,也應存在 drm-pdev。
使用者空間應確保透過使用上述描述的標準將資料與各個客戶端相關聯,從而避免重複計算任何使用統計資訊。
drm-client-name: <valstr>
使用者空間使用 DRM_IOCTL_SET_CLIENT_NAME 可選設定的字串。
利用率¶
drm-engine-<keystr>: <uint> ns
GPU 通常包含多個執行引擎。 每個引擎都應具有穩定且唯一的名稱 (keystr),可能的值記錄在驅動程式特定的文件中。
該值應為指定的時間單位,即相應的 GPU 引擎花費的時間,忙於執行屬於此客戶端的工作負載。
如果這使驅動程式的實現更容易,則不需要這些值始終是單調的,但是需要在合理的時間段內趕上先前報告的更大值。 在觀察到小於先前讀取的值時,使用者空間應保持該更大的先前值,直到看到單調更新。
drm-engine-capacity-<keystr>: <uint>
引擎識別符號字串必須與 drm-engine-<keystr> 標籤中指定的字串相同,並且如果匯出的引擎對應於一組相同的硬體引擎,則應包含大於零的數字。
如果缺少此標籤,則解析器應假定容量為 1。 不允許零容量。
drm-cycles-<keystr>: <uint>
引擎識別符號字串必須與 drm-engine-<keystr> 標籤中指定的字串相同,並且應包含給定引擎的繁忙週期數。
如果這使驅動程式的實現更容易,則不需要這些值始終是單調的,但是需要在合理的時間段內趕上先前報告的更大值。 在觀察到小於先前讀取的值時,使用者空間應保持該更大的先前值,直到看到單調更新。
drm-total-cycles-<keystr>: <uint>
引擎識別符號字串必須與 drm-cycles-<keystr> 標籤中指定的字串相同,並且應包含給定引擎的總週期數。
這是一個 GPU 未指定單元中的時間戳,它與 drm-cycles-<keystr> 的更新速率匹配。 對於實現此介面的驅動程式,引擎利用率可以完全在 GPU 時鐘域上計算,而無需考慮 2 個樣本之間的 CPU 休眠時間。
驅動程式可以實現此鍵或 drm-maxfreq-<keystr>,但不能同時實現兩者。
drm-maxfreq-<keystr>: <uint> [Hz|MHz|KHz]
引擎識別符號字串必須與 drm-engine-<keystr> 標籤中指定的字串相同,並且應包含給定引擎的最大頻率。 將其與 drm-cycles-<keystr> 結合使用,可以計算引擎的百分比利用率,而 drm-engine-<keystr> 僅反映活動時間,而不考慮引擎以其最大頻率的百分比執行的頻率。
驅動程式可以實現此鍵或 drm-total-cycles-<keystr>,但不能同時實現兩者。
記憶體¶
每個可能的記憶體型別,GPU 可以使用該記憶體型別來儲存緩衝區物件,都應具有一個穩定且唯一的名稱,該名稱用作 "<region>" 字串。
區域名稱 "memory" 保留用於指代正常系統記憶體。
該值應反映屬於此客戶端的緩衝區物件在相應記憶體區域中當前消耗的儲存量。
預設單位應為位元組,可選單位說明符為 "KiB" 或 "MiB",表示千位元組或兆位元組。
drm-total-<region>: <uint> [KiB|MiB]
所有請求的緩衝區(包括共享和私有記憶體)的總大小。緩衝區的後備儲存不需要當前例項化才能在此類別下計數。為避免重複計數,如果緩衝區有多個可以分配到的區域,則實現應始終選擇單個區域進行核算。
drm-shared-<region>: <uint> [KiB|MiB]
與其他檔案共享(即,具有多個控制代碼)的緩衝區的總大小。適用於 drm-total-<region> 的避免重複計數的相同要求也適用於此處。
drm-resident-<region>: <uint> [KiB|MiB]
駐留在指定區域中的緩衝區(即,具有其後備儲存存在或已例項化)的總大小。
drm-memory-<region>: <uint> [KiB|MiB]
此鍵已棄用,僅由 amdgpu 列印; 它是 drm-resident-<region> 的別名。
drm-purgeable-<region>: <uint> [KiB|MiB]
駐留且可清除的緩衝區的總大小。
例如,實現類似於“madvise”功能的驅動程式可以計算具有例項化後備儲存但已標記為 MADV_DONTNEED 等效項的緩衝區。
drm-active-<region>: <uint> [KiB|MiB]
在一個或多個引擎上處於活動狀態的緩衝區的總大小。
一個實際示例可能是 GEM 緩衝區預留物件中存在未發出訊號的柵欄。 因此,活動類別是駐留類別的子集。
實現細節¶
驅動程式應在其 struct file_operations 中使用 drm_show_fdinfo(),並且如果希望提供任何 drm_show_fdinfo() 未提供的統計資訊,則實現 &drm_driver.show_fdinfo。 但是,即使是驅動程式特定的統計資訊也應在上面記錄,並在可能的情況下與其他驅動程式對齊。