Lines Matching +full:entry +full:- +full:latency
1 // SPDX-License-Identifier: GPL-2.0-only
11 #include <linux/dma-mapping.h>
31 __u64 avg_map_100ns; /* average map latency in 100ns */
32 __u64 map_stddev; /* standard deviation of map latency */
62 int npages = map->bparam.granule; in map_benchmark_thread()
68 return -ENOMEM; in map_benchmark_thread()
76 * for a non-coherent device, if we don't stain them in the in map_benchmark_thread()
77 * cache, this will give an underestimate of the real-world in map_benchmark_thread()
81 if (map->dir != DMA_FROM_DEVICE) in map_benchmark_thread()
85 dma_addr = dma_map_single(map->dev, buf, size, map->dir); in map_benchmark_thread()
86 if (unlikely(dma_mapping_error(map->dev, dma_addr))) { in map_benchmark_thread()
88 dev_name(map->dev)); in map_benchmark_thread()
89 ret = -ENOMEM; in map_benchmark_thread()
96 ndelay(map->bparam.dma_trans_ns); in map_benchmark_thread()
99 dma_unmap_single(map->dev, dma_addr, size, map->dir); in map_benchmark_thread()
110 atomic64_add(map_100ns, &map->sum_map_100ns); in map_benchmark_thread()
111 atomic64_add(unmap_100ns, &map->sum_unmap_100ns); in map_benchmark_thread()
112 atomic64_add(map_sq, &map->sum_sq_map); in map_benchmark_thread()
113 atomic64_add(unmap_sq, &map->sum_sq_unmap); in map_benchmark_thread()
114 atomic64_inc(&map->loops); in map_benchmark_thread()
125 int threads = map->bparam.threads; in do_map_benchmark()
126 int node = map->bparam.node; in do_map_benchmark()
134 return -ENOMEM; in do_map_benchmark()
136 get_device(map->dev); in do_map_benchmark()
140 map->bparam.node, "dma-map-benchmark/%d", i); in do_map_benchmark()
152 atomic64_set(&map->sum_map_100ns, 0); in do_map_benchmark()
153 atomic64_set(&map->sum_unmap_100ns, 0); in do_map_benchmark()
154 atomic64_set(&map->sum_sq_map, 0); in do_map_benchmark()
155 atomic64_set(&map->sum_sq_unmap, 0); in do_map_benchmark()
156 atomic64_set(&map->loops, 0); in do_map_benchmark()
163 msleep_interruptible(map->bparam.seconds * 1000); in do_map_benchmark()
172 loops = atomic64_read(&map->loops); in do_map_benchmark()
175 u64 sum_map = atomic64_read(&map->sum_map_100ns); in do_map_benchmark()
176 u64 sum_unmap = atomic64_read(&map->sum_unmap_100ns); in do_map_benchmark()
177 u64 sum_sq_map = atomic64_read(&map->sum_sq_map); in do_map_benchmark()
178 u64 sum_sq_unmap = atomic64_read(&map->sum_sq_unmap); in do_map_benchmark()
180 /* average latency */ in do_map_benchmark()
181 map->bparam.avg_map_100ns = div64_u64(sum_map, loops); in do_map_benchmark()
182 map->bparam.avg_unmap_100ns = div64_u64(sum_unmap, loops); in do_map_benchmark()
184 /* standard deviation of latency */ in do_map_benchmark()
185 map_variance = div64_u64(sum_sq_map, loops) - in do_map_benchmark()
186 map->bparam.avg_map_100ns * in do_map_benchmark()
187 map->bparam.avg_map_100ns; in do_map_benchmark()
188 unmap_variance = div64_u64(sum_sq_unmap, loops) - in do_map_benchmark()
189 map->bparam.avg_unmap_100ns * in do_map_benchmark()
190 map->bparam.avg_unmap_100ns; in do_map_benchmark()
191 map->bparam.map_stddev = int_sqrt64(map_variance); in do_map_benchmark()
192 map->bparam.unmap_stddev = int_sqrt64(unmap_variance); in do_map_benchmark()
198 put_device(map->dev); in do_map_benchmark()
206 struct map_benchmark_data *map = file->private_data; in map_benchmark_ioctl()
211 if (copy_from_user(&map->bparam, argp, sizeof(map->bparam))) in map_benchmark_ioctl()
212 return -EFAULT; in map_benchmark_ioctl()
216 if (map->bparam.threads == 0 || in map_benchmark_ioctl()
217 map->bparam.threads > DMA_MAP_MAX_THREADS) { in map_benchmark_ioctl()
219 return -EINVAL; in map_benchmark_ioctl()
222 if (map->bparam.seconds == 0 || in map_benchmark_ioctl()
223 map->bparam.seconds > DMA_MAP_MAX_SECONDS) { in map_benchmark_ioctl()
225 return -EINVAL; in map_benchmark_ioctl()
228 if (map->bparam.dma_trans_ns > DMA_MAP_MAX_TRANS_DELAY) { in map_benchmark_ioctl()
230 return -EINVAL; in map_benchmark_ioctl()
233 if (map->bparam.node != NUMA_NO_NODE && in map_benchmark_ioctl()
234 !node_possible(map->bparam.node)) { in map_benchmark_ioctl()
236 return -EINVAL; in map_benchmark_ioctl()
239 if (map->bparam.granule < 1 || map->bparam.granule > 1024) { in map_benchmark_ioctl()
241 return -EINVAL; in map_benchmark_ioctl()
244 switch (map->bparam.dma_dir) { in map_benchmark_ioctl()
246 map->dir = DMA_BIDIRECTIONAL; in map_benchmark_ioctl()
249 map->dir = DMA_FROM_DEVICE; in map_benchmark_ioctl()
252 map->dir = DMA_TO_DEVICE; in map_benchmark_ioctl()
256 return -EINVAL; in map_benchmark_ioctl()
259 old_dma_mask = dma_get_mask(map->dev); in map_benchmark_ioctl()
261 ret = dma_set_mask(map->dev, in map_benchmark_ioctl()
262 DMA_BIT_MASK(map->bparam.dma_bits)); in map_benchmark_ioctl()
265 dev_name(map->dev)); in map_benchmark_ioctl()
266 return -EINVAL; in map_benchmark_ioctl()
277 dma_set_mask(map->dev, old_dma_mask); in map_benchmark_ioctl()
280 return -EINVAL; in map_benchmark_ioctl()
283 if (copy_to_user(argp, &map->bparam, sizeof(map->bparam))) in map_benchmark_ioctl()
284 return -EFAULT; in map_benchmark_ioctl()
298 debugfs_remove(map->debugfs); in map_benchmark_remove_debugfs()
303 struct dentry *entry; in __map_benchmark_probe() local
309 return -ENOMEM; in __map_benchmark_probe()
310 map->dev = dev; in __map_benchmark_probe()
322 entry = debugfs_create_file("dma_map_benchmark", 0600, NULL, map, in __map_benchmark_probe()
324 if (IS_ERR(entry)) in __map_benchmark_probe()
325 return PTR_ERR(entry); in __map_benchmark_probe()
326 map->debugfs = entry; in __map_benchmark_probe()
333 return __map_benchmark_probe(&pdev->dev); in map_benchmark_platform_probe()
346 return __map_benchmark_probe(&pdev->dev); in map_benchmark_pci_probe()