除錯¶
Xe 斷言
雖然 Xe 驅動程式的目標是比舊的 i915 驅動程式更簡單,但它仍然足夠複雜,以至於在新增新功能時引入的一些更改可能會破壞現有程式碼。
新增 drm_WARN 或 drm_err 來捕獲不需要的程式設計使用可能會導致驅動程式佔用空間增加,並可能影響生產驅動程式的效能,因為此附加程式碼將始終存在。
為了允許使用額外的詳細除錯檢查來註釋函式,以斷言所有先決條件都已滿足,而不必擔心佔用空間或生產構建的效能損失(其中在程式碼整合期間引入的所有潛在誤用都已修復),我們引入了 Xe 斷言宏系列,該系列嘗試遵循經典的 assert() 實用程式
這些宏是在 drm_WARN 之上實現的,但與源不同的是,當提供的條件為假時會觸發警告。 此外,所有上述斷言宏都不能在表示式中或作為條件使用,因為底層程式碼將在非除錯版本中編譯出來。
請注意,這些宏不適用於涵蓋實現中的已知差距; 對於此類情況,請使用常規 drm_WARN 或 drm_err 並提供有效的安全回退。
此外,在效能或佔用空間不是問題的情況下,開發人員應繼續使用常規 drm_WARN 或 drm_err,以確保來自生產版本的錯誤報告將包含有意義的診斷資料。
以下程式碼顯示了斷言如何幫助除錯以捕獲計劃外的使用
static void one_igfx(struct xe_device *xe)
{
xe_assert(xe, xe->info.is_dgfx == false);
xe_assert(xe, xe->info.tile_count == 1);
}
static void two_dgfx(struct xe_device *xe)
{
xe_assert(xe, xe->info.is_dgfx);
xe_assert(xe, xe->info.tile_count == 2);
}
void foo(struct xe_device *xe)
{
if (xe->info.dgfx)
return two_dgfx(xe);
return one_igfx(xe);
}
void bar(struct xe_device *xe)
{
if (drm_WARN_ON(xe->drm, xe->info.tile_count > 2))
return;
if (xe->info.tile_count == 2)
return two_dgfx(xe);
return one_igfx(xe);
}
-
xe_assert¶
xe_assert (xe, condition)
如果除錯時條件為假,則發出警告。
引數
xe應用
condition的struct xe_device指標條件要檢查的條件
描述
xe_assert() 使用 drm_WARN 發出警告並列印可以從 xe 指標讀取的附加資訊(如果提供的 condition 為假)。
與 drm_WARN 相反,xe_assert() 僅在除錯版本中有效(必須啟用 CONFIG_DRM_XE_DEBUG),並且不能在表示式中或作為條件使用。
有關一般使用指南,請參見 Xe 斷言。
-
xe_tile_assert¶
xe_tile_assert (tile, condition)
如果除錯時條件為假,則發出警告。
引數
tile應用
condition的struct xe_tile指標條件要檢查的條件
描述
xe_tile_assert() 使用 drm_WARN 發出警告並列印可以從 tile 指標讀取的附加資訊(如果提供的 condition 為假)。
與 drm_WARN 相反,xe_tile_assert() 僅在除錯版本中有效(必須啟用 CONFIG_DRM_XE_DEBUG),並且不能在表示式中或作為條件使用。
有關一般使用指南,請參見 Xe 斷言。
-
xe_gt_assert¶
xe_gt_assert (gt, condition)
如果除錯時條件為假,則發出警告。
引數
gt應用
condition的struct xe_gt指標條件要檢查的條件
描述
xe_gt_assert() 使用 drm_WARN 發出警告並列印可以從 gt 指標安全讀取的附加資訊(如果提供的 condition 為假)。
與 drm_WARN 相反,xe_gt_assert() 僅在除錯版本中有效(必須啟用 CONFIG_DRM_XE_DEBUG),並且不能在表示式中或作為條件使用。
有關一般使用指南,請參見 Xe 斷言。