xref: /aosp_15_r20/external/igt-gpu-tools/tests/i915/gem_pread.c (revision d83cc019efdc2edc6c4b16e9034a3ceb8d35d77c)
1*d83cc019SAndroid Build Coastguard Worker /*
2*d83cc019SAndroid Build Coastguard Worker  * Copyright © 2011 Intel Corporation
3*d83cc019SAndroid Build Coastguard Worker  *
4*d83cc019SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
5*d83cc019SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
6*d83cc019SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
7*d83cc019SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*d83cc019SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
9*d83cc019SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
10*d83cc019SAndroid Build Coastguard Worker  *
11*d83cc019SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the next
12*d83cc019SAndroid Build Coastguard Worker  * paragraph) shall be included in all copies or substantial portions of the
13*d83cc019SAndroid Build Coastguard Worker  * Software.
14*d83cc019SAndroid Build Coastguard Worker  *
15*d83cc019SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*d83cc019SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*d83cc019SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18*d83cc019SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*d83cc019SAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*d83cc019SAndroid Build Coastguard Worker  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21*d83cc019SAndroid Build Coastguard Worker  * IN THE SOFTWARE.
22*d83cc019SAndroid Build Coastguard Worker  *
23*d83cc019SAndroid Build Coastguard Worker  * Authors:
24*d83cc019SAndroid Build Coastguard Worker  *    Chris Wilson <[email protected]>
25*d83cc019SAndroid Build Coastguard Worker  *
26*d83cc019SAndroid Build Coastguard Worker  */
27*d83cc019SAndroid Build Coastguard Worker 
28*d83cc019SAndroid Build Coastguard Worker #include "igt.h"
29*d83cc019SAndroid Build Coastguard Worker #include <unistd.h>
30*d83cc019SAndroid Build Coastguard Worker #include <stdlib.h>
31*d83cc019SAndroid Build Coastguard Worker #include <stdint.h>
32*d83cc019SAndroid Build Coastguard Worker #include <stdio.h>
33*d83cc019SAndroid Build Coastguard Worker #include <string.h>
34*d83cc019SAndroid Build Coastguard Worker #include <fcntl.h>
35*d83cc019SAndroid Build Coastguard Worker #include <inttypes.h>
36*d83cc019SAndroid Build Coastguard Worker #include <errno.h>
37*d83cc019SAndroid Build Coastguard Worker #include <sys/stat.h>
38*d83cc019SAndroid Build Coastguard Worker #include <sys/ioctl.h>
39*d83cc019SAndroid Build Coastguard Worker #include <sys/time.h>
40*d83cc019SAndroid Build Coastguard Worker #include "drm.h"
41*d83cc019SAndroid Build Coastguard Worker 
42*d83cc019SAndroid Build Coastguard Worker #define MiB(x) ((x) * 1024 * 1024)
43*d83cc019SAndroid Build Coastguard Worker 
44*d83cc019SAndroid Build Coastguard Worker typedef void *(*mmap_fn_t)(int, uint32_t, uint64_t, uint64_t, unsigned int);
45*d83cc019SAndroid Build Coastguard Worker 
wrap_gem_mmap__gtt(int i915,uint32_t handle,uint64_t offset,uint64_t length,unsigned int prot)46*d83cc019SAndroid Build Coastguard Worker static void *wrap_gem_mmap__gtt(int i915, uint32_t handle,
47*d83cc019SAndroid Build Coastguard Worker 				uint64_t offset, uint64_t length,
48*d83cc019SAndroid Build Coastguard Worker 				unsigned int prot)
49*d83cc019SAndroid Build Coastguard Worker {
50*d83cc019SAndroid Build Coastguard Worker 	return gem_mmap__gtt(i915, handle, length, prot);
51*d83cc019SAndroid Build Coastguard Worker }
52*d83cc019SAndroid Build Coastguard Worker 
pread_self(int i915)53*d83cc019SAndroid Build Coastguard Worker static void pread_self(int i915)
54*d83cc019SAndroid Build Coastguard Worker {
55*d83cc019SAndroid Build Coastguard Worker 	static const mmap_fn_t mmap_fn[] = {
56*d83cc019SAndroid Build Coastguard Worker 		wrap_gem_mmap__gtt,
57*d83cc019SAndroid Build Coastguard Worker 		gem_mmap__cpu,
58*d83cc019SAndroid Build Coastguard Worker 		gem_mmap__wc,
59*d83cc019SAndroid Build Coastguard Worker 		NULL
60*d83cc019SAndroid Build Coastguard Worker 	};
61*d83cc019SAndroid Build Coastguard Worker 	for (const mmap_fn_t *fn = mmap_fn; *fn; fn++) {
62*d83cc019SAndroid Build Coastguard Worker 		uint32_t handle = gem_create(i915, MiB(4));
63*d83cc019SAndroid Build Coastguard Worker 		void *ptr = (*fn)(i915, handle, 0, MiB(4), PROT_WRITE);
64*d83cc019SAndroid Build Coastguard Worker 
65*d83cc019SAndroid Build Coastguard Worker 		gem_read(i915, handle, 0, ptr + MiB(3), MiB(1));
66*d83cc019SAndroid Build Coastguard Worker 		gem_read(i915, handle, MiB(3), ptr, MiB(1));
67*d83cc019SAndroid Build Coastguard Worker 		gem_read(i915, handle, MiB(1), ptr + MiB(1), MiB(2));
68*d83cc019SAndroid Build Coastguard Worker 
69*d83cc019SAndroid Build Coastguard Worker 		munmap(ptr, MiB(4));
70*d83cc019SAndroid Build Coastguard Worker 		gem_close(i915, handle);
71*d83cc019SAndroid Build Coastguard Worker 	}
72*d83cc019SAndroid Build Coastguard Worker }
73*d83cc019SAndroid Build Coastguard Worker 
74*d83cc019SAndroid Build Coastguard Worker #define OBJECT_SIZE 16384
75*d83cc019SAndroid Build Coastguard Worker #define LARGE_OBJECT_SIZE 1024 * 1024
76*d83cc019SAndroid Build Coastguard Worker #define KGRN "\x1B[32m"
77*d83cc019SAndroid Build Coastguard Worker #define KRED "\x1B[31m"
78*d83cc019SAndroid Build Coastguard Worker #define KNRM "\x1B[0m"
79*d83cc019SAndroid Build Coastguard Worker 
do_gem_read(int fd,uint32_t handle,void * buf,int len,int loops)80*d83cc019SAndroid Build Coastguard Worker static void do_gem_read(int fd, uint32_t handle, void *buf, int len, int loops)
81*d83cc019SAndroid Build Coastguard Worker {
82*d83cc019SAndroid Build Coastguard Worker 	while (loops--)
83*d83cc019SAndroid Build Coastguard Worker 		gem_read(fd, handle, 0, buf, len);
84*d83cc019SAndroid Build Coastguard Worker }
85*d83cc019SAndroid Build Coastguard Worker 
elapsed(const struct timeval * start,const struct timeval * end,int loop)86*d83cc019SAndroid Build Coastguard Worker static double elapsed(const struct timeval *start,
87*d83cc019SAndroid Build Coastguard Worker 		      const struct timeval *end,
88*d83cc019SAndroid Build Coastguard Worker 		      int loop)
89*d83cc019SAndroid Build Coastguard Worker {
90*d83cc019SAndroid Build Coastguard Worker 	return (1e6*(end->tv_sec - start->tv_sec) + (end->tv_usec - start->tv_usec))/loop;
91*d83cc019SAndroid Build Coastguard Worker }
92*d83cc019SAndroid Build Coastguard Worker 
bytes_per_sec(char * buf,double v)93*d83cc019SAndroid Build Coastguard Worker static const char *bytes_per_sec(char *buf, double v)
94*d83cc019SAndroid Build Coastguard Worker {
95*d83cc019SAndroid Build Coastguard Worker 	const char *order[] = {
96*d83cc019SAndroid Build Coastguard Worker 		"",
97*d83cc019SAndroid Build Coastguard Worker 		"KiB",
98*d83cc019SAndroid Build Coastguard Worker 		"MiB",
99*d83cc019SAndroid Build Coastguard Worker 		"GiB",
100*d83cc019SAndroid Build Coastguard Worker 		"TiB",
101*d83cc019SAndroid Build Coastguard Worker 		NULL,
102*d83cc019SAndroid Build Coastguard Worker 	}, **o = order;
103*d83cc019SAndroid Build Coastguard Worker 
104*d83cc019SAndroid Build Coastguard Worker 	while (v > 1000 && o[1]) {
105*d83cc019SAndroid Build Coastguard Worker 		v /= 1000;
106*d83cc019SAndroid Build Coastguard Worker 		o++;
107*d83cc019SAndroid Build Coastguard Worker 	}
108*d83cc019SAndroid Build Coastguard Worker 	sprintf(buf, "%.1f%s/s", v, *o);
109*d83cc019SAndroid Build Coastguard Worker 	return buf;
110*d83cc019SAndroid Build Coastguard Worker }
111*d83cc019SAndroid Build Coastguard Worker 
112*d83cc019SAndroid Build Coastguard Worker 
113*d83cc019SAndroid Build Coastguard Worker uint32_t *src, dst;
114*d83cc019SAndroid Build Coastguard Worker uint32_t *dst_user, src_stolen, large_stolen;
115*d83cc019SAndroid Build Coastguard Worker uint32_t *stolen_pf_user, *stolen_nopf_user;
116*d83cc019SAndroid Build Coastguard Worker int fd, count;
117*d83cc019SAndroid Build Coastguard Worker int object_size = 0;
118*d83cc019SAndroid Build Coastguard Worker 
opt_handler(int opt,int opt_index,void * data)119*d83cc019SAndroid Build Coastguard Worker static int opt_handler(int opt, int opt_index, void *data)
120*d83cc019SAndroid Build Coastguard Worker {
121*d83cc019SAndroid Build Coastguard Worker 	switch (opt) {
122*d83cc019SAndroid Build Coastguard Worker 	case 's':
123*d83cc019SAndroid Build Coastguard Worker 		object_size = atoi(optarg);
124*d83cc019SAndroid Build Coastguard Worker 		break;
125*d83cc019SAndroid Build Coastguard Worker 	default:
126*d83cc019SAndroid Build Coastguard Worker 		return IGT_OPT_HANDLER_ERROR;
127*d83cc019SAndroid Build Coastguard Worker 	}
128*d83cc019SAndroid Build Coastguard Worker 
129*d83cc019SAndroid Build Coastguard Worker 	return IGT_OPT_HANDLER_SUCCESS;
130*d83cc019SAndroid Build Coastguard Worker }
131*d83cc019SAndroid Build Coastguard Worker 
132*d83cc019SAndroid Build Coastguard Worker const char *help_str = "  -s\tObject size in bytes\n";
133*d83cc019SAndroid Build Coastguard Worker 
134*d83cc019SAndroid Build Coastguard Worker igt_main_args("s:", NULL, help_str, opt_handler, NULL)
135*d83cc019SAndroid Build Coastguard Worker {
136*d83cc019SAndroid Build Coastguard Worker 	double usecs;
137*d83cc019SAndroid Build Coastguard Worker 	char buf[100];
138*d83cc019SAndroid Build Coastguard Worker 	const char* bps;
139*d83cc019SAndroid Build Coastguard Worker 	const struct {
140*d83cc019SAndroid Build Coastguard Worker 		int level;
141*d83cc019SAndroid Build Coastguard Worker 		const char *name;
142*d83cc019SAndroid Build Coastguard Worker 	} cache[] = {
143*d83cc019SAndroid Build Coastguard Worker 		{ 0, "uncached" },
144*d83cc019SAndroid Build Coastguard Worker 		{ 1, "snoop" },
145*d83cc019SAndroid Build Coastguard Worker 		{ 2, "display" },
146*d83cc019SAndroid Build Coastguard Worker 		{ -1 },
147*d83cc019SAndroid Build Coastguard Worker 	}, *c;
148*d83cc019SAndroid Build Coastguard Worker 
149*d83cc019SAndroid Build Coastguard Worker 	if (object_size == 0)
150*d83cc019SAndroid Build Coastguard Worker 		object_size = OBJECT_SIZE;
151*d83cc019SAndroid Build Coastguard Worker 	object_size = (object_size + 3) & -4;
152*d83cc019SAndroid Build Coastguard Worker 
153*d83cc019SAndroid Build Coastguard Worker 	igt_fixture {
154*d83cc019SAndroid Build Coastguard Worker 		fd = drm_open_driver(DRIVER_INTEL);
155*d83cc019SAndroid Build Coastguard Worker 
156*d83cc019SAndroid Build Coastguard Worker 		dst = gem_create(fd, object_size);
157*d83cc019SAndroid Build Coastguard Worker 		src = malloc(object_size);
158*d83cc019SAndroid Build Coastguard Worker 		src_stolen = gem_create_stolen(fd, object_size);
159*d83cc019SAndroid Build Coastguard Worker 		dst_user = malloc(object_size);
160*d83cc019SAndroid Build Coastguard Worker 	}
161*d83cc019SAndroid Build Coastguard Worker 
162*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("bench") {
163*d83cc019SAndroid Build Coastguard Worker 		for (count = 1; count <= 1<<17; count <<= 1) {
164*d83cc019SAndroid Build Coastguard Worker 			struct timeval start, end;
165*d83cc019SAndroid Build Coastguard Worker 
166*d83cc019SAndroid Build Coastguard Worker 			gettimeofday(&start, NULL);
167*d83cc019SAndroid Build Coastguard Worker 			do_gem_read(fd, dst, src, object_size, count);
168*d83cc019SAndroid Build Coastguard Worker 			gettimeofday(&end, NULL);
169*d83cc019SAndroid Build Coastguard Worker 			usecs = elapsed(&start, &end, count);
170*d83cc019SAndroid Build Coastguard Worker 			bps = bytes_per_sec(buf, object_size/usecs*1e6);
171*d83cc019SAndroid Build Coastguard Worker 			igt_info("Time to pread %d bytes x %6d:	%7.3fµs, %s\n",
172*d83cc019SAndroid Build Coastguard Worker 				 object_size, count, usecs, bps);
173*d83cc019SAndroid Build Coastguard Worker 			fflush(stdout);
174*d83cc019SAndroid Build Coastguard Worker 		}
175*d83cc019SAndroid Build Coastguard Worker 	}
176*d83cc019SAndroid Build Coastguard Worker 
177*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("self")
178*d83cc019SAndroid Build Coastguard Worker 		pread_self(fd);
179*d83cc019SAndroid Build Coastguard Worker 
180*d83cc019SAndroid Build Coastguard Worker 	for (c = cache; c->level != -1; c++) {
181*d83cc019SAndroid Build Coastguard Worker 		igt_subtest(c->name) {
182*d83cc019SAndroid Build Coastguard Worker 			gem_set_caching(fd, dst, c->level);
183*d83cc019SAndroid Build Coastguard Worker 
184*d83cc019SAndroid Build Coastguard Worker 			for (count = 1; count <= 1<<17; count <<= 1) {
185*d83cc019SAndroid Build Coastguard Worker 				struct timeval start, end;
186*d83cc019SAndroid Build Coastguard Worker 
187*d83cc019SAndroid Build Coastguard Worker 				gettimeofday(&start, NULL);
188*d83cc019SAndroid Build Coastguard Worker 				do_gem_read(fd, dst, src, object_size, count);
189*d83cc019SAndroid Build Coastguard Worker 				gettimeofday(&end, NULL);
190*d83cc019SAndroid Build Coastguard Worker 				usecs = elapsed(&start, &end, count);
191*d83cc019SAndroid Build Coastguard Worker 				bps = bytes_per_sec(buf, object_size/usecs*1e6);
192*d83cc019SAndroid Build Coastguard Worker 				igt_info("Time to %s pread %d bytes x %6d:	%7.3fµs, %s\n",
193*d83cc019SAndroid Build Coastguard Worker 					 c->name, object_size, count, usecs, bps);
194*d83cc019SAndroid Build Coastguard Worker 				fflush(stdout);
195*d83cc019SAndroid Build Coastguard Worker 			}
196*d83cc019SAndroid Build Coastguard Worker 		}
197*d83cc019SAndroid Build Coastguard Worker 	}
198*d83cc019SAndroid Build Coastguard Worker 
199*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("stolen-normal") {
200*d83cc019SAndroid Build Coastguard Worker 		gem_require_stolen_support(fd);
201*d83cc019SAndroid Build Coastguard Worker 		for (count = 1; count <= 1<<17; count <<= 1) {
202*d83cc019SAndroid Build Coastguard Worker 			struct timeval start, end;
203*d83cc019SAndroid Build Coastguard Worker 
204*d83cc019SAndroid Build Coastguard Worker 			gettimeofday(&start, NULL);
205*d83cc019SAndroid Build Coastguard Worker 			do_gem_read(fd, src_stolen, dst_user, object_size, count);
206*d83cc019SAndroid Build Coastguard Worker 			gettimeofday(&end, NULL);
207*d83cc019SAndroid Build Coastguard Worker 			usecs = elapsed(&start, &end, count);
208*d83cc019SAndroid Build Coastguard Worker 			bps = bytes_per_sec(buf, object_size/usecs*1e6);
209*d83cc019SAndroid Build Coastguard Worker 			igt_info("Time to pread %d bytes x %6d:	%7.3fµs, %s\n",
210*d83cc019SAndroid Build Coastguard Worker 				 object_size, count, usecs, bps);
211*d83cc019SAndroid Build Coastguard Worker 			fflush(stdout);
212*d83cc019SAndroid Build Coastguard Worker 		}
213*d83cc019SAndroid Build Coastguard Worker 	}
214*d83cc019SAndroid Build Coastguard Worker 	for (c = cache; c->level != -1; c++) {
215*d83cc019SAndroid Build Coastguard Worker 		igt_subtest_f("stolen-%s", c->name) {
216*d83cc019SAndroid Build Coastguard Worker 			gem_require_stolen_support(fd);
217*d83cc019SAndroid Build Coastguard Worker 			gem_set_caching(fd, src_stolen, c->level);
218*d83cc019SAndroid Build Coastguard Worker 
219*d83cc019SAndroid Build Coastguard Worker 			for (count = 1; count <= 1<<17; count <<= 1) {
220*d83cc019SAndroid Build Coastguard Worker 				struct timeval start, end;
221*d83cc019SAndroid Build Coastguard Worker 
222*d83cc019SAndroid Build Coastguard Worker 				gettimeofday(&start, NULL);
223*d83cc019SAndroid Build Coastguard Worker 				do_gem_read(fd, src_stolen, dst_user,
224*d83cc019SAndroid Build Coastguard Worker 					    object_size, count);
225*d83cc019SAndroid Build Coastguard Worker 				gettimeofday(&end, NULL);
226*d83cc019SAndroid Build Coastguard Worker 				usecs = elapsed(&start, &end, count);
227*d83cc019SAndroid Build Coastguard Worker 				bps = bytes_per_sec(buf, object_size/usecs*1e6);
228*d83cc019SAndroid Build Coastguard Worker 				igt_info("Time to stolen-%s pread %d bytes x %6d:      %7.3fµs, %s\n",
229*d83cc019SAndroid Build Coastguard Worker 					 c->name, object_size, count, usecs, bps);
230*d83cc019SAndroid Build Coastguard Worker 				fflush(stdout);
231*d83cc019SAndroid Build Coastguard Worker 			}
232*d83cc019SAndroid Build Coastguard Worker 		}
233*d83cc019SAndroid Build Coastguard Worker 	}
234*d83cc019SAndroid Build Coastguard Worker 
235*d83cc019SAndroid Build Coastguard Worker 	/* List the time taken in pread operation for stolen objects, with
236*d83cc019SAndroid Build Coastguard Worker 	 * and without the overhead of page fault handling on accessing the
237*d83cc019SAndroid Build Coastguard Worker 	 * user space buffer
238*d83cc019SAndroid Build Coastguard Worker 	 */
239*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("pagefault-pread") {
240*d83cc019SAndroid Build Coastguard Worker 		gem_require_stolen_support(fd);
241*d83cc019SAndroid Build Coastguard Worker 		large_stolen = gem_create_stolen(fd, LARGE_OBJECT_SIZE);
242*d83cc019SAndroid Build Coastguard Worker 		stolen_nopf_user = (uint32_t *) mmap(NULL, LARGE_OBJECT_SIZE,
243*d83cc019SAndroid Build Coastguard Worker 						PROT_WRITE,
244*d83cc019SAndroid Build Coastguard Worker 						MAP_ANONYMOUS|MAP_PRIVATE,
245*d83cc019SAndroid Build Coastguard Worker 						-1, 0);
246*d83cc019SAndroid Build Coastguard Worker 		igt_assert(stolen_nopf_user);
247*d83cc019SAndroid Build Coastguard Worker 
248*d83cc019SAndroid Build Coastguard Worker 		for (count = 1; count <= 10; count ++) {
249*d83cc019SAndroid Build Coastguard Worker 			struct timeval start, end;
250*d83cc019SAndroid Build Coastguard Worker 			double t_elapsed = 0;
251*d83cc019SAndroid Build Coastguard Worker 
252*d83cc019SAndroid Build Coastguard Worker 			gettimeofday(&start, NULL);
253*d83cc019SAndroid Build Coastguard Worker 			do_gem_read(fd, large_stolen, stolen_nopf_user,
254*d83cc019SAndroid Build Coastguard Worker 				    LARGE_OBJECT_SIZE, 1);
255*d83cc019SAndroid Build Coastguard Worker 			gettimeofday(&end, NULL);
256*d83cc019SAndroid Build Coastguard Worker 			t_elapsed = elapsed(&start, &end, count);
257*d83cc019SAndroid Build Coastguard Worker 			bps = bytes_per_sec(buf, object_size/t_elapsed*1e6);
258*d83cc019SAndroid Build Coastguard Worker 			igt_info("Pagefault-N - Time to pread %d bytes: %7.3fµs, %s\n",
259*d83cc019SAndroid Build Coastguard Worker 				 LARGE_OBJECT_SIZE, t_elapsed, bps);
260*d83cc019SAndroid Build Coastguard Worker 
261*d83cc019SAndroid Build Coastguard Worker 			stolen_pf_user = (uint32_t *) mmap(NULL, LARGE_OBJECT_SIZE,
262*d83cc019SAndroid Build Coastguard Worker 						      PROT_WRITE,
263*d83cc019SAndroid Build Coastguard Worker 						      MAP_ANONYMOUS|MAP_PRIVATE,
264*d83cc019SAndroid Build Coastguard Worker 						      -1, 0);
265*d83cc019SAndroid Build Coastguard Worker 			igt_assert(stolen_pf_user);
266*d83cc019SAndroid Build Coastguard Worker 
267*d83cc019SAndroid Build Coastguard Worker 			gettimeofday(&start, NULL);
268*d83cc019SAndroid Build Coastguard Worker 			do_gem_read(fd, large_stolen, stolen_pf_user,
269*d83cc019SAndroid Build Coastguard Worker 				    LARGE_OBJECT_SIZE, 1);
270*d83cc019SAndroid Build Coastguard Worker 			gettimeofday(&end, NULL);
271*d83cc019SAndroid Build Coastguard Worker 			usecs = elapsed(&start, &end, count);
272*d83cc019SAndroid Build Coastguard Worker 			bps = bytes_per_sec(buf, object_size/usecs*1e6);
273*d83cc019SAndroid Build Coastguard Worker 			igt_info("Pagefault-Y - Time to pread %d bytes: %7.3fµs, %s%s%s\n",
274*d83cc019SAndroid Build Coastguard Worker 				 LARGE_OBJECT_SIZE, usecs,
275*d83cc019SAndroid Build Coastguard Worker 				 t_elapsed < usecs ? KGRN : KRED, bps, KNRM);
276*d83cc019SAndroid Build Coastguard Worker 			fflush(stdout);
277*d83cc019SAndroid Build Coastguard Worker 			munmap(stolen_pf_user, LARGE_OBJECT_SIZE);
278*d83cc019SAndroid Build Coastguard Worker 		}
279*d83cc019SAndroid Build Coastguard Worker 		munmap(stolen_nopf_user, LARGE_OBJECT_SIZE);
280*d83cc019SAndroid Build Coastguard Worker 		gem_close(fd, large_stolen);
281*d83cc019SAndroid Build Coastguard Worker 	}
282*d83cc019SAndroid Build Coastguard Worker 
283*d83cc019SAndroid Build Coastguard Worker 
284*d83cc019SAndroid Build Coastguard Worker 	igt_fixture {
285*d83cc019SAndroid Build Coastguard Worker 		free(src);
286*d83cc019SAndroid Build Coastguard Worker 		gem_close(fd, dst);
287*d83cc019SAndroid Build Coastguard Worker 		free(dst_user);
288*d83cc019SAndroid Build Coastguard Worker 		gem_close(fd, src_stolen);
289*d83cc019SAndroid Build Coastguard Worker 
290*d83cc019SAndroid Build Coastguard Worker 		close(fd);
291*d83cc019SAndroid Build Coastguard Worker 	}
292*d83cc019SAndroid Build Coastguard Worker }
293