CVE-2026-98386: scsi: qla2xxx: Use memset_io() to clear QLAFX00 request ring slot
In the Linux kernel, the following vulnerability has been resolved:
scsi: qla2xxx: Use memsetio() to clear QLAFX00 request ring slot
For QLAFX00 the request ring is ioremapped device I/O memory (ha->iobase + reqqueoff), not DMA-coherent RAM, which is why the rest of the FX00 path accesses it through memcpytoio() and the wrtreg helpers. qla2x00allociocbs() however zeroed the producer slot with a plain memset(). On architectures such as ARM64 a regular memset() may emit unaligned or block-zeroing instructions (e.g. DC ZVA) that are invalid on Device memory, leading to a synchronous external abort.
Use memsetio() to clear the slot for QLAFX00, matching the I/O accessors used elsewhere on this ring. Other adapters keep the plain memset() on their DMA-coherent rings. The zero-fill is retained for FX00 because its IOCB builders (e.g. qlafx00fxdisciocb()) copy only part of the entry and rely on the unused tail being pre-zeroed.
Affected Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Compensating control
For QLAFX00, replace the plain memset() used to clear the request ring slot with memset_io(), because the request ring is ioremapped Device memory; retain the existing zero-fill behavior for FX00.
Event History
Frequently Asked Questions
Which systems are affected by this issue?
The issue is specific to QLAFX00 adapters, whose request ring is mapped as device I/O memory. Other adapters use DMA-coherent request rings and retain the existing plain memset() behavior.
What conditions can trigger the failure?
The failure can occur when the driver clears a QLAFX00 request-ring producer slot with a normal memset() on architectures where memset() emits operations that are invalid for Device memory, such as ARM64. This can cause a synchronous external abort.
Is the zeroing operation safe to remove as a workaround?
No. QLAFX00 IOCB builders may populate only part of an entry and rely on the unused portion having been zero-filled. The required mitigation is to use an I/O-memory-safe clearing operation, memset_io(), rather than removing the zero-fill.