调试¶
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 断言。