In the Linux kernel, the following vulnerability has been resolved:
scsi: ufs: core: Fix deadlock during RTC update
There is a deadlock when runtime suspend waits for the flush of RTC work, and the RTC work calls ufshcdrpmget_sync() to wait for runtime resume.
Here is deadlock backtrace:
kworker/0:1 D 4892.876354 10 10971 4859 0x4208060 0x8 10 0 120 670730152367 ptr f0ffff80c2e40000 0 1 0x00000001 0x000000ff 0x000000ff 0x000000ff <ffffffee5e71ddb0> _switchto+0x1a8/0x2d4 <ffffffee5e71e604> _schedule+0x684/0xa98 <ffffffee5e71ea60> schedule+0x48/0xc8 <ffffffee5e725f78> scheduletimeout+0x48/0x170 <ffffffee5e71fb74> dowaitforcommon+0x108/0x1b0 <ffffffee5e71efe0> waitforcompletion+0x44/0x60 <ffffffee5d6de968> _flushwork+0x39c/0x424 <ffffffee5d6decc0> _cancelworksync+0xd8/0x208 <ffffffee5d6dee2c> canceldelayedworksync+0x14/0x28 <ffffffee5e2551b8> _ufshcdwlsuspend+0x19c/0x480 <ffffffee5e255fb8> ufshcdwlruntimesuspend+0x3c/0x1d4 <ffffffee5dffd80c> scsiruntimesuspend+0x78/0xc8 <ffffffee5df93580> _rpmcallback+0x94/0x3e0 <ffffffee5df90b0c> rpmsuspend+0x2d4/0x65c <ffffffee5df91448> _pmruntimesuspend+0x80/0x114 <ffffffee5dffd95c> scsiruntimeidle+0x38/0x6c <ffffffee5df912f4> rpmidle+0x264/0x338 <ffffffee5df90f14> _pmruntimeidle+0x80/0x110 <ffffffee5e24ce44> ufshcdrtcwork+0x128/0x1e4 <ffffffee5d6e3a40> processonework+0x26c/0x650 <ffffffee5d6e65c8> workerthread+0x260/0x3d8 <ffffffee5d6edec8> kthread+0x110/0x134 <ffffffee5d616b18> retfromfork+0x10/0x20
Skip updating RTC if RPM state is not RPM_ACTIVE.