summaryrefslogtreecommitdiff
path: root/rust/kernel/drm/gpuvm/git@git.tavy.me:linux.git
diff options
context:
space:
mode:
authorMingyu Wang <25181214217@stu.xidian.edu.cn>2026-05-12 17:35:34 +0800
committerAndi Shyti <andi.shyti@kernel.org>2026-06-23 17:53:08 +0200
commit10dd1a736d557e310a77117832874729a0175d57 (patch)
tree23aa2fadff3ebed4e5fa8825cc15236fb560bb58 /rust/kernel/drm/gpuvm/git@git.tavy.me:linux.git
parent2e9a7f68329be41792c0b123c28e6c53c2fa2249 (diff)
i2c: i801: fix hardware state machine corruption in error path
A severe livelock and subsequent Hung Task panic were observed in the i2c-i801 driver during concurrent Fuzzing. The crash is caused by an unconditional hardware register cleanup in the error handling path of i801_access(). When i801_check_pre() fails (e.g., returning -EBUSY because the SMBus controller is actively used by BIOS/ACPI), the kernel does not actually acquire the hardware ownership. However, the code jumps to the 'out' label and executes: iowrite8(SMBHSTSTS_INUSE_STS | STATUS_FLAGS, SMBHSTSTS(priv)); This forcefully clears the INUSE_STS lock and resets the hardware status flags without owning the controller. Doing so interrupts ongoing BIOS/ACPI transactions and totally corrupts the SMBus hardware state machine. Consequently, all subsequent i801_access() calls fail at the pre-check stage, triggering an endless stream of "SMBus is busy, can't use it!" error logs. Over a slow serial console, this printk flood monopolizes the CPU (Console Livelock), starving other processes trying to acquire the mmap_lock down_read semaphore, ultimately triggering the hung task watchdog. Fix this by moving the 'out' label below the hardware register cleanup. If i801_check_pre() fails, we safely bypass the iowrite8() and only release the software locks (pm_runtime and mutex), strictly adhering to the rule of not releasing resources that were never acquired. Fixes: 1f760b87e54c ("i2c: i801: Call i801_check_pre() from i801_access()") Signed-off-by: Mingyu Wang <25181214217@stu.xidian.edu.cn> Cc: <stable@vger.kernel.org> # v6.3+ Signed-off-by: Andi Shyti <andi.shyti@kernel.org> Link: https://lore.kernel.org/r/20260512093534.348655-1-w15303746062@163.com
Diffstat (limited to 'rust/kernel/drm/gpuvm/git@git.tavy.me:linux.git')
0 files changed, 0 insertions, 0 deletions