--- /dev/null
+From 21d25f6a4217e755906cb548b55ddab39d0e88b9 Mon Sep 17 00:00:00 2001
+From: Krister Johansen <kjlx@templeofstupid.com>
+Date: Wed, 4 Jan 2017 01:22:52 -0800
+Subject: dmaengine: iota: ioat_alloc_chan_resources should not perform sleeping allocations.
+
+From: Krister Johansen <kjlx@templeofstupid.com>
+
+commit 21d25f6a4217e755906cb548b55ddab39d0e88b9 upstream.
+
+On a kernel with DEBUG_LOCKS, ioat_free_chan_resources triggers an
+in_interrupt() warning. With PROVE_LOCKING, it reports detecting a
+SOFTIRQ-safe to SOFTIRQ-unsafe lock ordering in the same code path.
+
+This is because dma_generic_alloc_coherent() checks if the GFP flags
+permit blocking. It allocates from different subsystems if blocking is
+permitted. The free path knows how to return the memory to the correct
+allocator. If GFP_KERNEL is specified then the alloc and free end up
+going through cma_alloc(), which uses mutexes.
+
+Given that ioat_free_chan_resources() can be called in interrupt
+context, ioat_alloc_chan_resources() must specify GFP_NOWAIT so that the
+allocations do not block and instead use an allocator that uses
+spinlocks.
+
+Signed-off-by: Krister Johansen <kjlx@templeofstupid.com>
+Acked-by: Dave Jiang <dave.jiang@intel.com>
+Signed-off-by: Vinod Koul <vinod.koul@intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/dma/ioat/init.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/drivers/dma/ioat/init.c
++++ b/drivers/dma/ioat/init.c
+@@ -691,7 +691,7 @@ static int ioat_alloc_chan_resources(str
+ /* doing 2 32bit writes to mmio since 1 64b write doesn't work */
+ ioat_chan->completion =
+ dma_pool_zalloc(ioat_chan->ioat_dma->completion_pool,
+- GFP_KERNEL, &ioat_chan->completion_dma);
++ GFP_NOWAIT, &ioat_chan->completion_dma);
+ if (!ioat_chan->completion)
+ return -ENOMEM;
+
+@@ -701,7 +701,7 @@ static int ioat_alloc_chan_resources(str
+ ioat_chan->reg_base + IOAT_CHANCMP_OFFSET_HIGH);
+
+ order = IOAT_MAX_ORDER;
+- ring = ioat_alloc_ring(c, order, GFP_KERNEL);
++ ring = ioat_alloc_ring(c, order, GFP_NOWAIT);
+ if (!ring)
+ return -ENOMEM;
+