block: add a helper function to merge the segments
authorYoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
Wed, 28 Aug 2019 12:35:42 +0000 (21:35 +0900)
committerChristoph Hellwig <hch@lst.de>
Tue, 3 Sep 2019 06:32:50 +0000 (08:32 +0200)
This patch adds a helper function whether a queue can merge
the segments by the DMA MAP layer (e.g. via IOMMU).

Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Simon Horman <horms+renesas@verge.net.au
Signed-off-by: Christoph Hellwig <hch@lst.de>
block/blk-settings.c
include/linux/blkdev.h

index 2c1831207a8f74de455679551f79d8862450eed0..c3632fc6d54046566dad6a74835c99fdfb8be6ff 100644 (file)
@@ -12,6 +12,7 @@
 #include <linux/lcm.h>
 #include <linux/jiffies.h>
 #include <linux/gfp.h>
+#include <linux/dma-mapping.h>
 
 #include "blk.h"
 #include "blk-wbt.h"
@@ -832,6 +833,28 @@ void blk_queue_write_cache(struct request_queue *q, bool wc, bool fua)
 }
 EXPORT_SYMBOL_GPL(blk_queue_write_cache);
 
+/**
+ * blk_queue_can_use_dma_map_merging - configure queue for merging segments.
+ * @q:         the request queue for the device
+ * @dev:       the device pointer for dma
+ *
+ * Tell the block layer about merging the segments by dma map of @q.
+ */
+bool blk_queue_can_use_dma_map_merging(struct request_queue *q,
+                                      struct device *dev)
+{
+       unsigned long boundary = dma_get_merge_boundary(dev);
+
+       if (!boundary)
+               return false;
+
+       /* No need to update max_segment_size. see blk_queue_virt_boundary() */
+       blk_queue_virt_boundary(q, boundary);
+
+       return true;
+}
+EXPORT_SYMBOL_GPL(blk_queue_can_use_dma_map_merging);
+
 static int __init blk_settings_init(void)
 {
        blk_max_low_pfn = max_low_pfn - 1;
index 1ef375dafb1c12a5963aff7795a889b1a30afd5f..f6d55e2490dcf610988b174e751c20447cf3492d 100644 (file)
@@ -1085,6 +1085,8 @@ extern void blk_queue_dma_alignment(struct request_queue *, int);
 extern void blk_queue_update_dma_alignment(struct request_queue *, int);
 extern void blk_queue_rq_timeout(struct request_queue *, unsigned int);
 extern void blk_queue_write_cache(struct request_queue *q, bool enabled, bool fua);
+extern bool blk_queue_can_use_dma_map_merging(struct request_queue *q,
+                                             struct device *dev);
 
 /*
  * Number of physical segments as sent to the device.