]> rtime.felk.cvut.cz Git - zynq/linux.git/commitdiff
staging: apf: Eliminate unnecessary flushing on SG-DMA transfers
authorMichael Gill <michael.gill@xilinx.com>
Wed, 28 Sep 2016 23:53:46 +0000 (16:53 -0700)
committerMichal Simek <michal.simek@xilinx.com>
Thu, 13 Oct 2016 12:09:03 +0000 (14:09 +0200)
There was a bug introduced when introducing threading that may
cause transfers that do not require cache flushing to trigger
flushing unnecessarily.  This does not impact correctness,
but will improve performance.

Signed-off-by: Michael Gill <gill@xilinx.com>
Signed-off-by: Michal Simek <michal.simek@xilinx.com>
drivers/staging/apf/xilinx-dma-apf.c

index 0a7729c563a38bc0a4e260ae800e77635f0d6608..25c77aa337bb38ab5fc23c717e16e8de10d54586 100644 (file)
@@ -818,6 +818,10 @@ int xdma_submit(struct xdma_chan *chan,
        dmahead->dmadir = chan->direction;
        dmahead->userflag = user_flags;
        dmadir = chan->direction;
+
+       if (!(user_flags & CF_FLAG_CACHE_FLUSH_INVALIDATE))
+               dma_set_attr(DMA_ATTR_SKIP_CPU_SYNC, &attrs);
+
        if (dp) {
                if (!dp->is_mapped) {
                        struct scatterlist *sg;
@@ -891,8 +895,6 @@ int xdma_submit(struct xdma_chan *chan,
                        pr_err("pin_user_pages failed\n");
                        return status;
                }
-               if (!(user_flags & CF_FLAG_CACHE_FLUSH_INVALIDATE))
-                       dma_set_attr(DMA_ATTR_SKIP_CPU_SYNC, &attrs);
 
                status = get_dma_ops(chan->dev)->map_sg(chan->dev, sglist,
                                                        sgcnt, dmadir, &attrs);
@@ -963,26 +965,19 @@ int xdma_wait(struct xdma_head *dmahead,
                }
        }
 
+       if (!(user_flags & CF_FLAG_CACHE_FLUSH_INVALIDATE))
+               dma_set_attr(DMA_ATTR_SKIP_CPU_SYNC, &attrs);
+
        if (dmahead->is_dmabuf) {
                dmahead->is_dmabuf = 0;
-       } else if (user_flags & CF_FLAG_PHYSICALLY_CONTIGUOUS) {
-               if (user_flags & CF_FLAG_CACHE_FLUSH_INVALIDATE)
-                       get_dma_ops(chan->dev)->unmap_sg(chan->dev,
-                                                        dmahead->sglist,
-                                                        dmahead->sgcnt,
-                                                        dmahead->dmadir,
-                                                        &attrs);
-       } else  {
-               if (!(user_flags & CF_FLAG_CACHE_FLUSH_INVALIDATE))
-                       dma_set_attr(DMA_ATTR_SKIP_CPU_SYNC, &attrs);
-
+       } else {
                get_dma_ops(chan->dev)->unmap_sg(chan->dev,
                                                 dmahead->sglist,
                                                 dmahead->sgcnt,
                                                 dmahead->dmadir,
                                                 &attrs);
-
-               unpin_user_pages(dmahead->sglist, dmahead->sgcnt);
+               if (!(user_flags & CF_FLAG_PHYSICALLY_CONTIGUOUS))
+                       unpin_user_pages(dmahead->sglist, dmahead->sgcnt);
        }
        return 0;
 }