Merge remote-tracking branch 'torvalds/master' into perf/core
[sfrench/cifs-2.6.git] / kernel / dma / map_benchmark.c
index da95df381483336aa440fe930e3bdf80e05a9d3a..e0e64f8b07393dc183dd7aea1a626ff6a4f9a2f8 100644 (file)
@@ -21,6 +21,7 @@
 #define DMA_MAP_BENCHMARK      _IOWR('d', 1, struct map_benchmark)
 #define DMA_MAP_MAX_THREADS    1024
 #define DMA_MAP_MAX_SECONDS    300
+#define DMA_MAP_MAX_TRANS_DELAY        (10 * NSEC_PER_MSEC)
 
 #define DMA_MAP_BIDIRECTIONAL  0
 #define DMA_MAP_TO_DEVICE      1
@@ -36,7 +37,8 @@ struct map_benchmark {
        __s32 node; /* which numa node this benchmark will run on */
        __u32 dma_bits; /* DMA addressing capability */
        __u32 dma_dir; /* DMA data direction */
-       __u8 expansion[84];     /* For future use */
+       __u32 dma_trans_ns; /* time for DMA transmission in ns */
+       __u8 expansion[80];     /* For future use */
 };
 
 struct map_benchmark_data {
@@ -87,6 +89,9 @@ static int map_benchmark_thread(void *data)
                map_etime = ktime_get();
                map_delta = ktime_sub(map_etime, map_stime);
 
+               /* Pretend DMA is transmitting */
+               ndelay(map->bparam.dma_trans_ns);
+
                unmap_stime = ktime_get();
                dma_unmap_single(map->dev, dma_addr, PAGE_SIZE, map->dir);
                unmap_etime = ktime_get();
@@ -218,6 +223,11 @@ static long map_benchmark_ioctl(struct file *file, unsigned int cmd,
                        return -EINVAL;
                }
 
+               if (map->bparam.dma_trans_ns > DMA_MAP_MAX_TRANS_DELAY) {
+                       pr_err("invalid transmission delay\n");
+                       return -EINVAL;
+               }
+
                if (map->bparam.node != NUMA_NO_NODE &&
                    !node_possible(map->bparam.node)) {
                        pr_err("invalid numa node\n");