1 /*
2 * Copyright © 2007, 2011, 2013, 2014, 2015 Intel Corporation
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
13 * Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21 * IN THE SOFTWARE.
22 *
23 * Authors:
24 * Eric Anholt <eric@anholt.net>
25 * Daniel Vetter <daniel.vetter@ffwll.ch>
26 *
27 */
28
29 #ifdef HAVE_LIBGEN_H
30 #include <libgen.h>
31 #endif
32 #include <stdio.h>
33 #include <fcntl.h>
34 #include <sys/stat.h>
35 #include <sys/ioctl.h>
36 #include <string.h>
37 #include <sys/mman.h>
38 #include <signal.h>
39 #include <pciaccess.h>
40 #include <stdlib.h>
41 #include <time.h>
42 #include <unistd.h>
43 #include <sys/poll.h>
44 #include <sys/wait.h>
45 #include <sys/resource.h>
46 #include <sys/time.h>
47 #include <sys/types.h>
48 #include <sys/syscall.h>
49 #include <sys/utsname.h>
50 #include <termios.h>
51 #include <assert.h>
52 #include <grp.h>
53
54 #ifndef ANDROID
55 #include <proc/readproc.h>
56 #include <libudev.h>
57 #endif
58
59 #include "drmtest.h"
60 #include "i915_drm.h"
61 #include "intel_chipset.h"
62 #include "igt_aux.h"
63 #include "igt_debugfs.h"
64 #include "igt_gt.h"
65 #include "igt_rand.h"
66 #include "igt_sysfs.h"
67 #include "config.h"
68 #include "intel_reg.h"
69 #include "ioctl_wrappers.h"
70 #include "igt_kms.h"
71 #include "igt_stats.h"
72 #include "igt_sysfs.h"
73
74 #ifdef HAVE_LIBGEN_H
75 #include <libgen.h> /* for dirname() */
76 #endif
77
78 /**
79 * SECTION:igt_aux
80 * @short_description: Auxiliary libraries and support functions
81 * @title: aux
82 * @include: igt.h
83 *
84 * This library provides various auxiliary helper functions that don't really
85 * fit into any other topic.
86 */
87
88 static struct __igt_sigiter_global {
89 pid_t tid;
90 timer_t timer;
91 struct timespec offset;
92 struct {
93 long hit, miss;
94 long ioctls, signals;
95 } stat;
96 } __igt_sigiter;
97
sigiter(int sig,siginfo_t * info,void * arg)98 static void sigiter(int sig, siginfo_t *info, void *arg)
99 {
100 __igt_sigiter.stat.signals++;
101 }
102
103 #if 0
104 #define SIG_ASSERT(expr) igt_assert(expr)
105 #else
106 #define SIG_ASSERT(expr)
107 #endif
108
109 static int
sig_ioctl(int fd,unsigned long request,void * arg)110 sig_ioctl(int fd, unsigned long request, void *arg)
111 {
112 struct itimerspec its;
113 int ret;
114
115 SIG_ASSERT(__igt_sigiter.timer);
116 SIG_ASSERT(__igt_sigiter.tid == gettid());
117
118 memset(&its, 0, sizeof(its));
119 if (timer_settime(__igt_sigiter.timer, 0, &its, NULL)) {
120 /* oops, we didn't undo the interrupter (i.e. !unwound abort) */
121 igt_ioctl = drmIoctl;
122 return drmIoctl(fd, request, arg);
123 }
124
125 its.it_value = __igt_sigiter.offset;
126 do {
127 long serial;
128
129 __igt_sigiter.stat.ioctls++;
130
131 ret = 0;
132 serial = __igt_sigiter.stat.signals;
133 igt_assert(timer_settime(__igt_sigiter.timer, 0, &its, NULL) == 0);
134 if (ioctl(fd, request, arg))
135 ret = errno;
136 if (__igt_sigiter.stat.signals == serial)
137 __igt_sigiter.stat.miss++;
138 if (ret == 0)
139 break;
140
141 if (ret == EINTR) {
142 __igt_sigiter.stat.hit++;
143
144 its.it_value.tv_sec *= 2;
145 its.it_value.tv_nsec *= 2;
146 while (its.it_value.tv_nsec >= NSEC_PER_SEC) {
147 its.it_value.tv_nsec -= NSEC_PER_SEC;
148 its.it_value.tv_sec += 1;
149 }
150
151 SIG_ASSERT(its.it_value.tv_nsec >= 0);
152 SIG_ASSERT(its.it_value.tv_sec >= 0);
153 }
154 } while (ret == EAGAIN || ret == EINTR);
155
156 memset(&its, 0, sizeof(its));
157 timer_settime(__igt_sigiter.timer, 0, &its, NULL);
158
159 errno = ret;
160 return ret ? -1 : 0;
161 }
162
igt_sigiter_start(struct __igt_sigiter * iter,bool enable)163 static bool igt_sigiter_start(struct __igt_sigiter *iter, bool enable)
164 {
165 /* Note that until we can automatically clean up on failed/skipped
166 * tests, we cannot assume the state of the igt_ioctl indirection.
167 */
168 SIG_ASSERT(igt_ioctl == drmIoctl);
169 igt_ioctl = drmIoctl;
170
171 if (enable) {
172 struct timespec start, end;
173 struct sigevent sev;
174 struct sigaction act;
175 struct itimerspec its;
176
177 igt_ioctl = sig_ioctl;
178 __igt_sigiter.tid = gettid();
179
180 memset(&sev, 0, sizeof(sev));
181 sev.sigev_notify = SIGEV_SIGNAL | SIGEV_THREAD_ID;
182 sev.sigev_notify_thread_id = __igt_sigiter.tid;
183 sev.sigev_signo = SIGRTMIN;
184 igt_assert(timer_create(CLOCK_MONOTONIC, &sev, &__igt_sigiter.timer) == 0);
185
186 memset(&its, 0, sizeof(its));
187 igt_assert(timer_settime(__igt_sigiter.timer, 0, &its, NULL) == 0);
188
189 memset(&act, 0, sizeof(act));
190 act.sa_sigaction = sigiter;
191 act.sa_flags = SA_SIGINFO;
192 igt_assert(sigaction(SIGRTMIN, &act, NULL) == 0);
193
194 /* Try to find the approximate delay required to skip over
195 * the timer_setttime and into the following ioctl() to try
196 * and avoid the timer firing before we enter the drmIoctl.
197 */
198 igt_assert(clock_gettime(CLOCK_MONOTONIC, &start) == 0);
199 igt_assert(timer_settime(__igt_sigiter.timer, 0, &its, NULL) == 0);
200 igt_assert(clock_gettime(CLOCK_MONOTONIC, &end) == 0);
201
202 __igt_sigiter.offset.tv_sec = end.tv_sec - start.tv_sec;
203 __igt_sigiter.offset.tv_nsec = end.tv_nsec - start.tv_nsec;
204 if (__igt_sigiter.offset.tv_nsec < 0) {
205 __igt_sigiter.offset.tv_nsec += NSEC_PER_SEC;
206 __igt_sigiter.offset.tv_sec -= 1;
207 }
208 if (__igt_sigiter.offset.tv_sec < 0) {
209 __igt_sigiter.offset.tv_nsec = 0;
210 __igt_sigiter.offset.tv_sec = 0;
211 }
212 igt_assert(__igt_sigiter.offset.tv_sec == 0);
213
214 igt_debug("Initial delay for interruption: %ld.%09lds\n",
215 __igt_sigiter.offset.tv_sec,
216 __igt_sigiter.offset.tv_nsec);
217 }
218
219 return true;
220 }
221
igt_sigiter_stop(struct __igt_sigiter * iter,bool enable)222 static bool igt_sigiter_stop(struct __igt_sigiter *iter, bool enable)
223 {
224 if (enable) {
225 struct sigaction act;
226
227 SIG_ASSERT(igt_ioctl == sig_ioctl);
228 SIG_ASSERT(__igt_sigiter.tid == gettid());
229 igt_ioctl = drmIoctl;
230
231 timer_delete(__igt_sigiter.timer);
232
233 memset(&act, 0, sizeof(act));
234 act.sa_handler = SIG_IGN;
235 sigaction(SIGRTMIN, &act, NULL);
236
237 memset(&__igt_sigiter, 0, sizeof(__igt_sigiter));
238 }
239
240 memset(iter, 0, sizeof(*iter));
241 return false;
242 }
243
__igt_sigiter_continue(struct __igt_sigiter * iter,bool enable)244 bool __igt_sigiter_continue(struct __igt_sigiter *iter, bool enable)
245 {
246 if (iter->pass++ == 0)
247 return igt_sigiter_start(iter, enable);
248
249 /* If nothing reported SIGINT, nothing will on the next pass, so
250 * give up! Also give up if everything is now executing faster
251 * than current sigtimer.
252 */
253 if (__igt_sigiter.stat.hit == 0 ||
254 __igt_sigiter.stat.miss == __igt_sigiter.stat.ioctls)
255 return igt_sigiter_stop(iter, enable);
256
257 igt_debug("%s: pass %d, missed %ld/%ld\n",
258 __func__, iter->pass - 1,
259 __igt_sigiter.stat.miss,
260 __igt_sigiter.stat.ioctls);
261
262 SIG_ASSERT(igt_ioctl == sig_ioctl);
263 SIG_ASSERT(__igt_sigiter.timer);
264
265 __igt_sigiter.offset.tv_sec *= 2;
266 __igt_sigiter.offset.tv_nsec *= 2;
267 while (__igt_sigiter.offset.tv_nsec >= NSEC_PER_SEC) {
268 __igt_sigiter.offset.tv_nsec -= NSEC_PER_SEC;
269 __igt_sigiter.offset.tv_sec += 1;
270 }
271 SIG_ASSERT(__igt_sigiter.offset.tv_nsec >= 0);
272 SIG_ASSERT(__igt_sigiter.offset.tv_sec >= 0);
273
274 memset(&__igt_sigiter.stat, 0, sizeof(__igt_sigiter.stat));
275 return true;
276 }
277
278 static struct igt_helper_process signal_helper;
279 long long int sig_stat;
signal_helper_process(pid_t pid)280 static void __attribute__((noreturn)) signal_helper_process(pid_t pid)
281 {
282 /* Interrupt the parent process at 500Hz, just to be annoying */
283 while (1) {
284 usleep(1000 * 1000 / 500);
285 if (kill(pid, SIGCONT)) /* Parent has died, so must we. */
286 exit(0);
287 }
288 }
289
sig_handler(int i)290 static void sig_handler(int i)
291 {
292 sig_stat++;
293 }
294
295 /**
296 * igt_fork_signal_helper:
297 *
298 * Fork a child process using #igt_fork_helper to interrupt the parent process
299 * with a SIGCONT signal at regular quick intervals. The corresponding dummy
300 * signal handler is installed in the parent process.
301 *
302 * This is useful to exercise ioctl error paths, at least where those can be
303 * exercises by interrupting blocking waits, like stalling for the gpu. This
304 * helper can also be used from children spawned with #igt_fork.
305 *
306 * In tests with subtests this function can be called outside of failure
307 * catching code blocks like #igt_fixture or #igt_subtest.
308 *
309 * Note that this just spews signals at the current process unconditionally and
310 * hence incurs quite a bit of overhead. For a more focused approach, with less
311 * overhead, look at the #igt_while_interruptible code block macro.
312 */
igt_fork_signal_helper(void)313 void igt_fork_signal_helper(void)
314 {
315 if (igt_only_list_subtests())
316 return;
317
318 /* We pick SIGCONT as it is a "safe" signal - if we send SIGCONT to
319 * an unexpecting process it spuriously wakes up and does nothing.
320 * Most other signals (e.g. SIGUSR1) cause the process to die if they
321 * are not handled. This is an issue in case the sighandler is not
322 * inherited correctly (or if there is a race in the inheritance
323 * and we send the signal at exactly the wrong time).
324 */
325 signal(SIGCONT, sig_handler);
326 setpgrp(); /* define a new process group for the tests */
327
328 igt_fork_helper(&signal_helper) {
329 setpgrp(); /* Escape from the test process group */
330
331 /* Pass along the test process group identifier,
332 * negative pid => send signal to everyone in the group.
333 */
334 signal_helper_process(-getppid());
335 }
336 }
337
338 /**
339 * igt_stop_signal_helper:
340 *
341 * Stops the child process spawned with igt_fork_signal_helper() again.
342 *
343 * In tests with subtests this function can be called outside of failure
344 * catching code blocks like #igt_fixture or #igt_subtest.
345 */
igt_stop_signal_helper(void)346 void igt_stop_signal_helper(void)
347 {
348 if (igt_only_list_subtests())
349 return;
350
351 igt_stop_helper(&signal_helper);
352
353 sig_stat = 0;
354 }
355
356 /**
357 * igt_suspend_signal_helper:
358 *
359 * Suspends the child process spawned with igt_fork_signal_helper(). This
360 * should be called before a critical section of code that has difficulty to
361 * make progress if interrupted frequently, like the clone() syscall called
362 * from a largish executable. igt_resume_signal_helper() must be called after
363 * the critical section to restart interruptions for the test.
364 */
igt_suspend_signal_helper(void)365 void igt_suspend_signal_helper(void)
366 {
367 int status;
368
369 if (!signal_helper.running)
370 return;
371
372 kill(signal_helper.pid, SIGSTOP);
373 while (waitpid(signal_helper.pid, &status, WUNTRACED) == -1 &&
374 errno == EINTR)
375 ;
376 }
377
378 /**
379 * igt_resume_signal_helper:
380 *
381 * Resumes the child process spawned with igt_fork_signal_helper().
382 *
383 * This should be paired with igt_suspend_signal_helper() and called after the
384 * problematic code sensitive to signals.
385 */
igt_resume_signal_helper(void)386 void igt_resume_signal_helper(void)
387 {
388 if (!signal_helper.running)
389 return;
390
391 kill(signal_helper.pid, SIGCONT);
392 }
393
394 static struct igt_helper_process shrink_helper;
shrink_helper_process(int fd,pid_t pid)395 static void __attribute__((noreturn)) shrink_helper_process(int fd, pid_t pid)
396 {
397 while (1) {
398 igt_drop_caches_set(fd, DROP_SHRINK_ALL);
399 usleep(1000 * 1000 / 50);
400 if (kill(pid, 0)) /* Parent has died, so must we. */
401 exit(0);
402 }
403 }
404
405 /**
406 * igt_fork_shrink_helper:
407 *
408 * Fork a child process using #igt_fork_helper to force all available objects
409 * to be paged out (via i915_gem_shrink()).
410 *
411 * This is useful to exercise swapping paths, without requiring us to hit swap.
412 *
413 * This should only be used from an igt_fixture.
414 */
igt_fork_shrink_helper(int drm_fd)415 void igt_fork_shrink_helper(int drm_fd)
416 {
417 assert(!igt_only_list_subtests());
418 igt_require(igt_drop_caches_has(drm_fd, DROP_SHRINK_ALL));
419 igt_fork_helper(&shrink_helper)
420 shrink_helper_process(drm_fd, getppid());
421 }
422
423 /**
424 * igt_stop_shrink_helper:
425 *
426 * Stops the child process spawned with igt_fork_shrink_helper().
427 */
igt_stop_shrink_helper(void)428 void igt_stop_shrink_helper(void)
429 {
430 igt_stop_helper(&shrink_helper);
431 }
432
433 #ifndef ANDROID
434
show_kernel_stack(pid_t pid)435 static void show_kernel_stack(pid_t pid)
436 {
437 char buf[80], *str;
438 int dir;
439
440 snprintf(buf, sizeof(buf), "/proc/%d", pid);
441 dir = open(buf, O_RDONLY);
442 if (dir < 0)
443 return;
444
445 str = igt_sysfs_get(dir, "stack");
446 if (str) {
447 igt_debug("Kernel stack for pid %d:\n%s\n", pid, str);
448 free(str);
449 }
450
451 close(dir);
452 }
453
454 static struct igt_helper_process hang_detector;
455 static void __attribute__((noreturn))
hang_detector_process(int fd,pid_t pid,dev_t rdev)456 hang_detector_process(int fd, pid_t pid, dev_t rdev)
457 {
458 struct udev_monitor *mon =
459 udev_monitor_new_from_netlink(udev_new(), "kernel");
460 struct pollfd pfd;
461 int ret;
462
463 udev_monitor_filter_add_match_subsystem_devtype(mon, "drm", NULL);
464 udev_monitor_enable_receiving(mon);
465
466 pfd.fd = udev_monitor_get_fd(mon);
467 pfd.events = POLLIN;
468
469 while ((ret = poll(&pfd, 1, 2000)) >= 0) {
470 struct udev_device *dev;
471 dev_t devnum;
472
473 if (kill(pid, 0)) { /* Parent has died, so must we. */
474 igt_warn("Parent died without killing its children (%s)\n",
475 __func__);
476 break;
477 }
478
479 dev = NULL;
480 if (ret > 0)
481 dev = udev_monitor_receive_device(mon);
482 if (dev == NULL)
483 continue;
484
485 devnum = udev_device_get_devnum(dev);
486 if (memcmp(&rdev, &devnum, sizeof(dev_t)) == 0) {
487 const char *str;
488
489 str = udev_device_get_property_value(dev, "ERROR");
490 if (str && atoi(str) == 1) {
491 igt_debugfs_dump(fd, "i915_error_state");
492 show_kernel_stack(pid);
493 kill(pid, SIGIO);
494 }
495 }
496
497 udev_device_unref(dev);
498 }
499
500 exit(0);
501 }
502
sig_abort(int sig)503 static void sig_abort(int sig)
504 {
505 errno = 0; /* inside a signal, last errno reporting is confusing */
506 igt_assert(!"GPU hung");
507 }
508
igt_fork_hang_detector(int fd)509 void igt_fork_hang_detector(int fd)
510 {
511 struct stat st;
512
513 igt_assert(fstat(fd, &st) == 0);
514
515 /*
516 * Disable per-engine reset to force an error uevent. We don't
517 * expect to get any hangs whilst the detector is enabled (if we do
518 * they are a test failure!) and so the loss of per-engine reset
519 * functionality is not an issue.
520 */
521 igt_assert(igt_sysfs_set_parameter
522 (fd, "reset", "%d", 1 /* only global reset */));
523
524 signal(SIGIO, sig_abort);
525 igt_fork_helper(&hang_detector)
526 hang_detector_process(fd, getppid(), st.st_rdev);
527 }
528
igt_stop_hang_detector(void)529 void igt_stop_hang_detector(void)
530 {
531 igt_stop_helper(&hang_detector);
532 }
533 #endif
534
535 /**
536 * igt_check_boolean_env_var:
537 * @env_var: environment variable name
538 * @default_value: default value for the environment variable
539 *
540 * This function should be used to parse boolean environment variable options.
541 *
542 * Returns:
543 * The boolean value of the environment variable @env_var as decoded by atoi()
544 * if it is set and @default_value if the variable is not set.
545 */
igt_check_boolean_env_var(const char * env_var,bool default_value)546 bool igt_check_boolean_env_var(const char *env_var, bool default_value)
547 {
548 char *val;
549
550 val = getenv(env_var);
551 if (!val)
552 return default_value;
553
554 return atoi(val) != 0;
555 }
556
557 /**
558 * igt_aub_dump_enabled:
559 *
560 * Returns:
561 * True if AUB dumping is enabled with IGT_DUMP_AUB=1 in the environment, false
562 * otherwise.
563 */
igt_aub_dump_enabled(void)564 bool igt_aub_dump_enabled(void)
565 {
566 static int dump_aub = -1;
567
568 if (dump_aub == -1)
569 dump_aub = igt_check_boolean_env_var("IGT_DUMP_AUB", false);
570
571 return dump_aub;
572 }
573
574 /* other helpers */
575 /**
576 * igt_exchange_int:
577 * @array: pointer to the array of integers
578 * @i: first position
579 * @j: second position
580 *
581 * Exchanges the two values at array indices @i and @j. Useful as an exchange
582 * function for igt_permute_array().
583 */
igt_exchange_int(void * array,unsigned i,unsigned j)584 void igt_exchange_int(void *array, unsigned i, unsigned j)
585 {
586 int *int_arr, tmp;
587 int_arr = array;
588
589 tmp = int_arr[i];
590 int_arr[i] = int_arr[j];
591 int_arr[j] = tmp;
592 }
593
594 /**
595 * igt_exchange_int64:
596 * @array: pointer to the array of int64_t
597 * @i: first position
598 * @j: second position
599 *
600 * Exchanges the two values at array indices @i and @j. Useful as an exchange
601 * function for igt_permute_array().
602 */
igt_exchange_int64(void * array,unsigned i,unsigned j)603 void igt_exchange_int64(void *array, unsigned i, unsigned j)
604 {
605 int64_t *a = array;
606
607 igt_swap(a[i], a[j]);
608 }
609
610 /**
611 * igt_permute_array:
612 * @array: pointer to array
613 * @size: size of the array
614 * @exchange_func: function to exchange array elements
615 *
616 * This function randomly permutes the array using random() as the PRNG source.
617 * The @exchange_func function is called to exchange two elements in the array
618 * when needed.
619 */
igt_permute_array(void * array,unsigned size,void (* exchange_func)(void * array,unsigned i,unsigned j))620 void igt_permute_array(void *array, unsigned size,
621 void (*exchange_func)(void *array,
622 unsigned i,
623 unsigned j))
624 {
625 int i;
626
627 for (i = size - 1; i > 0; i--) {
628 /* yes, not perfectly uniform, who cares */
629 long l = hars_petruska_f54_1_random_unsafe() % (i +1);
630 if (i != l)
631 exchange_func(array, i, l);
632 }
633 }
634
635 __attribute__((format(printf, 1, 2)))
igt_interactive_info(const char * format,...)636 static void igt_interactive_info(const char *format, ...)
637 {
638 va_list args;
639
640 if (!isatty(STDERR_FILENO) || __igt_plain_output) {
641 errno = 0; /* otherwise would be either ENOTTY or EBADF */
642 return;
643 }
644
645 if (igt_log_level > IGT_LOG_INFO)
646 return;
647
648 va_start(args, format);
649 vfprintf(stderr, format, args);
650 va_end(args);
651 }
652
653
654 /**
655 * igt_progress:
656 * @header: header string to prepend to the progress indicator
657 * @i: work processed thus far
658 * @total: total amount of work
659 *
660 * This function draws a progress indicator, which is useful for running
661 * long-winded tests manually on the console. To avoid spamming log files in
662 * automated runs the progress indicator is suppressed when not running on a
663 * terminal.
664 */
igt_progress(const char * header,uint64_t i,uint64_t total)665 void igt_progress(const char *header, uint64_t i, uint64_t total)
666 {
667 int divider = 200;
668
669 if (i+1 >= total) {
670 igt_interactive_info("\r%s100%%\n", header);
671 return;
672 }
673
674 if (total / 200 == 0)
675 divider = 1;
676
677 /* only bother updating about every 0.5% */
678 if (i % (total / divider) == 0)
679 igt_interactive_info("\r%s%3llu%%", header,
680 (long long unsigned)i * 100 / total);
681 }
682
683 /**
684 * igt_print_activity:
685 *
686 * Print a '.' to indicate activity. This is printed without a newline and
687 * only if output is to a terminal.
688 */
igt_print_activity(void)689 void igt_print_activity(void)
690 {
691 igt_interactive_info(".");
692 }
693
694 static int autoresume_delay;
695
696 static const char *suspend_state_name[] = {
697 [SUSPEND_STATE_FREEZE] = "freeze",
698 [SUSPEND_STATE_STANDBY] = "standby",
699 [SUSPEND_STATE_MEM] = "mem",
700 [SUSPEND_STATE_DISK] = "disk",
701 };
702
703 static const char *suspend_test_name[] = {
704 [SUSPEND_TEST_NONE] = "none",
705 [SUSPEND_TEST_FREEZER] = "freezer",
706 [SUSPEND_TEST_DEVICES] = "devices",
707 [SUSPEND_TEST_PLATFORM] = "platform",
708 [SUSPEND_TEST_PROCESSORS] = "processors",
709 [SUSPEND_TEST_CORE] = "core",
710 };
711
get_suspend_test(int power_dir)712 static enum igt_suspend_test get_suspend_test(int power_dir)
713 {
714 char *test_line;
715 char *test_name;
716 enum igt_suspend_test test;
717
718 if (faccessat(power_dir, "pm_test", R_OK, 0))
719 return SUSPEND_TEST_NONE;
720
721 igt_assert((test_line = igt_sysfs_get(power_dir, "pm_test")));
722 for (test_name = strtok(test_line, " "); test_name;
723 test_name = strtok(NULL, " "))
724 if (test_name[0] == '[') {
725 test_name[strlen(test_name) - 1] = '\0';
726 test_name++;
727 break;
728 }
729
730 if (!test_name) {
731 free(test_line);
732 return SUSPEND_TEST_NONE;
733 }
734
735 for (test = SUSPEND_TEST_NONE; test < SUSPEND_TEST_NUM; test++)
736 if (strcmp(suspend_test_name[test], test_name) == 0)
737 break;
738
739 igt_assert(test < SUSPEND_TEST_NUM);
740
741 free(test_line);
742 return test;
743 }
744
set_suspend_test(int power_dir,enum igt_suspend_test test)745 static void set_suspend_test(int power_dir, enum igt_suspend_test test)
746 {
747 igt_assert(test < SUSPEND_TEST_NUM);
748
749 if (faccessat(power_dir, "pm_test", W_OK, 0)) {
750 igt_require(test == SUSPEND_TEST_NONE);
751 return;
752 }
753
754 igt_assert(igt_sysfs_set(power_dir, "pm_test", suspend_test_name[test]));
755 }
756
757 #define SQUELCH ">/dev/null 2>&1"
758
suspend_via_rtcwake(enum igt_suspend_state state)759 static void suspend_via_rtcwake(enum igt_suspend_state state)
760 {
761 char cmd[128];
762 int delay, ret;
763
764 igt_assert(state < SUSPEND_STATE_NUM);
765
766 delay = igt_get_autoresume_delay(state);
767
768 /*
769 * Skip if rtcwake would fail for a reason not related to the kernel's
770 * suspend functionality.
771 */
772 snprintf(cmd, sizeof(cmd), "rtcwake -n -s %d -m %s " SQUELCH,
773 delay, suspend_state_name[state]);
774 ret = igt_system(cmd);
775 igt_require_f(ret == 0, "rtcwake test failed with %i\n"
776 "This failure could mean that something is wrong with "
777 "the rtcwake tool or how your distro is set up.\n",
778 ret);
779
780 snprintf(cmd, sizeof(cmd), "rtcwake -s %d -m %s ",
781 delay, suspend_state_name[state]);
782 ret = igt_system(cmd);
783 if (ret) {
784 const char *path = "suspend_stats";
785 char *info;
786 int dir;
787
788 igt_warn("rtcwake failed with %i\n"
789 "Check dmesg for further details.\n",
790 ret);
791
792 dir = open(igt_debugfs_mount(), O_RDONLY);
793 info = igt_sysfs_get(dir, path);
794 close(dir);
795 if (info) {
796 igt_debug("%s:\n%s\n", path, info);
797 free(info);
798 }
799 }
800 igt_assert_eq(ret, 0);
801 }
802
suspend_via_sysfs(int power_dir,enum igt_suspend_state state)803 static void suspend_via_sysfs(int power_dir, enum igt_suspend_state state)
804 {
805 igt_assert(state < SUSPEND_STATE_NUM);
806 igt_assert(igt_sysfs_set(power_dir, "state",
807 suspend_state_name[state]));
808 }
809
get_supported_suspend_states(int power_dir)810 static uint32_t get_supported_suspend_states(int power_dir)
811 {
812 char *states;
813 char *state_name;
814 uint32_t state_mask;
815
816 igt_assert((states = igt_sysfs_get(power_dir, "state")));
817 state_mask = 0;
818 for (state_name = strtok(states, " "); state_name;
819 state_name = strtok(NULL, " ")) {
820 enum igt_suspend_state state;
821
822 for (state = SUSPEND_STATE_FREEZE; state < SUSPEND_STATE_NUM;
823 state++)
824 if (strcmp(state_name, suspend_state_name[state]) == 0)
825 break;
826 igt_assert(state < SUSPEND_STATE_NUM);
827 state_mask |= 1 << state;
828 }
829
830 free(states);
831
832 return state_mask;
833 }
834
835 /**
836 * igt_system_suspend_autoresume:
837 * @state: an #igt_suspend_state, the target suspend state
838 * @test: an #igt_suspend_test, test point at which to complete the suspend
839 * cycle
840 *
841 * Execute a system suspend cycle targeting the given @state optionally
842 * completing the cycle at the given @test point and automaically wake up
843 * again. Waking up is either achieved using the RTC wake-up alarm for a full
844 * suspend cycle or a kernel timer for a suspend test cycle. The kernel timer
845 * delay for a test cycle can be configured by the suspend.pm_test_delay
846 * kernel parameter (5 sec by default).
847 *
848 * #SUSPEND_TEST_NONE specifies a full suspend cycle.
849 * The #SUSPEND_TEST_FREEZER..#SUSPEND_TEST_CORE test points can make it
850 * possible to collect error logs in case a full suspend cycle would prevent
851 * this by hanging the machine, or they can provide an idea of the faulty
852 * component by comparing fail/no-fail results at different test points.
853 *
854 * This is very handy for implementing any kind of suspend/resume test.
855 */
igt_system_suspend_autoresume(enum igt_suspend_state state,enum igt_suspend_test test)856 void igt_system_suspend_autoresume(enum igt_suspend_state state,
857 enum igt_suspend_test test)
858 {
859 int power_dir;
860 enum igt_suspend_test orig_test;
861
862 /* FIXME: Simulation doesn't like suspend/resume, and not even a lighter
863 * approach using /sys/power/pm_test to just test our driver's callbacks
864 * seems to fare better. We need to investigate what's going on. */
865 igt_skip_on_simulation();
866
867 igt_require((power_dir = open("/sys/power", O_RDONLY)) >= 0);
868 igt_require(get_supported_suspend_states(power_dir) & (1 << state));
869 igt_require(test == SUSPEND_TEST_NONE ||
870 faccessat(power_dir, "pm_test", R_OK | W_OK, 0) == 0);
871
872 orig_test = get_suspend_test(power_dir);
873 set_suspend_test(power_dir, test);
874
875 if (test == SUSPEND_TEST_NONE)
876 suspend_via_rtcwake(state);
877 else
878 suspend_via_sysfs(power_dir, state);
879
880 set_suspend_test(power_dir, orig_test);
881 close(power_dir);
882 }
883
884 static int original_autoresume_delay;
885
igt_restore_autoresume_delay(int sig)886 static void igt_restore_autoresume_delay(int sig)
887 {
888 int delay_fd;
889 char delay_str[10];
890
891 igt_require((delay_fd = open("/sys/module/suspend/parameters/pm_test_delay",
892 O_WRONLY)) >= 0);
893
894 snprintf(delay_str, sizeof(delay_str), "%d", original_autoresume_delay);
895 igt_require(write(delay_fd, delay_str, strlen(delay_str)));
896
897 close(delay_fd);
898 }
899
900 /**
901 * igt_set_autoresume_delay:
902 * @delay_secs: The delay in seconds before resuming the system
903 *
904 * Sets how long we wait to resume the system after suspending it, using the
905 * suspend.pm_test_delay variable. On exit, the original delay value is
906 * restored.
907 */
igt_set_autoresume_delay(int delay_secs)908 void igt_set_autoresume_delay(int delay_secs)
909 {
910 int delay_fd;
911 char delay_str[10];
912
913 igt_skip_on_simulation();
914
915 delay_fd = open("/sys/module/suspend/parameters/pm_test_delay", O_RDWR);
916
917 if (delay_fd >= 0) {
918 if (!original_autoresume_delay) {
919 igt_require(read(delay_fd, delay_str,
920 sizeof(delay_str)));
921 original_autoresume_delay = atoi(delay_str);
922 igt_install_exit_handler(igt_restore_autoresume_delay);
923 }
924
925 snprintf(delay_str, sizeof(delay_str), "%d", delay_secs);
926 igt_require(write(delay_fd, delay_str, strlen(delay_str)));
927
928 close(delay_fd);
929 }
930
931 autoresume_delay = delay_secs;
932 }
933
934 /**
935 * igt_get_autoresume_delay:
936 * @state: an #igt_suspend_state, the target suspend state
937 *
938 * Retrieves how long we wait to resume the system after suspending it.
939 * This can either be set through igt_set_autoresume_delay or be a default
940 * value that depends on the suspend state.
941 *
942 * Returns: The autoresume delay, in seconds.
943 */
igt_get_autoresume_delay(enum igt_suspend_state state)944 int igt_get_autoresume_delay(enum igt_suspend_state state)
945 {
946 int delay;
947
948 if (autoresume_delay)
949 delay = autoresume_delay;
950 else
951 delay = state == SUSPEND_STATE_DISK ? 30 : 15;
952
953 return delay;
954 }
955
956 /**
957 * igt_drop_root:
958 *
959 * Drop root privileges and make sure it actually worked. Useful for tests
960 * which need to check security constraints. Note that this should only be
961 * called from manually forked processes, since the lack of root privileges
962 * will wreak havoc with the automatic cleanup handlers.
963 */
igt_drop_root(void)964 void igt_drop_root(void)
965 {
966 igt_assert_eq(getuid(), 0);
967
968 igt_assert_eq(setgroups(0, NULL), 0);
969 igt_assert_eq(setgid(2), 0);
970 igt_assert_eq(setuid(2), 0);
971
972 igt_assert_eq(getgroups(0, NULL), 0);
973 igt_assert_eq(getgid(), 2);
974 igt_assert_eq(getuid(), 2);
975 }
976
977 /**
978 * igt_debug_wait_for_keypress:
979 * @var: var lookup to to enable this wait
980 *
981 * Waits for a key press when run interactively and when the corresponding debug
982 * var is set in the --interactive-debug=$var variable. Multiple keys
983 * can be specified as a comma-separated list or alternatively "all" if a wait
984 * should happen for all cases.
985 *
986 * When not connected to a terminal interactive_debug is ignored
987 * and execution immediately continues.
988 *
989 * This is useful for display tests where under certain situation manual
990 * inspection of the display is useful. Or when running a testcase in the
991 * background.
992 */
igt_debug_wait_for_keypress(const char * var)993 void igt_debug_wait_for_keypress(const char *var)
994 {
995 struct termios oldt, newt;
996
997 if (!isatty(STDIN_FILENO)) {
998 errno = 0; /* otherwise would be either ENOTTY or EBADF */
999 return;
1000 }
1001
1002 if (!igt_interactive_debug)
1003 return;
1004
1005 if (!strstr(igt_interactive_debug, var) &&
1006 !strstr(igt_interactive_debug, "all"))
1007 return;
1008
1009 igt_info("Press any key to continue ...\n");
1010
1011 tcgetattr ( STDIN_FILENO, &oldt );
1012 newt = oldt;
1013 newt.c_lflag &= ~( ICANON | ECHO );
1014 tcsetattr ( STDIN_FILENO, TCSANOW, &newt );
1015 getchar();
1016 tcsetattr ( STDIN_FILENO, TCSANOW, &oldt );
1017 }
1018
1019 /**
1020 * igt_debug_manual_check:
1021 * @var: var lookup to to enable this wait
1022 * @expected: message to be printed as expected behaviour before wait for keys Y/n
1023 *
1024 * Waits for a key press when run interactively and when the corresponding debug
1025 * var is set in the --interactive-debug=$var variable. Multiple vars
1026 * can be specified as a comma-separated list or alternatively "all" if a wait
1027 * should happen for all cases.
1028 *
1029 * This is useful for display tests where under certain situation manual
1030 * inspection of the display is useful. Or when running a testcase in the
1031 * background.
1032 *
1033 * When not connected to a terminal interactive_debug is ignored
1034 * and execution immediately continues. For this reason by default this function
1035 * returns true. It returns false only when N/n is pressed indicating the
1036 * user isn't seeing what was expected.
1037 *
1038 * Force test fail when N/n is pressed.
1039 */
igt_debug_manual_check(const char * var,const char * expected)1040 void igt_debug_manual_check(const char *var, const char *expected)
1041 {
1042 struct termios oldt, newt;
1043 char key;
1044
1045 if (!isatty(STDIN_FILENO)) {
1046 errno = 0; /* otherwise would be either ENOTTY or EBADF */
1047 return;
1048 }
1049
1050 if (!igt_interactive_debug)
1051 return;
1052
1053 if (!strstr(igt_interactive_debug, var) &&
1054 !strstr(igt_interactive_debug, "all"))
1055 return;
1056
1057 igt_info("Is %s [Y/n]", expected);
1058
1059 tcgetattr ( STDIN_FILENO, &oldt );
1060 newt = oldt;
1061 newt.c_lflag &= ~ICANON;
1062 tcsetattr ( STDIN_FILENO, TCSANOW, &newt );
1063 key = getchar();
1064 tcsetattr ( STDIN_FILENO, TCSANOW, &oldt );
1065
1066 igt_info("\n");
1067
1068 igt_assert(key != 'n' && key != 'N');
1069 }
1070
1071 /**
1072 * igt_lock_mem:
1073 * @size: the amount of memory to lock into RAM, in MB
1074 *
1075 * Allocate @size MB of memory and lock it into RAM. This releases any
1076 * previously locked memory.
1077 *
1078 * Use #igt_unlock_mem to release the currently locked memory.
1079 */
1080 static char *locked_mem;
1081 static size_t locked_size;
1082
igt_lock_mem(size_t size)1083 void igt_lock_mem(size_t size)
1084 {
1085 long pagesize = sysconf(_SC_PAGESIZE);
1086 size_t i;
1087 int ret;
1088
1089 if (size == 0) {
1090 return;
1091 }
1092
1093 if (locked_mem) {
1094 igt_unlock_mem();
1095 igt_warn("Unlocking previously locked memory.\n");
1096 }
1097
1098 locked_size = size * 1024 * 1024;
1099
1100 locked_mem = malloc(locked_size);
1101 igt_require_f(locked_mem,
1102 "Could not malloc %zdMiB for locking.\n", size);
1103
1104 /* write into each page to ensure it is allocated */
1105 for (i = 0; i < locked_size; i += pagesize)
1106 locked_mem[i] = i;
1107
1108 ret = mlock(locked_mem, locked_size);
1109 igt_assert_f(ret == 0, "Could not mlock %zdMiB.\n", size);
1110 }
1111
1112 /**
1113 * igt_unlock_mem:
1114 *
1115 * Release and free the RAM used by #igt_lock_mem.
1116 */
igt_unlock_mem(void)1117 void igt_unlock_mem(void)
1118 {
1119 if (!locked_mem)
1120 return;
1121
1122 munlock(locked_mem, locked_size);
1123
1124 free(locked_mem);
1125 locked_mem = NULL;
1126 }
1127
1128
1129 #define MODULE_PARAM_DIR "/sys/module/i915/parameters/"
1130 #define PARAM_NAME_MAX_SZ 32
1131 #define PARAM_VALUE_MAX_SZ 16
1132 #define PARAM_FILE_PATH_MAX_SZ (strlen(MODULE_PARAM_DIR) + PARAM_NAME_MAX_SZ)
1133
1134 struct module_param_data {
1135 char name[PARAM_NAME_MAX_SZ];
1136 char original_value[PARAM_VALUE_MAX_SZ];
1137
1138 struct module_param_data *next;
1139 };
1140 struct module_param_data *module_params = NULL;
1141
igt_module_param_exit_handler(int sig)1142 static void igt_module_param_exit_handler(int sig)
1143 {
1144 const size_t dir_len = strlen(MODULE_PARAM_DIR);
1145 char file_path[PARAM_FILE_PATH_MAX_SZ];
1146 struct module_param_data *data;
1147 int fd;
1148
1149 /* We don't need to assert string sizes on this function since they were
1150 * already checked before being stored on the lists. Besides,
1151 * igt_assert() is not AS-Safe. */
1152 strcpy(file_path, MODULE_PARAM_DIR);
1153
1154 for (data = module_params; data != NULL; data = data->next) {
1155 strcpy(file_path + dir_len, data->name);
1156
1157 fd = open(file_path, O_RDWR);
1158 if (fd >= 0) {
1159 int size = strlen (data->original_value);
1160
1161 if (size != write(fd, data->original_value, size)) {
1162 const char msg[] = "WARNING: Module parameters "
1163 "may not have been reset to their "
1164 "original values\n";
1165 assert(write(STDERR_FILENO, msg, sizeof(msg))
1166 == sizeof(msg));
1167 }
1168
1169 close(fd);
1170 }
1171 }
1172 /* free() is not AS-Safe, so we can't call it here. */
1173 }
1174
1175 /**
1176 * igt_save_module_param:
1177 * @name: name of the i915.ko module parameter
1178 * @file_path: full sysfs file path for the parameter
1179 *
1180 * Reads the current value of an i915.ko module parameter, saves it on an array,
1181 * then installs an exit handler to restore it when the program exits.
1182 *
1183 * It is safe to call this function multiple times for the same parameter.
1184 *
1185 * Notice that this function is called by igt_set_module_param(), so that one -
1186 * or one of its wrappers - is the only function the test programs need to call.
1187 */
igt_save_module_param(const char * name,const char * file_path)1188 static void igt_save_module_param(const char *name, const char *file_path)
1189 {
1190 struct module_param_data *data;
1191 size_t n;
1192 int fd;
1193
1194 /* Check if this parameter is already saved. */
1195 for (data = module_params; data != NULL; data = data->next)
1196 if (strncmp(data->name, name, PARAM_NAME_MAX_SZ) == 0)
1197 return;
1198
1199 if (!module_params)
1200 igt_install_exit_handler(igt_module_param_exit_handler);
1201
1202 data = calloc(1, sizeof (*data));
1203 igt_assert(data);
1204
1205 strncpy(data->name, name, PARAM_NAME_MAX_SZ - 1);
1206
1207 fd = open(file_path, O_RDONLY);
1208 igt_assert(fd >= 0);
1209
1210 n = read(fd, data->original_value, PARAM_VALUE_MAX_SZ);
1211 igt_assert_f(n > 0 && n < PARAM_VALUE_MAX_SZ,
1212 "Need to increase PARAM_VALUE_MAX_SZ\n");
1213
1214 igt_assert(close(fd) == 0);
1215
1216 data->next = module_params;
1217 module_params = data;
1218 }
1219
1220 /**
1221 * igt_set_module_param:
1222 * @name: i915.ko parameter name
1223 * @val: i915.ko parameter value
1224 *
1225 * This function sets the desired value for the given i915.ko parameter. It also
1226 * takes care of saving and restoring the values that were already set before
1227 * the test was run.
1228 *
1229 * Please consider using igt_set_module_param_int() for the integer and bool
1230 * parameters.
1231 */
igt_set_module_param(const char * name,const char * val)1232 void igt_set_module_param(const char *name, const char *val)
1233 {
1234 char file_path[PARAM_FILE_PATH_MAX_SZ];
1235 size_t len = strlen(val);
1236 int fd;
1237
1238 igt_assert_f(strlen(name) < PARAM_NAME_MAX_SZ,
1239 "Need to increase PARAM_NAME_MAX_SZ\n");
1240 strcpy(file_path, MODULE_PARAM_DIR);
1241 strcpy(file_path + strlen(MODULE_PARAM_DIR), name);
1242
1243 igt_save_module_param(name, file_path);
1244
1245 fd = open(file_path, O_RDWR);
1246 igt_assert(write(fd, val, len) == len);
1247 igt_assert(close(fd) == 0);
1248 }
1249
1250 /**
1251 * igt_set_module_param_int:
1252 * @name: i915.ko parameter name
1253 * @val: i915.ko parameter value
1254 *
1255 * This is a wrapper for igt_set_module_param() that takes an integer instead of
1256 * a string. Please see igt_set_module_param().
1257 */
igt_set_module_param_int(const char * name,int val)1258 void igt_set_module_param_int(const char *name, int val)
1259 {
1260 char str[PARAM_VALUE_MAX_SZ];
1261 int n;
1262
1263 n = snprintf(str, PARAM_VALUE_MAX_SZ, "%d\n", val);
1264 igt_assert_f(n < PARAM_VALUE_MAX_SZ,
1265 "Need to increase PARAM_VALUE_MAX_SZ\n");
1266
1267 igt_set_module_param(name, str);
1268 }
1269
1270 #ifndef ANDROID
1271
1272 /**
1273 * igt_is_process_running:
1274 * @comm: Name of process in the form found in /proc/pid/comm (limited to 15
1275 * chars)
1276 *
1277 * Returns: true in case the process has been found, false otherwise.
1278 *
1279 * This function checks in the process table for an entry with the name @comm.
1280 */
igt_is_process_running(const char * comm)1281 int igt_is_process_running(const char *comm)
1282 {
1283 PROCTAB *proc;
1284 proc_t *proc_info;
1285 bool found = false;
1286
1287 proc = openproc(PROC_FILLCOM | PROC_FILLSTAT);
1288 igt_assert(proc != NULL);
1289
1290 while ((proc_info = readproc(proc, NULL))) {
1291 if (!strncasecmp(proc_info->cmd, comm, sizeof(proc_info->cmd))) {
1292 freeproc(proc_info);
1293 found = true;
1294 break;
1295 }
1296 freeproc(proc_info);
1297 }
1298
1299 closeproc(proc);
1300 return found;
1301 }
1302
1303 /**
1304 * igt_terminate_process:
1305 * @sig: Signal to send
1306 * @comm: Name of process in the form found in /proc/pid/comm (limited to 15
1307 * chars)
1308 *
1309 * Returns: 0 in case the process is not found running or the signal has been
1310 * sent successfully or -errno otherwise.
1311 *
1312 * This function sends the signal @sig for a process found in process table
1313 * with name @comm.
1314 */
igt_terminate_process(int sig,const char * comm)1315 int igt_terminate_process(int sig, const char *comm)
1316 {
1317 PROCTAB *proc;
1318 proc_t *proc_info;
1319 int err = 0;
1320
1321 proc = openproc(PROC_FILLCOM | PROC_FILLSTAT | PROC_FILLARG);
1322 igt_assert(proc != NULL);
1323
1324 while ((proc_info = readproc(proc, NULL))) {
1325 if (!strncasecmp(proc_info->cmd, comm, sizeof(proc_info->cmd))) {
1326
1327 if (kill(proc_info->tid, sig) < 0)
1328 err = -errno;
1329
1330 freeproc(proc_info);
1331 break;
1332 }
1333 freeproc(proc_info);
1334 }
1335
1336 closeproc(proc);
1337 return err;
1338 }
1339
1340 struct pinfo {
1341 pid_t pid;
1342 const char *comm;
1343 const char *fn;
1344 };
1345
1346 static void
__igt_show_stat(struct pinfo * info)1347 __igt_show_stat(struct pinfo *info)
1348 {
1349 const char *comm, *fn;
1350 const char *type = "";
1351 struct stat st;
1352
1353 pid_t pid = info->pid;
1354 igt_assert((comm = info->comm));
1355 igt_assert((fn = info->fn));
1356
1357 if (lstat(fn, &st) == -1)
1358 return;
1359
1360 igt_info("%20.20s ", comm);
1361 igt_info("%10d ", pid);
1362
1363 switch (st.st_mode & S_IFMT) {
1364 case S_IFBLK:
1365 type = "block";
1366 break;
1367 case S_IFCHR:
1368 type = "character";
1369 break;
1370 case S_IFDIR:
1371 type = "directory";
1372 break;
1373 case S_IFIFO:
1374 type = "FIFO/pipe";
1375 break;
1376 case S_IFLNK:
1377 type = "symlink";
1378 break;
1379 case S_IFREG:
1380 type = "file";
1381 break;
1382 case S_IFSOCK:
1383 type = "socket";
1384 break;
1385 default:
1386 type = "unknown?";
1387 break;
1388 }
1389 igt_info("%20.20s ", type);
1390
1391 igt_info("%10ld%10ld ", (long) st.st_uid, (long) st.st_gid);
1392
1393 igt_info("%15lld bytes ", (long long) st.st_size);
1394 igt_info("%30.30s", fn);
1395 igt_info("\n");
1396 }
1397
1398 static void
igt_show_stat_header(void)1399 igt_show_stat_header(void)
1400 {
1401 igt_info("%20.20s%11.11s%21.21s%11.11s%10.10s%22.22s%31.31s\n",
1402 "COMM", "PID", "Type", "UID", "GID", "Size", "Filename");
1403 }
1404
1405 static void
igt_show_stat(proc_t * info,int * state,const char * fn)1406 igt_show_stat(proc_t *info, int *state, const char *fn)
1407 {
1408 struct pinfo p = { .pid = info->tid, .comm = info->cmd, .fn = fn };
1409
1410 if (!*state)
1411 igt_show_stat_header();
1412
1413 __igt_show_stat(&p);
1414 ++*state;
1415 }
1416
1417 static void
__igt_lsof_fds(proc_t * proc_info,int * state,char * proc_path,const char * dir)1418 __igt_lsof_fds(proc_t *proc_info, int *state, char *proc_path, const char *dir)
1419 {
1420 struct dirent *d;
1421 struct stat st;
1422 char path[PATH_MAX];
1423 char *fd_lnk;
1424
1425 /* default fds or kernel threads */
1426 const char *default_fds[] = { "/dev/pts", "/dev/null" };
1427
1428 DIR *dp = opendir(proc_path);
1429 igt_assert(dp);
1430 again:
1431 while ((d = readdir(dp))) {
1432 char *copy_fd_lnk;
1433 char *dirn;
1434
1435 unsigned int i;
1436 ssize_t read;
1437
1438 if (*d->d_name == '.')
1439 continue;
1440
1441 memset(path, 0, sizeof(path));
1442 snprintf(path, sizeof(path), "%s/%s", proc_path, d->d_name);
1443
1444 if (lstat(path, &st) == -1)
1445 continue;
1446
1447 fd_lnk = malloc(st.st_size + 1);
1448
1449 igt_assert((read = readlink(path, fd_lnk, st.st_size + 1)));
1450 fd_lnk[read] = '\0';
1451
1452 for (i = 0; i < ARRAY_SIZE(default_fds); ++i) {
1453 if (!strncmp(default_fds[i],
1454 fd_lnk,
1455 strlen(default_fds[i]))) {
1456 free(fd_lnk);
1457 goto again;
1458 }
1459 }
1460
1461 copy_fd_lnk = strdup(fd_lnk);
1462 dirn = dirname(copy_fd_lnk);
1463
1464 if (!strncmp(dir, dirn, strlen(dir)))
1465 igt_show_stat(proc_info, state, fd_lnk);
1466
1467 free(copy_fd_lnk);
1468 free(fd_lnk);
1469 }
1470
1471 closedir(dp);
1472 }
1473
1474 /*
1475 * This functions verifies, for each process running on the machine, if the
1476 * current working directory or the fds matches the one supplied in dir.
1477 */
1478 static void
__igt_lsof(const char * dir)1479 __igt_lsof(const char *dir)
1480 {
1481 PROCTAB *proc;
1482 proc_t *proc_info;
1483
1484 char path[30];
1485 char *name_lnk;
1486 struct stat st;
1487 int state = 0;
1488
1489 proc = openproc(PROC_FILLCOM | PROC_FILLSTAT | PROC_FILLARG);
1490 igt_assert(proc != NULL);
1491
1492 while ((proc_info = readproc(proc, NULL))) {
1493 ssize_t read;
1494
1495 /* check current working directory */
1496 memset(path, 0, sizeof(path));
1497 snprintf(path, sizeof(path), "/proc/%d/cwd", proc_info->tid);
1498
1499 if (stat(path, &st) == -1)
1500 continue;
1501
1502 name_lnk = malloc(st.st_size + 1);
1503
1504 igt_assert((read = readlink(path, name_lnk, st.st_size + 1)));
1505 name_lnk[read] = '\0';
1506
1507 if (!strncmp(dir, name_lnk, strlen(dir)))
1508 igt_show_stat(proc_info, &state, name_lnk);
1509
1510 /* check also fd, seems that lsof(8) doesn't look here */
1511 memset(path, 0, sizeof(path));
1512 snprintf(path, sizeof(path), "/proc/%d/fd", proc_info->tid);
1513
1514 __igt_lsof_fds(proc_info, &state, path, dir);
1515
1516 free(name_lnk);
1517 freeproc(proc_info);
1518 }
1519
1520 closeproc(proc);
1521 }
1522
1523 /**
1524 * igt_lsof: Lists information about files opened by processes.
1525 * @dpath: Path to look under. A valid directory is required.
1526 *
1527 * This function mimics (a restrictive form of) lsof(8), but also shows
1528 * information about opened fds.
1529 */
1530 void
igt_lsof(const char * dpath)1531 igt_lsof(const char *dpath)
1532 {
1533 struct stat st;
1534 size_t len = strlen(dpath);
1535 char *sanitized;
1536
1537 if (stat(dpath, &st) == -1)
1538 return;
1539
1540 if (!S_ISDIR(st.st_mode)) {
1541 igt_warn("%s not a directory!\n", dpath);
1542 return;
1543 }
1544
1545 sanitized = strdup(dpath);
1546 /* remove last '/' so matching is easier */
1547 if (len > 1 && dpath[len - 1] == '/')
1548 sanitized[len - 1] = '\0';
1549
1550 __igt_lsof(sanitized);
1551
1552 free(sanitized);
1553 }
1554 #endif
1555
1556 static struct igt_siglatency {
1557 timer_t timer;
1558 struct timespec target;
1559 struct sigaction oldact;
1560 struct igt_mean mean;
1561
1562 int sig;
1563 } igt_siglatency;
1564
delay(void)1565 static long delay(void)
1566 {
1567 return hars_petruska_f54_1_random_unsafe() % (NSEC_PER_SEC / 1000);
1568 }
1569
elapsed(const struct timespec * now,const struct timespec * last)1570 static double elapsed(const struct timespec *now, const struct timespec *last)
1571 {
1572 double nsecs;
1573
1574 nsecs = now->tv_nsec - last ->tv_nsec;
1575 nsecs += 1e9*(now->tv_sec - last->tv_sec);
1576
1577 return nsecs;
1578 }
1579
siglatency(int sig,siginfo_t * info,void * arg)1580 static void siglatency(int sig, siginfo_t *info, void *arg)
1581 {
1582 struct itimerspec its;
1583
1584 clock_gettime(CLOCK_MONOTONIC, &its.it_value);
1585 if (info)
1586 igt_mean_add(&igt_siglatency.mean,
1587 elapsed(&its.it_value, &igt_siglatency.target));
1588 igt_siglatency.target = its.it_value;
1589
1590 its.it_value.tv_nsec += 100 * 1000;
1591 its.it_value.tv_nsec += delay();
1592 if (its.it_value.tv_nsec >= NSEC_PER_SEC) {
1593 its.it_value.tv_nsec -= NSEC_PER_SEC;
1594 its.it_value.tv_sec += 1;
1595 }
1596 its.it_interval.tv_sec = its.it_interval.tv_nsec = 0;
1597 timer_settime(igt_siglatency.timer, TIMER_ABSTIME, &its, NULL);
1598 }
1599
igt_start_siglatency(int sig)1600 void igt_start_siglatency(int sig)
1601 {
1602 struct sigevent sev;
1603 struct sigaction act;
1604
1605 if (sig <= 0)
1606 sig = SIGRTMIN;
1607
1608 if (igt_siglatency.sig)
1609 (void)igt_stop_siglatency(NULL);
1610 igt_assert(igt_siglatency.sig == 0);
1611 igt_siglatency.sig = sig;
1612
1613 memset(&sev, 0, sizeof(sev));
1614 sev.sigev_notify = SIGEV_SIGNAL | SIGEV_THREAD_ID;
1615 sev.sigev_notify_thread_id = gettid();
1616 sev.sigev_signo = sig;
1617 timer_create(CLOCK_MONOTONIC, &sev, &igt_siglatency.timer);
1618
1619 memset(&act, 0, sizeof(act));
1620 act.sa_sigaction = siglatency;
1621 sigaction(sig, &act, &igt_siglatency.oldact);
1622
1623 siglatency(sig, NULL, NULL);
1624 }
1625
igt_stop_siglatency(struct igt_mean * result)1626 double igt_stop_siglatency(struct igt_mean *result)
1627 {
1628 double mean = igt_mean_get(&igt_siglatency.mean);
1629
1630 if (result)
1631 *result = igt_siglatency.mean;
1632
1633 sigaction(igt_siglatency.sig, &igt_siglatency.oldact, NULL);
1634 timer_delete(igt_siglatency.timer);
1635 memset(&igt_siglatency, 0, sizeof(igt_siglatency));
1636
1637 return mean;
1638 }
1639
igt_allow_unlimited_files(void)1640 bool igt_allow_unlimited_files(void)
1641 {
1642 struct rlimit rlim;
1643 unsigned nofile_rlim = 1024*1024;
1644
1645 FILE *file = fopen("/proc/sys/fs/nr_open", "r");
1646 if (file) {
1647 igt_assert(fscanf(file, "%u", &nofile_rlim) == 1);
1648 igt_info("System limit for open files is %u\n", nofile_rlim);
1649 fclose(file);
1650 }
1651
1652 if (getrlimit(RLIMIT_NOFILE, &rlim))
1653 return false;
1654
1655 rlim.rlim_cur = nofile_rlim;
1656 rlim.rlim_max = nofile_rlim;
1657 return setrlimit(RLIMIT_NOFILE, &rlim) == 0;
1658 }
1659
1660 /**
1661 * vfs_file_max: report maximum number of files
1662 *
1663 * Get the global system-wide maximum of open files the kernel allows,
1664 * by reading /proc/sys/fs/file-max. Fails the current subtest if
1665 * reading the file fails, and returns a suitable best guess if it
1666 * cannot be opened.
1667 *
1668 * Returns: System-wide maximum of open files, or a best effort guess.
1669 */
vfs_file_max(void)1670 uint64_t vfs_file_max(void)
1671 {
1672 static long long unsigned max;
1673 if (max == 0) {
1674 FILE *file = fopen("/proc/sys/fs/file-max", "r");
1675 max = 80000;
1676 if (file) {
1677 igt_assert(fscanf(file, "%llu", &max) == 1);
1678 fclose(file);
1679 }
1680 }
1681 return max;
1682 }
1683