On 01/10/2019 07:07 AM, Christoph Hellwig wrote: > On Wed, Jan 09, 2019 at 06:58:56PM -0800, Tyrel Datwyler wrote: >> While mapping DMA for scatter list when a scsi command is queued the >> existing call to dma_alloc_coherent() in our map_sg_data() function >> passes zero for the gfp_flags parameter. We are most definitly in atomic >> context at this point as queue_command() is called in softirq context >> and further we have a spinlock holding the scsi host lock. >> >> Fix this by passing GFP_ATOMIC to dma_alloc_coherent() to prevent any >> sort of sleeping in atomic context deadlock. > > This is a pretty clear sign you should not be using dma_alloc_coherent > to start with. GFP_ATOMIC support in many of the implementations either > doesn't work at all or is severly constrained. On a secondary note I was unaware of the GFP_ATOMIC limitations. Should this be added to the documentation somewhere? I don't see any mention here form DMA-API-HOWTO.txt. Using Consistent DMA mappings ============================= To allocate and map large (PAGE_SIZE or so) consistent DMA regions, you should do:: dma_addr_t dma_handle; cpu_addr = dma_alloc_coherent(dev, size, &dma_handle, gfp); where device is a ``struct device *``. This may be called in interrupt context with the GFP_ATOMIC flag. -Tyrel Given that the > descriptor is written by the OS and read by the hardware exactly once > there is no point in having the coherent mapping to start with. >