drm/amd/display: Disable migration to ensure consistency of per-CPU variable
authorTianci Yin <tianci.yin@amd.com>
Mon, 6 Feb 2023 07:58:46 +0000 (15:58 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 27 Apr 2023 02:36:53 +0000 (22:36 -0400)
[why]
Since the variable fpu_recursion_depth is per-CPU type, it has one copy
on each CPU, thread migration causes data consistency issue, then the
call trace shows up. And preemption disabling can't prevent migration.

[how]
Disable migration to ensure consistency of fpu_recursion_depth.

Reviewed-by: Aurabindo Pillai <aurabindo.pillai@amd.com>
Signed-off-by: Tianci Yin <tianci.yin@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/amdgpu_dm/dc_fpu.c

index 1743ca0..c42aa94 100644 (file)
@@ -89,6 +89,7 @@ void dc_fpu_begin(const char *function_name, const int line)
 
        if (*pcpu == 1) {
 #if defined(CONFIG_X86)
+               migrate_disable();
                kernel_fpu_begin();
 #elif defined(CONFIG_PPC64)
                if (cpu_has_feature(CPU_FTR_VSX_COMP)) {
@@ -129,6 +130,7 @@ void dc_fpu_end(const char *function_name, const int line)
        if (*pcpu <= 0) {
 #if defined(CONFIG_X86)
                kernel_fpu_end();
+               migrate_enable();
 #elif defined(CONFIG_PPC64)
                if (cpu_has_feature(CPU_FTR_VSX_COMP)) {
                        disable_kernel_vsx();