调试¶
Xe ASSERT 断言
虽然 Xe 驱动程序旨在比传统的 i915 驱动程序更简单,但它仍然足够复杂,以至于在添加新功能时引入的一些更改可能会破坏现有代码。
添加 drm_WARN
或 drm_err
来捕获不需要的编程用法可能会导致驱动程序占用空间增加,并可能影响生产驱动程序的性能,因为这些额外的代码将始终存在。
为了允许使用额外的详细调试检查来注释函数,以断言所有先决条件都已满足,而无需担心在生产构建上占用空间或性能损失,因为在代码集成期间引入的所有潜在误用都已修复,我们引入了一系列 Xe 断言宏,这些宏试图遵循经典的 assert() 实用程序
这些宏是在 drm_WARN
的基础上实现的,但与原始宏不同,当提供的条件为 false 时会触发警告。此外,上述所有断言宏都不能在表达式中或作为条件使用,因为底层代码将在非调试版本中被编译掉。
请注意,这些宏并非旨在用于覆盖实现中已知的缺陷;对于这种情况,请使用常规的 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
指针condition
要检查的条件
描述
如果提供的 condition
为 false,xe_assert()
使用 drm_WARN
发出警告并打印可以从 xe
指针读取的附加信息。
与 drm_WARN
相反,xe_assert()
仅在调试版本(必须启用 CONFIG_DRM_XE_DEBUG
)上有效,不能在表达式中或作为条件使用。
有关一般用法指南,请参阅 Xe ASSERT 断言。
-
xe_tile_assert¶
xe_tile_assert (tile, condition)
调试时,如果条件为假则发出警告。
参数
tile
应用
condition
的struct xe_tile
指针condition
要检查的条件
描述
如果提供的 condition
为 false,xe_tile_assert()
使用 drm_WARN
发出警告并打印可以从 tile
指针读取的附加信息。
与 drm_WARN
相反,xe_tile_assert()
仅在调试版本(必须启用 CONFIG_DRM_XE_DEBUG
)上有效,不能在表达式中或作为条件使用。
有关一般用法指南,请参阅 Xe ASSERT 断言。
-
xe_gt_assert¶
xe_gt_assert (gt, condition)
调试时,如果条件为假则发出警告。
参数
gt
应用
condition
的struct xe_gt
指针condition
要检查的条件
描述
如果提供的 condition
为 false,xe_gt_assert()
使用 drm_WARN
发出警告并打印可以安全地从 gt
指针读取的附加信息。
与 drm_WARN
相反,xe_gt_assert()
仅在调试版本(必须启用 CONFIG_DRM_XE_DEBUG
)上有效,不能在表达式中或作为条件使用。
有关一般用法指南,请参阅 Xe ASSERT 断言。