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