12.01.2024 14:56, Denis Kirjanov wrote:
On 1/12/24 08:06, Nikita Yushchenko wrote:
dma_mapping_error() depends on getting full 64-bit dma_addr_t and does
not work correctly if 32-bit value is passed instead.
Fix handling of dma_map_single() failures on Rx ring entries:
- do not store return value of dma_map_signle() in 32-bit variable,
- do not use dma_mapping_error() against 32-bit descriptor field when
checking if unmap is needed, check for zero size instead.
Hmm, something is wrong here since you're mixing DMA api and forced 32bit values.
if dma uses 32bit addresses then dma_addr_t need only be 32 bits wide
dma_addr_t is arch-wide type and it is 64bit on arm64
Still, some devices use 32-bit dma addresses.
Proper setting of dma masks and/of configuring iommu ensures that in no error case, dma address fits
into 32 bits.
Still, in error case dma_map_single() returns ~((dma_addr_t)0) which uses fill dma_addr_t width and gets
corrupted if assigned to 32-bit value, then later call to dma_mapping_error() does not recognize it. The
patch fixes exactly this issue.