52555e5d7dc048d79223189c246f3f15fac51f70
While investigating MLK-18894 ran a large number of suspend iterations on imx6qp-sdb with rc2 kernel. After ~6 hours it hung while suspending devices and sysrq-T showed the following trace for rtcwake: The gckHARDWARE_SetPowerManagementState function seems hung waiting for gckHARDWARE_QueryIdle. Inside the gckHARDWARE_QueryIdle there is a check which looks like this: rtcwake D 0 7090 561 0x00000001 [<809d5fc8>] (__schedule) from [<809d6380>] (schedule+0x48/0xb0) [<809d6380>] (schedule) from [<809d9d3c>] (schedule_hrtimeout_range_clock+0xc8/0x13c) [<809d9d3c>] (schedule_hrtimeout_range_clock) from [<809d9df0>] (schedule_hrtimeout+0x20/0x28) [<809d9df0>] (schedule_hrtimeout) from [<807168c4>] (gckOS_Delay.part.3+0x64/0x6c) [<807168c4>] (gckOS_Delay.part.3) from [<8071813c>] (gckOS_Delay+0x18/0x20) [<8071813c>] (gckOS_Delay) from [<8073f08c>] (gckHARDWARE_SetPowerManagementState+0x838/0xb70) [<8073f08c>] (gckHARDWARE_SetPowerManagementState) from [<8071df18>] (gpu_suspend+0x74/0xe4) [<8071df18>] (gpu_suspend) from [<804fb9e8>] (dpm_run_callback+0x3c/0xdc) /* Test if address is inside the last WAIT/LINK sequence. */ if ((address >= Hardware->lastWaitLink) && (address <= Hardware->lastWaitLink + 16) Stepping through using the debugger (screenshot attached) this function seems to return non-idle with both address lastWaitLink and being equal to 0xFFFFFFF0. As far as I can tell the intention seems to be that the check should pass but 0xFFFFFFF0 + 16 overflows back to zero so the second part of the check fails because 0xFFFFFFF0 is not less than or equal to 0. Adding some prints to GPU code it seems that it's normal for these values to be >0xFFFFe000. When they (randomly) hit 0xFFFFFFF0 exactly the idle check will incorrectly fail and suspend will hang. Actually, it is wrong when address reach to Hardware->lastWaitLink + 16, because the address shall be either Hardware->lastWaitLink(wait command) or Hardware->lastWaitLink + 8 (link command). Fix the end address offset with 8 or 16 (extra 8 bytes for L2 flush). Signed-off-by: Xianzhong <xianzhong.li@nxp.com>
…
Linux kernel ============ This file was moved to Documentation/admin-guide/README.rst Please notice that there are several guides for kernel developers and users. These guides can be rendered in a number of formats, like HTML and PDF. In order to build the documentation, use ``make htmldocs`` or ``make pdfdocs``. There are various text files in the Documentation/ subdirectory, several of them using the Restructured Text markup notation. See Documentation/00-INDEX for a list of what is contained in each file. Please read the Documentation/process/changes.rst file, as it contains the requirements for building and running the kernel, and information about the problems which may result by upgrading your kernel.
Description
Languages
C
97.2%
Assembly
2.2%
Makefile
0.3%
Perl
0.1%