On 09/07/20 17:51, Li Qiang wrote: > Maybe we should check whether the address is a RAM address in 'dma_memory_rw'? > But it is a hot path. I'm not sure it is right. Hope more discussion.
Half of the purpose of dma-helpers.c (as opposed to address_space_* functions in exec.c) is exactly to support writes to MMIO. This is especially true of dma_blk_io, which takes care of doing the DMA via a bounce buffer, possibly in multiple steps and even blocking due to cpu_register_map_client. For dma_memory_rw this is not needed, so it only needs to handle QEMUSGList, but I think the design should be the same. However, this is indeed a nightmare for re-entrancy. The easiest solution is to delay processing of descriptors to a bottom half whenever MMIO is doing something complicated. This is also better for latency because it will free the vCPU thread more quickly and leave the work to the I/O thread. Paolo