All of lore.kernel.org
 help / color / mirror / Atom feed
* [i-g-t PATCH 1/4] lib/igt_core: Add igt_exec helpers
@ 2017-04-20  8:13 Abdiel Janulgue
  2017-04-20  8:13 ` [i-g-t PATCH 2/4] igt/igt_core: Provide an option to check for the log buffer contents Abdiel Janulgue
                   ` (3 more replies)
  0 siblings, 4 replies; 11+ messages in thread
From: Abdiel Janulgue @ 2017-04-20  8:13 UTC (permalink / raw)
  To: intel-gfx; +Cc: Daniel Vetter

Support executing external processes with the goal of capturing its
standard streams to the igt logging infrastructure in addition to its
exit status.

Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: Petri Latvala <petri.latvala@intel.com>
Signed-off-by: Abdiel Janulgue <abdiel.janulgue@linux.intel.com>
---
 lib/igt_core.c | 151 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 lib/igt_core.h |   3 ++
 2 files changed, 154 insertions(+)

diff --git a/lib/igt_core.c b/lib/igt_core.c
index 403b942..8a7ba0d 100644
--- a/lib/igt_core.c
+++ b/lib/igt_core.c
@@ -2073,3 +2073,154 @@ FILE *__igt_fopen_data(const char* igt_srcdir, const char* igt_datadir,
 
 	return fp;
 }
+
+struct output_pipe {
+	int output_fd;
+	int save_fd;
+	int read_fd;
+	int write_fd;
+	bool redirected;
+	enum igt_log_level log_level;
+};
+
+static bool redirect_output(struct output_pipe *p, int output_fd,
+			    enum igt_log_level level)
+{
+	int fds[2], flags;
+
+	if (pipe(fds) == -1)
+		return false;
+
+	if ((flags = fcntl(fds[0], F_GETFL) == -1))
+		return false;
+
+	flags |= O_NONBLOCK;
+	if (fcntl(fds[0], F_SETFL, flags) == -1)
+		return false;
+
+	/* save output */
+	if ((p->save_fd = dup(output_fd)) == -1)
+		return false;
+
+	/* Redirect output to our buffer */
+	if (dup2(fds[1], output_fd) == -1)
+		return false;
+
+	p->output_fd = output_fd;
+	p->read_fd = fds[0];
+	p->write_fd = fds[1];
+	p->redirected = true;
+	p->log_level = level;
+
+	return true;
+}
+
+static bool unredirect_output(struct output_pipe *p)
+{
+	close(p->write_fd);
+	if (dup2(p->save_fd, p->output_fd) == -1)
+		return false;
+	close(p->save_fd);
+
+	p->redirected = false;
+
+	return true;
+}
+
+/**
+ * igt_exec:
+ *
+ * Executes the shell command specified in @command and capture its stdout and
+ * stderr to igt_log or igt_warn respectively.
+ *
+ * Returns: The exit status of the executed process. -1 for failure.
+ */
+int igt_exec(const char *command)
+{
+#define OUT 0
+#define ERR 1
+	struct output_pipe op[2];
+	int i, sel_fd, status;
+	fd_set fds;
+	struct timeval timeout = { .tv_sec = 0, .tv_usec = 0 };
+	char buf[PIPE_BUF];
+
+	if (!redirect_output(&op[OUT], STDOUT_FILENO, IGT_LOG_INFO))
+		return -1;
+	if (!redirect_output(&op[ERR], STDERR_FILENO, IGT_LOG_WARN))
+		return -1;
+
+	if ((status = system(command)) == -1)
+		return -1;
+
+	FD_ZERO(&fds);
+	FD_SET(op[OUT].read_fd, &fds);
+	FD_SET(op[ERR].read_fd, &fds);
+
+	sel_fd = max(op[OUT].read_fd, op[ERR].read_fd);
+	if (select(sel_fd + 1, &fds, NULL, NULL, &timeout) == -1)
+		return -1;
+
+	for (i = 0; i < ARRAY_SIZE(op); i++) {
+		struct output_pipe *current = &op[i];
+
+		if (!FD_ISSET(current->read_fd, &fds)) {
+			close(current->read_fd);
+			if (!unredirect_output(current))
+				return -1;
+			continue;
+		}
+
+		memset(buf, 0, sizeof(buf));
+		while (read(current->read_fd, buf, sizeof(buf)) > 0) {
+			if (current->redirected) {
+				if (!unredirect_output(current))
+					return -1;
+			}
+			igt_log(IGT_LOG_DOMAIN, current->log_level,
+				"[cmd] %s", buf);
+			memset(buf, 0, sizeof(buf));
+		}
+		close(current->read_fd);
+	}
+
+	return WEXITSTATUS(status);
+}
+
+/**
+ * igt_exec_quiet:
+ * Similar to igt_exec(), except redirect output to /dev/null
+ *
+ * Returns: The exit status of the executed process. -1 for failure.
+ */
+int igt_exec_quiet(const char *command)
+{
+	int stderr_fd_copy, stdout_fd_copy, status, nullfd;
+
+	/* redirect */
+	if ((nullfd = open("/dev/null", O_WRONLY)) == -1)
+		return -1;
+	if ((stdout_fd_copy = dup(STDOUT_FILENO)) == -1)
+		return -1;
+	if ((stderr_fd_copy = dup(STDERR_FILENO)) == -1)
+		return -1;
+
+	if (dup2(nullfd, STDOUT_FILENO) == -1)
+		return -1;
+	if (dup2(nullfd, STDERR_FILENO) == -1)
+		return -1;
+
+	if ((status = system(command)) == -1)
+		return -1;
+
+	/* restore */
+	if (dup2(stdout_fd_copy, STDOUT_FILENO) == -1)
+		return -1;
+	if (dup2(stderr_fd_copy, STDERR_FILENO) == -1)
+		return -1;
+
+	close(stdout_fd_copy);
+	close(stderr_fd_copy);
+
+	return WEXITSTATUS(status);
+}
diff --git a/lib/igt_core.h b/lib/igt_core.h
index 51b98d8..6d4cf60 100644
--- a/lib/igt_core.h
+++ b/lib/igt_core.h
@@ -918,4 +918,7 @@ FILE *__igt_fopen_data(const char* igt_srcdir, const char* igt_datadir,
 #define igt_fopen_data(filename) \
 	__igt_fopen_data(IGT_SRCDIR, IGT_DATADIR, filename)
 
+int igt_exec(const char *command);
+int igt_exec_quiet(const char *command);
+
 #endif /* IGT_CORE_H */
-- 
2.7.4

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [i-g-t PATCH 2/4] igt/igt_core: Provide an option to check for the log buffer contents
  2017-04-20  8:13 [i-g-t PATCH 1/4] lib/igt_core: Add igt_exec helpers Abdiel Janulgue
@ 2017-04-20  8:13 ` Abdiel Janulgue
  2017-04-20  8:13 ` [i-g-t PATCH 3/4] lib/igt_debugfs: Add helper to return path to device Abdiel Janulgue
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 11+ messages in thread
From: Abdiel Janulgue @ 2017-04-20  8:13 UTC (permalink / raw)
  To: intel-gfx

Signed-off-by: Abdiel Janulgue <abdiel.janulgue@linux.intel.com>
---
 lib/igt_core.c | 24 ++++++++++++++++++++++++
 lib/igt_core.h |  3 +++
 2 files changed, 27 insertions(+)

diff --git a/lib/igt_core.c b/lib/igt_core.c
index 8a7ba0d..e80a32a 100644
--- a/lib/igt_core.c
+++ b/lib/igt_core.c
@@ -329,6 +329,30 @@ static void _igt_log_buffer_dump(void)
 	pthread_mutex_unlock(&log_buffer_mutex);
 }
 
+/**
+ * igt_log_buffer_inspect:
+ *
+ * Provides a way to replay the internal igt log buffer for inspection.
+ * @check: A user-specified handler that gets invoked for each line of
+           the log buffer. The handler should return true to stop
+           inspecting the rest of the buffer.
+ * @data: passed as a user argument to the inspection function.
+ */
+void igt_log_buffer_inspect(igt_buffer_log_handler_t check, void *data)
+{
+	uint8_t i;
+	pthread_mutex_lock(&log_buffer_mutex);
+
+	i = log_buffer.start;
+	do {
+		if (check(log_buffer.entries[i], data))
+			break;
+		i++;
+	} while (i != log_buffer.start && i != log_buffer.end);
+
+	pthread_mutex_unlock(&log_buffer_mutex);
+}
+
 __attribute__((format(printf, 1, 2)))
 static void kmsg(const char *format, ...)
 #define KERN_EMER	"<0>"
diff --git a/lib/igt_core.h b/lib/igt_core.h
index 6d4cf60..3e0d3c3 100644
--- a/lib/igt_core.h
+++ b/lib/igt_core.h
@@ -817,6 +817,9 @@ void igt_vlog(const char *domain, enum igt_log_level level, const char *format,
  */
 #define igt_critical(f...) igt_log(IGT_LOG_DOMAIN, IGT_LOG_CRITICAL, f)
 
+typedef bool (*igt_buffer_log_handler_t)(const char *line, void *data);
+void igt_log_buffer_inspect(igt_buffer_log_handler_t check, void *data);
+
 extern enum igt_log_level igt_log_level;
 
 /**
-- 
2.7.4

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [i-g-t PATCH 3/4] lib/igt_debugfs: Add helper to return path to device.
  2017-04-20  8:13 [i-g-t PATCH 1/4] lib/igt_core: Add igt_exec helpers Abdiel Janulgue
  2017-04-20  8:13 ` [i-g-t PATCH 2/4] igt/igt_core: Provide an option to check for the log buffer contents Abdiel Janulgue
@ 2017-04-20  8:13 ` Abdiel Janulgue
  2017-05-09 10:21   ` Petri Latvala
  2017-04-20  8:13 ` [i-g-t PATCH 4/4] Convert shell script tests to C version Abdiel Janulgue
  2017-05-09 10:18 ` [i-g-t PATCH 1/4] lib/igt_core: Add igt_exec helpers Petri Latvala
  3 siblings, 1 reply; 11+ messages in thread
From: Abdiel Janulgue @ 2017-04-20  8:13 UTC (permalink / raw)
  To: intel-gfx

Signed-off-by: Abdiel Janulgue <abdiel.janulgue@linux.intel.com>
---
 lib/igt_debugfs.c | 26 ++++++++++++++++++++++++++
 lib/igt_debugfs.h |  1 +
 2 files changed, 27 insertions(+)

diff --git a/lib/igt_debugfs.c b/lib/igt_debugfs.c
index 7584be5..b019c3b 100644
--- a/lib/igt_debugfs.c
+++ b/lib/igt_debugfs.c
@@ -22,6 +22,9 @@
  *
  */
 
+#ifndef ANDROID
+#define _GNU_SOURCE
+#endif
 #include <inttypes.h>
 #include <sys/stat.h>
 #include <sys/mount.h>
@@ -198,6 +201,29 @@ int igt_debugfs_dir(int device)
 	igt_debug("Opening debugfs directory '%s'\n", path);
 	return open(path, O_RDONLY);
 }
+\
+/**
+ * igt_debugfs_path:
+ * @device: fd of the device
+ *
+ * Returns:
+ * The path to the debugfs directory corresponding to device
+ */
+const char *igt_debugfs_path(int device)
+{
+	char *path = 0;
+
+	if (!path) {
+		char *linkname;
+		int debugfs;
+		igt_assert((debugfs = igt_debugfs_dir(device)) != -1);
+		igt_assert(path = calloc(PATH_MAX, sizeof(char)));
+		igt_assert(asprintf(&linkname, "/proc/self/fd/%d", debugfs) != -1);
+		igt_assert(readlink(linkname, path, PATH_MAX * sizeof(char)) != -1);
+	}
+
+	return path;
+}
 
 /**
  * igt_debugfs_open:
diff --git a/lib/igt_debugfs.h b/lib/igt_debugfs.h
index 7b846a8..76cf409 100644
--- a/lib/igt_debugfs.h
+++ b/lib/igt_debugfs.h
@@ -204,5 +204,6 @@ void igt_enable_prefault(void);
  */
 int igt_get_stable_obj_count(int driver);
 void igt_debugfs_dump(int device, const char *filename);
+const char *igt_debugfs_path(int device);
 
 #endif /* __IGT_DEBUGFS_H__ */
-- 
2.7.4

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [i-g-t PATCH 4/4] Convert shell script tests to C version
  2017-04-20  8:13 [i-g-t PATCH 1/4] lib/igt_core: Add igt_exec helpers Abdiel Janulgue
  2017-04-20  8:13 ` [i-g-t PATCH 2/4] igt/igt_core: Provide an option to check for the log buffer contents Abdiel Janulgue
  2017-04-20  8:13 ` [i-g-t PATCH 3/4] lib/igt_debugfs: Add helper to return path to device Abdiel Janulgue
@ 2017-04-20  8:13 ` Abdiel Janulgue
  2017-04-25  9:54   ` [i-g-t PATCH] Convert ddx_intel_after_fbdev to C Abdiel Janulgue
  2017-05-09 10:55   ` [i-g-t PATCH 4/4] Convert shell script tests to C version Petri Latvala
  2017-05-09 10:18 ` [i-g-t PATCH 1/4] lib/igt_core: Add igt_exec helpers Petri Latvala
  3 siblings, 2 replies; 11+ messages in thread
From: Abdiel Janulgue @ 2017-04-20  8:13 UTC (permalink / raw)
  To: intel-gfx; +Cc: Daniel Vetter

Converted:
 - check_drm_clients (ensures no other clients are running.
   functionality provided by drm_open_driver_master).
 - debugfs_emon_crash
 - debugfs_wedged
 - drv_debugfs_reader
 - sysfs_l3_parity
 - test_rte_check  (same as check_drm_clients)
 - tools_test
 - ZZ_check_dmesg

Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: Petri Latvala <petri.latvala@intel.com>
Signed-off-by: Abdiel Janulgue <abdiel.janulgue@linux.intel.com>
---
 tests/Makefile.sources   |   9 +---
 tests/ZZ_check_dmesg     |  11 -----
 tests/check_drm_clients  |   6 ---
 tests/debugfs.c          |  75 ++++++++++++++++++++++++++++++++
 tests/debugfs_emon_crash |  16 -------
 tests/debugfs_wedged     |  10 -----
 tests/drv_debugfs_reader |   9 ----
 tests/sysfs_l3_parity    |  22 ----------
 tests/test_rte_check     |   6 ---
 tests/tools.c            | 111 +++++++++++++++++++++++++++++++++++++++++++++++
 tests/tools_test         |  16 -------
 11 files changed, 188 insertions(+), 103 deletions(-)
 delete mode 100755 tests/ZZ_check_dmesg
 delete mode 100755 tests/check_drm_clients
 create mode 100644 tests/debugfs.c
 delete mode 100755 tests/debugfs_emon_crash
 delete mode 100755 tests/debugfs_wedged
 delete mode 100755 tests/drv_debugfs_reader
 delete mode 100755 tests/sysfs_l3_parity
 delete mode 100755 tests/test_rte_check
 create mode 100644 tests/tools.c
 delete mode 100755 tests/tools_test

diff --git a/tests/Makefile.sources b/tests/Makefile.sources
index 7fa9b8f..089428d 100644
--- a/tests/Makefile.sources
+++ b/tests/Makefile.sources
@@ -234,6 +234,8 @@ TESTS_progs = \
 	drv_module_reload \
 	kms_sysfs_edid_timing \
 	perf \
+	debugfs \
+	tools \
 	$(NULL)
 
 # IMPORTANT: The ZZ_ tests need to be run last!
@@ -242,11 +244,6 @@ TESTS_scripts_M = \
 	$(NULL)
 
 TESTS_scripts = \
-	debugfs_emon_crash \
-	drv_debugfs_reader \
-	sysfs_l3_parity \
-	test_rte_check \
-	tools_test \
 	$(NULL)
 
 # This target contains testcases which support automagic subtest enumeration
@@ -308,9 +305,7 @@ HANG = \
 	$(NULL)
 
 scripts = \
-	check_drm_clients \
 	ddx_intel_after_fbdev \
-	debugfs_wedged \
 	drm_lib.sh \
 	drm_getopt.sh \
 	$(NULL)
diff --git a/tests/ZZ_check_dmesg b/tests/ZZ_check_dmesg
deleted file mode 100755
index e28ba35..0000000
--- a/tests/ZZ_check_dmesg
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-
-if dmesg | grep '\*ERROR\*'  > /dev/null ; then
-	echo "DRM_ERROR dirt in dmesg"
-	exit 1
-fi
-
-if dmesg | grep -- '------\[ cut here \]----' > /dev/null  ; then
-	echo "found a backtrace in dmesg"
-	exit 1
-fi
diff --git a/tests/check_drm_clients b/tests/check_drm_clients
deleted file mode 100755
index 2a891b8..0000000
--- a/tests/check_drm_clients
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/bash
-
-SOURCE_DIR="$( dirname "${BASH_SOURCE[0]}" )"
-. $SOURCE_DIR/drm_lib.sh
-
-exit $IGT_EXIT_SUCCESS
diff --git a/tests/debugfs.c b/tests/debugfs.c
new file mode 100644
index 0000000..2e2f9bb
--- /dev/null
+++ b/tests/debugfs.c
@@ -0,0 +1,75 @@
+/*
+ * Copyright © 2017 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#include "igt.h"
+
+igt_main
+{
+	int fd = -1;
+	igt_skip_on_simulation();
+
+	igt_fixture {
+		fd = drm_open_driver_master(DRIVER_INTEL);
+		igt_require_gem(fd);
+	}
+
+	igt_subtest_group {
+		igt_subtest("debugfs_emon_crash") {
+			int i;
+			char *cmd;
+			igt_assert(asprintf(&cmd, "cat %s/i915_emon_status",
+					    igt_debugfs_path(fd)) != -1);
+
+			for (i = 0; i < 1000; i++)
+				igt_exec_quiet(cmd);
+
+			free(cmd);
+		}
+
+		igt_subtest("debugfs_wedged") {
+			char *c1, *c2;
+			igt_assert(asprintf(&c1, "echo 1 > %s/i915_wedged",
+					    igt_debugfs_path(fd)) != -1);
+			igt_assert(asprintf(&c2, "cat %s/i915_error_state",
+					    igt_debugfs_path(fd)) != -1);
+			igt_exec(c1);
+			igt_exec_quiet(c2);
+			free(c1);
+			free(c2);
+		}
+
+		igt_subtest("drv_debugfs_reader") {
+			char *cmd;
+			igt_assert(asprintf(&cmd, "cat %s/*",
+					    igt_debugfs_path(fd)) != -1);
+			igt_exec_quiet(cmd);
+			free(cmd);
+		}
+	}
+
+	igt_fixture {
+		close(fd);
+	}
+}
diff --git a/tests/debugfs_emon_crash b/tests/debugfs_emon_crash
deleted file mode 100755
index 1dbfcb2..0000000
--- a/tests/debugfs_emon_crash
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/bin/bash
-#
-# This check if we can crash the kernel with segmentation-fault
-# by reading /sys/kernel/debug/dri/0/i915_emon_status too quickly
-#
-
-SOURCE_DIR="$( dirname "${BASH_SOURCE[0]}" )"
-. $SOURCE_DIR/drm_lib.sh
-
-for z in $(seq 1 1000); do
-	cat $i915_dfs_path/i915_emon_status > /dev/null 2&>1
-done
-
-# If we got here, we haven't crashed
-
-exit $IGT_EXIT_SUCCESS
diff --git a/tests/debugfs_wedged b/tests/debugfs_wedged
deleted file mode 100755
index f15ac46..0000000
--- a/tests/debugfs_wedged
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/bash
-
-SOURCE_DIR="$( dirname "${BASH_SOURCE[0]}" )"
-. $SOURCE_DIR/drm_lib.sh
-
-# Testcase: wedge the hw to check the error_state reading
-# 
-# Unfortunately wedged is permanent, so this test is not run by default
-echo 1 > ${i915_dfs_path}/i915_wedged
-cat $i915_dfs_path/i915_error_state > /dev/null 2>&1
diff --git a/tests/drv_debugfs_reader b/tests/drv_debugfs_reader
deleted file mode 100755
index 6ea4e64..0000000
--- a/tests/drv_debugfs_reader
+++ /dev/null
@@ -1,9 +0,0 @@
-#!/bin/bash
-
-SOURCE_DIR="$( dirname "${BASH_SOURCE[0]}" )"
-. $SOURCE_DIR/drm_lib.sh
-
-# read everything we can
-cat $i915_dfs_path/* > /dev/null 2>&1
-
-exit $IGT_EXIT_SUCCESS
diff --git a/tests/sysfs_l3_parity b/tests/sysfs_l3_parity
deleted file mode 100755
index d5f3284..0000000
--- a/tests/sysfs_l3_parity
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/bin/bash
-
-SOURCE_DIR="$( dirname "${BASH_SOURCE[0]}" )"
-. $SOURCE_DIR/drm_lib.sh
-
-$SOURCE_DIR/../tools/intel_l3_parity -r 0 -b 0 -s 0 -e || exit $?
-
-#Check that we can remap a row
-$SOURCE_DIR/../tools/intel_l3_parity -r 0 -b 0 -s 0 -d
-disabled=`$SOURCE_DIR/../tools/intel_l3_parity -l | grep -c 'Row 0, Bank 0, Subbank 0 is disabled'`
-if [ "$disabled" != "1" ] ; then
-	echo "Fail"
-	exit $IGT_EXIT_FAILURE
-fi
-
-$SOURCE_DIR/../tools/intel_l3_parity -r 0 -b 0 -s 0 -e
-
-#Check that we can clear remaps
-if [ `$SOURCE_DIR/../tools/intel_l3_parity -l | wc -l` != 1 ] ; then
-	echo "Fail 2"
-	exit $IGT_EXIT_FAILURE
-fi
diff --git a/tests/test_rte_check b/tests/test_rte_check
deleted file mode 100755
index 2a891b8..0000000
--- a/tests/test_rte_check
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/bash
-
-SOURCE_DIR="$( dirname "${BASH_SOURCE[0]}" )"
-. $SOURCE_DIR/drm_lib.sh
-
-exit $IGT_EXIT_SUCCESS
diff --git a/tests/tools.c b/tests/tools.c
new file mode 100644
index 0000000..5fc784c
--- /dev/null
+++ b/tests/tools.c
@@ -0,0 +1,111 @@
+/*
+ * Copyright © 2017 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#include "igt.h"
+#include <stdio.h>
+
+/**
+ * Parse the r-value of a [cmd] string.
+ */
+static bool check_cmd_return_value(const char *s, void *data)
+{
+	int *val = data;
+	char *cmd, *found;
+	const char *delim = "[cmd]";
+	const int delim_len = strlen(delim);
+
+	if (!(cmd = strstr(s, delim)))
+		return false;
+
+	found = cmd + delim_len + 1;
+	igt_assert(delim_len + strlen(found) < strlen(cmd));
+
+	*val = atoi(found);
+	return true;
+}
+
+igt_main
+{
+	int fd = -1;
+	igt_skip_on_simulation();
+
+	igt_fixture {
+		/* Just make sure no other drm clients are running */
+		fd = drm_open_driver_master(DRIVER_INTEL);
+		igt_require_gem(fd);
+		close(fd);
+	}
+
+	igt_subtest_group {
+		igt_subtest("sysfs_l3_parity") {
+			char *cmd;
+			int exec_return;
+
+			igt_assert(asprintf(&cmd,
+					    "../tools/intel_l3_parity -l | "
+					    "grep -c 'Row 0, Bank 0, Subbank 0 "
+					    "is disabled'"));
+			exec_return = igt_exec(cmd);
+			free(cmd);
+			if (exec_return == IGT_EXIT_SUCCESS) {
+				int val = -1;
+				igt_log_buffer_inspect(check_cmd_return_value,
+						       &val);
+				igt_assert(val == 1);
+			} else {
+				igt_fail(IGT_EXIT_FAILURE);
+			}
+		}
+
+		igt_subtest("tools_test") {
+			char *cmd;
+
+			igt_assert(asprintf(&cmd,
+					    "../tools/intel_reg read 0x4030")
+				   != -1);
+			igt_assert(igt_exec_quiet(cmd) == IGT_EXIT_SUCCESS);
+			free(cmd);
+
+			igt_assert(asprintf(&cmd, "../tools/intel_reg dump")
+				   != -1);
+			igt_assert(igt_exec_quiet(cmd) == IGT_EXIT_SUCCESS);
+			free(cmd);
+		}
+
+		igt_subtest("ZZ_check_dmesg") {
+			char *cmd;
+			igt_assert(asprintf(&cmd, "dmesg | grep '\\*ERROR\\*'")
+				   != -1);
+			igt_assert(igt_exec_quiet(cmd) != IGT_EXIT_SUCCESS);
+			free(cmd);
+
+			igt_assert(asprintf(&cmd, "dmesg | grep "
+					    "-- '------\\[ cut here \\]----'")
+				   != -1);
+			igt_assert(igt_exec_quiet(cmd) != IGT_EXIT_SUCCESS);
+			free(cmd);
+		}
+	}
+}
diff --git a/tests/tools_test b/tests/tools_test
deleted file mode 100755
index a27fb87..0000000
--- a/tests/tools_test
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/bin/bash
-# Test some of the most critical tools we have accidentally broken before.
-# TODO: Possibly make tests parse output
-
-SOURCE_DIR="$( dirname "${BASH_SOURCE[0]}" )"
-. $SOURCE_DIR/drm_lib.sh
-
-# ARB_MODE has existed for many gens
-PATH=$SOURCE_DIR/../tools:$PATH
-do_or_die "intel_reg read 0x4030"
-do_or_die "intel_reg dump"
-
-# TODO: Add more tests
-
-exit $IGT_EXIT_SUCCESS
-
-- 
2.7.4

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [i-g-t PATCH] Convert ddx_intel_after_fbdev to C.
  2017-04-20  8:13 ` [i-g-t PATCH 4/4] Convert shell script tests to C version Abdiel Janulgue
@ 2017-04-25  9:54   ` Abdiel Janulgue
  2017-05-09 10:55   ` [i-g-t PATCH 4/4] Convert shell script tests to C version Petri Latvala
  1 sibling, 0 replies; 11+ messages in thread
From: Abdiel Janulgue @ 2017-04-25  9:54 UTC (permalink / raw)
  To: intel-gfx

Signed-off-by: Abdiel Janulgue <abdiel.janulgue@linux.intel.com>
---
 tests/Makefile.sources        |   1 +
 tests/ddx_intel_after_fbdev   |  73 -------------------------
 tests/ddx_intel_after_fbdev.c | 121 ++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 122 insertions(+), 73 deletions(-)
 delete mode 100755 tests/ddx_intel_after_fbdev
 create mode 100644 tests/ddx_intel_after_fbdev.c

diff --git a/tests/Makefile.sources b/tests/Makefile.sources
index f646050..80cb02b 100644
--- a/tests/Makefile.sources
+++ b/tests/Makefile.sources
@@ -235,6 +235,7 @@ TESTS_progs = \
 	perf \
 	debugfs \
 	tools \
+	ddx_intel_after_fbdev \
 	$(NULL)
 
 # IMPORTANT: The ZZ_ tests need to be run last!
diff --git a/tests/ddx_intel_after_fbdev b/tests/ddx_intel_after_fbdev
deleted file mode 100755
index f068209..0000000
--- a/tests/ddx_intel_after_fbdev
+++ /dev/null
@@ -1,73 +0,0 @@
-#!/bin/bash
-#
-# Testcase: Load Intel DDX after fbdev was loaded
-#
-
-whoami | grep -q root || {
-	echo "ERROR: not running as root"
-	exit 1
-}
-
-# no other X session should be running
-find /tmp/ -name .X*lock 2>/dev/null | grep -q X && {
-	echo "ERROR: X session already running"
-	exit 1
-}
-
-TMPDIR=$(mktemp -d /tmp/igt.XXXX) || {
-	echo "ERROR: Failed to create temp dir"
-	exit 1
-}
-
-cat > $TMPDIR/xorg.conf.fbdev << EOF
-Section "Device"
-	Driver		"fbdev"
-	Identifier 	"Device[fbdev]"
-EndSection
-EOF
-
-cat > $TMPDIR/xorg.conf.intel << EOF
-Section "Device"
-	Driver		"intel"
-	Identifier 	"Device[intel]"
-EndSection
-EOF
-
-# log before fbdev
-dmesg -c > $TMPDIR/dmesg.1.before.fbdev
-cp /var/log/Xorg.0.log $TMPDIR/Xorg.0.log.1.before.fbdev
-
-# run fbdev
-xinit -- /usr/bin/X -config $TMPDIR/xorg.conf.fbdev & 
-sleep 5
-if [ -f `which intel_reg` ]; then
-`which intel_reg` dump > $TMPDIR/intel_reg_dump.1.fbdev
-fi
-killall X
-
-# log after fbdev & before intel
-dmesg -c > $TMPDIR/dmesg.2.after.fbdev.before.intel
-cp /var/log/Xorg.0.log $TMPDIR/Xorg.0.log.2.after.fbdev.before.intel
-
-sleep 5
-
-# run intel
-xinit -- /usr/bin/X -config $TMPDIR/xorg.conf.intel & 
-sleep 5 
-if [ -f `which intel_reg` ]; then
-`which intel_reg` dump > $TMPDIR/intel_reg_dump.2.intel
-fi
-killall X
-
-# log after intel
-dmesg -c > $TMPDIR/dmesg.3.after.intel
-cp /var/log/Xorg.0.log $TMPDIR/Xorg.0.log.3.after.intel
-
-cp $0 $TMPDIR/
-
-tar czf $TMPDIR.tar.gz $TMPDIR/*
-if [ -f $TMPDIR.tar.gz ]; then
-	echo $TMPDIR.tar.gz contains this script, all configs and logs generated on this tests
-fi
-
-exit 0
diff --git a/tests/ddx_intel_after_fbdev.c b/tests/ddx_intel_after_fbdev.c
new file mode 100644
index 0000000..8049a1a
--- /dev/null
+++ b/tests/ddx_intel_after_fbdev.c
@@ -0,0 +1,121 @@
+/*
+ * Copyright © 2017 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#include "igt.h"
+#include <unistd.h>
+#include <sys/types.h>
+
+#define exec_cmd(status, format...) \
+	do { \
+		char *buf = 0; \
+		igt_assert(asprintf(&buf, format) != -1); \
+	        status = igt_exec(buf); \
+		free(buf); \
+	} while (0)
+
+int main(int argc, char **argv)
+{
+	int status;
+	FILE *file;
+	char *path;
+	const char xorg_fbdev[] =
+		"Section  \"Device\"\n"
+		"          Driver        \"fbdev\"\n"
+		"          Identifier 	 \"Device[fbdev]\"\n"
+		"EndSection\n";
+	const char xorg_intel[] =
+		"Section   \"Device\"\n"
+		"          Driver        \"intel\"\n"
+		"          Identifier 	 \"Device[intel]\"\n"
+		"EndSection\n";
+	char *tmpdir = strdup("/tmp/igt.XXXXXX");
+
+	igt_skip_on_simulation();
+
+	igt_assert_f(getuid() == 0, "ERROR: not running as root\n");
+
+	igt_assert_f(igt_exec_quiet("find /tmp/ -name .X*lock | grep -q X")
+		     != IGT_EXIT_SUCCESS,
+		     "ERROR: X session already running\n");
+
+	igt_assert_f(mkdtemp(tmpdir) != NULL,
+		     "ERROR: Failed to create temp dir\n");
+
+	/* config files */
+	igt_assert(asprintf(&path, "%s/xorg.conf.fbdev", tmpdir) != -1);
+	igt_assert((file = fopen(path, "w")) != NULL);
+	fwrite(xorg_fbdev, 1, sizeof(xorg_fbdev), file);
+	free(path);
+	fclose(file);
+
+	igt_assert(asprintf(&path, "%s/xorg.conf.intel", tmpdir) != -1);
+	igt_assert((file = fopen(path, "w")) != NULL);
+	fwrite(xorg_intel, 1, sizeof(xorg_intel), file);
+	free(path);
+	fclose(file);
+
+	/* log before fbdev */
+	exec_cmd(status, "dmesg -c > %s/dmesg.1.before.fbdev", tmpdir);
+	exec_cmd(status, "cp /var/log/Xorg.0.log "
+			   "%s/Xorg.0.log.1.before.fbdev", tmpdir);
+
+	/* run fbdev */
+	exec_cmd(status, "xinit -- /usr/bin/X -config "
+			   "%s/xorg.conf.fbdev &", tmpdir);
+	sleep(5);
+	exec_cmd(status, "../tools/intel_reg dump > "
+			   "%s/intel_reg_dump.1.fbdev", tmpdir);
+	igt_exec_quiet("killall -r X");
+
+	/* log after fbdev & before intel */
+	exec_cmd(status, "dmesg -c > %s/dmesg.2.after.fbdev.before.intel",
+		 tmpdir);
+	exec_cmd(status, "cp /var/log/Xorg.0.log "
+		 "%s/Xorg.0.log.2.after.fbdev.before.intel", tmpdir);
+	sleep(5);
+
+	/* run intel */
+	exec_cmd(status, "xinit -- /usr/bin/X -config "
+			   "%s/xorg.conf.intel &", tmpdir);
+	sleep(5);
+	igt_exec_quiet("killall -r X");
+	sleep(1);
+	exec_cmd(status, "../tools/intel_reg dump > "
+			   "%s/intel_reg_dump.2.intel", tmpdir);
+
+	/* log after intel */
+	exec_cmd(status, "dmesg -c > %s/dmesg.3.after.intel", tmpdir);
+	exec_cmd(status, "cp /var/log/Xorg.0.log %s/Xorg.0.log.3.after.intel",
+		 tmpdir);
+
+	exec_cmd(status, "tar czf %s.tar.gz %s/*", tmpdir, tmpdir);
+	if (status == IGT_EXIT_SUCCESS) {
+		igt_info("%s.tar.gz contains this script, all configs "
+			 "and logs generated on this tests\n", tmpdir);
+	}
+	free(tmpdir);
+
+	igt_exit();
+}
-- 
2.7.4

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [i-g-t PATCH 1/4] lib/igt_core: Add igt_exec helpers
  2017-04-20  8:13 [i-g-t PATCH 1/4] lib/igt_core: Add igt_exec helpers Abdiel Janulgue
                   ` (2 preceding siblings ...)
  2017-04-20  8:13 ` [i-g-t PATCH 4/4] Convert shell script tests to C version Abdiel Janulgue
@ 2017-05-09 10:18 ` Petri Latvala
  2017-05-10 12:10   ` Abdiel Janulgue
  3 siblings, 1 reply; 11+ messages in thread
From: Petri Latvala @ 2017-05-09 10:18 UTC (permalink / raw)
  To: Abdiel Janulgue; +Cc: intel-gfx

On Thu, Apr 20, 2017 at 11:13:45AM +0300, Abdiel Janulgue wrote:
> Support executing external processes with the goal of capturing its
> standard streams to the igt logging infrastructure in addition to its
> exit status.
> 
> Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
> Cc: Petri Latvala <petri.latvala@intel.com>
> Signed-off-by: Abdiel Janulgue <abdiel.janulgue@linux.intel.com>
> ---
>  lib/igt_core.c | 151 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  lib/igt_core.h |   3 ++
>  2 files changed, 154 insertions(+)
> 
> diff --git a/lib/igt_core.c b/lib/igt_core.c
> index 403b942..8a7ba0d 100644
> --- a/lib/igt_core.c
> +++ b/lib/igt_core.c
> @@ -2073,3 +2073,154 @@ FILE *__igt_fopen_data(const char* igt_srcdir, const char* igt_datadir,
>  
>  	return fp;
>  }
> +
> +struct output_pipe {
> +	int output_fd;
> +	int save_fd;
> +	int read_fd;
> +	int write_fd;
> +	bool redirected;
> +	enum igt_log_level log_level;
> +};
> +
> +static bool redirect_output(struct output_pipe *p, int output_fd,
> +			    enum igt_log_level level)
> +{
> +	int fds[2], flags;
> +
> +	if (pipe(fds) == -1)
> +		return false;


If this succeeds....


> +
> +	if ((flags = fcntl(fds[0], F_GETFL) == -1))
> +		return false;
> +
> +	flags |= O_NONBLOCK;
> +	if (fcntl(fds[0], F_SETFL, flags) == -1)
> +		return false;
> +
> +	/* save output */
> +	if ((p->save_fd = dup(output_fd)) == -1)
> +		return false;
> +
> +	/* Redirect output to our buffer */
> +	if (dup2(fds[1], output_fd) == -1)
> +		return false;

.... and these don't, the pipe fds are never closed.

Same for the save_fd if the dup2 fails, if the caller of this function
doesn't call unredirect_output, as the return value might direct it.


> +
> +	p->output_fd = output_fd;
> +	p->read_fd = fds[0];
> +	p->write_fd = fds[1];
> +	p->redirected = true;
> +	p->log_level = level;
> +
> +	return true;
> +}
> +
> +static bool unredirect_output(struct output_pipe *p)
> +{
> +	close(p->write_fd);
> +	if (dup2(p->save_fd, p->output_fd) == -1)
> +		return false;
> +	close(p->save_fd);
> +
> +	p->redirected = false;
> +
> +	return true;
> +}
> +
> +/**
> + * igt_exec:
> + *
> + * Executes the shell command specified in @command and capture its stdout and
> + * stderr to igt_log or igt_warn respectively.
> + *
> + * Returns: The exit status of the executed process. -1 for failure.
> + */
> +int igt_exec(const char *command)
> +{
> +#define OUT 0
> +#define ERR 1
> +	struct output_pipe op[2];
> +	int i, sel_fd, status;
> +	fd_set fds;
> +	struct timeval timeout = { .tv_sec = 0, .tv_usec = 0 };
> +	char buf[PIPE_BUF];
> +
> +	if (!redirect_output(&op[OUT], STDOUT_FILENO, IGT_LOG_INFO))
> +		return -1;
> +	if (!redirect_output(&op[ERR], STDERR_FILENO, IGT_LOG_WARN))
> +		return -1;


If redirect_output for stderr returns false, unredirect_output for
stdout will not get called.

> +
> +	if ((status = system(command)) == -1)
> +		return -1;
> +
> +	FD_ZERO(&fds);
> +	FD_SET(op[OUT].read_fd, &fds);
> +	FD_SET(op[ERR].read_fd, &fds);
> +
> +	sel_fd = max(op[OUT].read_fd, op[ERR].read_fd);
> +	if (select(sel_fd + 1, &fds, NULL, NULL, &timeout) == -1)
> +		return -1;
> +
> +	for (i = 0; i < ARRAY_SIZE(op); i++) {
> +		struct output_pipe *current = &op[i];
> +
> +		if (!FD_ISSET(current->read_fd, &fds)) {
> +			close(current->read_fd);
> +			if (!unredirect_output(current))
> +				return -1;
> +			continue;
> +		}
> +
> +		memset(buf, 0, sizeof(buf));
> +		while (read(current->read_fd, buf, sizeof(buf)) > 0) {
> +			if (current->redirected) {
> +				if (!unredirect_output(current))
> +					return -1;
> +			}
> +			igt_log(IGT_LOG_DOMAIN, current->log_level,
> +				"[cmd] %s", buf);
> +			memset(buf, 0, sizeof(buf));
> +		}
> +		close(current->read_fd);
> +	}


Unredirect_output calls for both pipes need to be called on all exit
paths.

In redirect_output you set only the read fd of the pipe() pair to
O_NONBLOCK. That will make the executed command block on its writes
indefinitely if it prints more than whatsitnow, 64kB?



> +
> +	return WEXITSTATUS(status);
> +}
> +
> +/**
> + * igt_exec_quiet:
> + * Similar to igt_exec(), except redirect output to /dev/null
> + *
> + * Returns: The exit status of the executed process. -1 for failure.
> + */
> +int igt_exec_quiet(const char *command)
> +{
> +	int stderr_fd_copy, stdout_fd_copy, status, nullfd;
> +
> +	/* redirect */
> +	if ((nullfd = open("/dev/null", O_WRONLY)) == -1)
> +		return -1;
> +	if ((stdout_fd_copy = dup(STDOUT_FILENO)) == -1)
> +		return -1;
> +	if ((stderr_fd_copy = dup(STDERR_FILENO)) == -1)
> +		return -1;
> +
> +	if (dup2(nullfd, STDOUT_FILENO) == -1)
> +		return -1;
> +	if (dup2(nullfd, STDERR_FILENO) == -1)
> +		return -1;
> +
> +	if ((status = system(command)) == -1)
> +		return -1;
> +
> +	/* restore */
> +	if (dup2(stdout_fd_copy, STDOUT_FILENO) == -1)
> +		return -1;
> +	if (dup2(stderr_fd_copy, STDERR_FILENO) == -1)
> +		return -1;
> +
> +	close(stdout_fd_copy);
> +	close(stderr_fd_copy);


Same fd leaks here, all exit paths should close the opened fds.




--
Petri Latvala



> +
> +	return WEXITSTATUS(status);
> +}
> diff --git a/lib/igt_core.h b/lib/igt_core.h
> index 51b98d8..6d4cf60 100644
> --- a/lib/igt_core.h
> +++ b/lib/igt_core.h
> @@ -918,4 +918,7 @@ FILE *__igt_fopen_data(const char* igt_srcdir, const char* igt_datadir,
>  #define igt_fopen_data(filename) \
>  	__igt_fopen_data(IGT_SRCDIR, IGT_DATADIR, filename)
>  
> +int igt_exec(const char *command);
> +int igt_exec_quiet(const char *command);
> +
>  #endif /* IGT_CORE_H */
> -- 
> 2.7.4
> 
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [i-g-t PATCH 3/4] lib/igt_debugfs: Add helper to return path to device.
  2017-04-20  8:13 ` [i-g-t PATCH 3/4] lib/igt_debugfs: Add helper to return path to device Abdiel Janulgue
@ 2017-05-09 10:21   ` Petri Latvala
  0 siblings, 0 replies; 11+ messages in thread
From: Petri Latvala @ 2017-05-09 10:21 UTC (permalink / raw)
  To: Abdiel Janulgue; +Cc: intel-gfx

On Thu, Apr 20, 2017 at 11:13:47AM +0300, Abdiel Janulgue wrote:
> Signed-off-by: Abdiel Janulgue <abdiel.janulgue@linux.intel.com>
> ---
>  lib/igt_debugfs.c | 26 ++++++++++++++++++++++++++
>  lib/igt_debugfs.h |  1 +
>  2 files changed, 27 insertions(+)
> 
> diff --git a/lib/igt_debugfs.c b/lib/igt_debugfs.c
> index 7584be5..b019c3b 100644
> --- a/lib/igt_debugfs.c
> +++ b/lib/igt_debugfs.c
> @@ -22,6 +22,9 @@
>   *
>   */
>  
> +#ifndef ANDROID
> +#define _GNU_SOURCE
> +#endif
>  #include <inttypes.h>
>  #include <sys/stat.h>
>  #include <sys/mount.h>
> @@ -198,6 +201,29 @@ int igt_debugfs_dir(int device)
>  	igt_debug("Opening debugfs directory '%s'\n", path);
>  	return open(path, O_RDONLY);
>  }
> +\
> +/**
> + * igt_debugfs_path:
> + * @device: fd of the device
> + *
> + * Returns:
> + * The path to the debugfs directory corresponding to device
> + */
> +const char *igt_debugfs_path(int device)
> +{





> +	char *path = 0;
> +
> +	if (!path) {


??




--
Petri Latvala





> +		char *linkname;
> +		int debugfs;
> +		igt_assert((debugfs = igt_debugfs_dir(device)) != -1);
> +		igt_assert(path = calloc(PATH_MAX, sizeof(char)));
> +		igt_assert(asprintf(&linkname, "/proc/self/fd/%d", debugfs) != -1);
> +		igt_assert(readlink(linkname, path, PATH_MAX * sizeof(char)) != -1);
> +	}
> +
> +	return path;
> +}
>  
>  /**
>   * igt_debugfs_open:
> diff --git a/lib/igt_debugfs.h b/lib/igt_debugfs.h
> index 7b846a8..76cf409 100644
> --- a/lib/igt_debugfs.h
> +++ b/lib/igt_debugfs.h
> @@ -204,5 +204,6 @@ void igt_enable_prefault(void);
>   */
>  int igt_get_stable_obj_count(int driver);
>  void igt_debugfs_dump(int device, const char *filename);
> +const char *igt_debugfs_path(int device);
>  
>  #endif /* __IGT_DEBUGFS_H__ */
> -- 
> 2.7.4
> 
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [i-g-t PATCH 4/4] Convert shell script tests to C version
  2017-04-20  8:13 ` [i-g-t PATCH 4/4] Convert shell script tests to C version Abdiel Janulgue
  2017-04-25  9:54   ` [i-g-t PATCH] Convert ddx_intel_after_fbdev to C Abdiel Janulgue
@ 2017-05-09 10:55   ` Petri Latvala
  1 sibling, 0 replies; 11+ messages in thread
From: Petri Latvala @ 2017-05-09 10:55 UTC (permalink / raw)
  To: Abdiel Janulgue; +Cc: intel-gfx

On Thu, Apr 20, 2017 at 11:13:48AM +0300, Abdiel Janulgue wrote:
> Converted:
>  - check_drm_clients (ensures no other clients are running.
>    functionality provided by drm_open_driver_master).
>  - debugfs_emon_crash
>  - debugfs_wedged
>  - drv_debugfs_reader
>  - sysfs_l3_parity
>  - test_rte_check  (same as check_drm_clients)
>  - tools_test
>  - ZZ_check_dmesg
> 
> Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
> Cc: Petri Latvala <petri.latvala@intel.com>
> Signed-off-by: Abdiel Janulgue <abdiel.janulgue@linux.intel.com>
> ---
>  tests/Makefile.sources   |   9 +---
>  tests/ZZ_check_dmesg     |  11 -----
>  tests/check_drm_clients  |   6 ---
>  tests/debugfs.c          |  75 ++++++++++++++++++++++++++++++++
>  tests/debugfs_emon_crash |  16 -------
>  tests/debugfs_wedged     |  10 -----
>  tests/drv_debugfs_reader |   9 ----
>  tests/sysfs_l3_parity    |  22 ----------
>  tests/test_rte_check     |   6 ---
>  tests/tools.c            | 111 +++++++++++++++++++++++++++++++++++++++++++++++
>  tests/tools_test         |  16 -------
>  11 files changed, 188 insertions(+), 103 deletions(-)
>  delete mode 100755 tests/ZZ_check_dmesg
>  delete mode 100755 tests/check_drm_clients
>  create mode 100644 tests/debugfs.c
>  delete mode 100755 tests/debugfs_emon_crash
>  delete mode 100755 tests/debugfs_wedged
>  delete mode 100755 tests/drv_debugfs_reader
>  delete mode 100755 tests/sysfs_l3_parity
>  delete mode 100755 tests/test_rte_check
>  create mode 100644 tests/tools.c
>  delete mode 100755 tests/tools_test
> 
> diff --git a/tests/Makefile.sources b/tests/Makefile.sources
> index 7fa9b8f..089428d 100644
> --- a/tests/Makefile.sources
> +++ b/tests/Makefile.sources
> @@ -234,6 +234,8 @@ TESTS_progs = \
>  	drv_module_reload \
>  	kms_sysfs_edid_timing \
>  	perf \
> +	debugfs \
> +	tools \
>  	$(NULL)
>  
>  # IMPORTANT: The ZZ_ tests need to be run last!
> @@ -242,11 +244,6 @@ TESTS_scripts_M = \
>  	$(NULL)
>  
>  TESTS_scripts = \
> -	debugfs_emon_crash \
> -	drv_debugfs_reader \
> -	sysfs_l3_parity \
> -	test_rte_check \
> -	tools_test \
>  	$(NULL)
>  
>  # This target contains testcases which support automagic subtest enumeration
> @@ -308,9 +305,7 @@ HANG = \
>  	$(NULL)
>  
>  scripts = \
> -	check_drm_clients \
>  	ddx_intel_after_fbdev \
> -	debugfs_wedged \
>  	drm_lib.sh \
>  	drm_getopt.sh \
>  	$(NULL)
> diff --git a/tests/ZZ_check_dmesg b/tests/ZZ_check_dmesg
> deleted file mode 100755
> index e28ba35..0000000
> --- a/tests/ZZ_check_dmesg
> +++ /dev/null
> @@ -1,11 +0,0 @@
> -#!/bin/sh
> -
> -if dmesg | grep '\*ERROR\*'  > /dev/null ; then
> -	echo "DRM_ERROR dirt in dmesg"
> -	exit 1
> -fi
> -
> -if dmesg | grep -- '------\[ cut here \]----' > /dev/null  ; then
> -	echo "found a backtrace in dmesg"
> -	exit 1
> -fi
> diff --git a/tests/check_drm_clients b/tests/check_drm_clients
> deleted file mode 100755
> index 2a891b8..0000000
> --- a/tests/check_drm_clients
> +++ /dev/null
> @@ -1,6 +0,0 @@
> -#!/bin/bash
> -
> -SOURCE_DIR="$( dirname "${BASH_SOURCE[0]}" )"
> -. $SOURCE_DIR/drm_lib.sh
> -
> -exit $IGT_EXIT_SUCCESS
> diff --git a/tests/debugfs.c b/tests/debugfs.c
> new file mode 100644
> index 0000000..2e2f9bb
> --- /dev/null
> +++ b/tests/debugfs.c
> @@ -0,0 +1,75 @@
> +/*
> + * Copyright © 2017 Intel Corporation
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a
> + * copy of this software and associated documentation files (the "Software"),
> + * to deal in the Software without restriction, including without limitation
> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
> + * and/or sell copies of the Software, and to permit persons to whom the
> + * Software is furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice (including the next
> + * paragraph) shall be included in all copies or substantial portions of the
> + * Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
> + * IN THE SOFTWARE.
> + */
> +#ifdef HAVE_CONFIG_H
> +#include "config.h"
> +#endif
> +#include "igt.h"
> +
> +igt_main
> +{
> +	int fd = -1;
> +	igt_skip_on_simulation();
> +
> +	igt_fixture {
> +		fd = drm_open_driver_master(DRIVER_INTEL);
> +		igt_require_gem(fd);
> +	}
> +
> +	igt_subtest_group {
> +		igt_subtest("debugfs_emon_crash") {


These subtest names lead to redundant naming. This one for example
becomes igt@debugfs@debugfs_emon_crash.


> +			int i;
> +			char *cmd;
> +			igt_assert(asprintf(&cmd, "cat %s/i915_emon_status",
> +					    igt_debugfs_path(fd)) != -1);
> +
> +			for (i = 0; i < 1000; i++)
> +				igt_exec_quiet(cmd);


When converted to C, there's really no reason to keep using cat to
read the file here.


> +
> +			free(cmd);
> +		}
> +
> +		igt_subtest("debugfs_wedged") {
> +			char *c1, *c2;
> +			igt_assert(asprintf(&c1, "echo 1 > %s/i915_wedged",
> +					    igt_debugfs_path(fd)) != -1);
> +			igt_assert(asprintf(&c2, "cat %s/i915_error_state",
> +					    igt_debugfs_path(fd)) != -1);
> +			igt_exec(c1);
> +			igt_exec_quiet(c2);

Same here. This could also use some documentation to explain _how_
this test behaves on a working kernel and a broken kernel. AFAICS it's
the reading of i915_error_state file that explodes on a broken kernel,
reported by the original script by the magic of the 'cat' of
i915_error_state being the last command in the script? This C version
doesn't check whether the reading of the file succeeds.



> +			free(c1);
> +			free(c2);
> +		}
> +
> +		igt_subtest("drv_debugfs_reader") {
> +			char *cmd;
> +			igt_assert(asprintf(&cmd, "cat %s/*",
> +					    igt_debugfs_path(fd)) != -1);
> +			igt_exec_quiet(cmd);

Same cat comment here.



> +			free(cmd);
> +		}
> +	}
> +
> +	igt_fixture {
> +		close(fd);
> +	}
> +}
> diff --git a/tests/debugfs_emon_crash b/tests/debugfs_emon_crash
> deleted file mode 100755
> index 1dbfcb2..0000000
> --- a/tests/debugfs_emon_crash
> +++ /dev/null
> @@ -1,16 +0,0 @@
> -#!/bin/bash
> -#
> -# This check if we can crash the kernel with segmentation-fault
> -# by reading /sys/kernel/debug/dri/0/i915_emon_status too quickly
> -#
> -
> -SOURCE_DIR="$( dirname "${BASH_SOURCE[0]}" )"
> -. $SOURCE_DIR/drm_lib.sh
> -
> -for z in $(seq 1 1000); do
> -	cat $i915_dfs_path/i915_emon_status > /dev/null 2&>1
> -done
> -
> -# If we got here, we haven't crashed
> -
> -exit $IGT_EXIT_SUCCESS
> diff --git a/tests/debugfs_wedged b/tests/debugfs_wedged
> deleted file mode 100755
> index f15ac46..0000000
> --- a/tests/debugfs_wedged
> +++ /dev/null
> @@ -1,10 +0,0 @@
> -#!/bin/bash
> -
> -SOURCE_DIR="$( dirname "${BASH_SOURCE[0]}" )"
> -. $SOURCE_DIR/drm_lib.sh
> -
> -# Testcase: wedge the hw to check the error_state reading
> -# 
> -# Unfortunately wedged is permanent, so this test is not run by default
> -echo 1 > ${i915_dfs_path}/i915_wedged
> -cat $i915_dfs_path/i915_error_state > /dev/null 2>&1
> diff --git a/tests/drv_debugfs_reader b/tests/drv_debugfs_reader
> deleted file mode 100755
> index 6ea4e64..0000000
> --- a/tests/drv_debugfs_reader
> +++ /dev/null
> @@ -1,9 +0,0 @@
> -#!/bin/bash
> -
> -SOURCE_DIR="$( dirname "${BASH_SOURCE[0]}" )"
> -. $SOURCE_DIR/drm_lib.sh
> -
> -# read everything we can
> -cat $i915_dfs_path/* > /dev/null 2>&1
> -
> -exit $IGT_EXIT_SUCCESS
> diff --git a/tests/sysfs_l3_parity b/tests/sysfs_l3_parity
> deleted file mode 100755
> index d5f3284..0000000
> --- a/tests/sysfs_l3_parity
> +++ /dev/null
> @@ -1,22 +0,0 @@
> -#!/bin/bash
> -
> -SOURCE_DIR="$( dirname "${BASH_SOURCE[0]}" )"
> -. $SOURCE_DIR/drm_lib.sh
> -
> -$SOURCE_DIR/../tools/intel_l3_parity -r 0 -b 0 -s 0 -e || exit $?
> -
> -#Check that we can remap a row
> -$SOURCE_DIR/../tools/intel_l3_parity -r 0 -b 0 -s 0 -d
> -disabled=`$SOURCE_DIR/../tools/intel_l3_parity -l | grep -c 'Row 0, Bank 0, Subbank 0 is disabled'`
> -if [ "$disabled" != "1" ] ; then
> -	echo "Fail"
> -	exit $IGT_EXIT_FAILURE
> -fi
> -
> -$SOURCE_DIR/../tools/intel_l3_parity -r 0 -b 0 -s 0 -e
> -
> -#Check that we can clear remaps
> -if [ `$SOURCE_DIR/../tools/intel_l3_parity -l | wc -l` != 1 ] ; then
> -	echo "Fail 2"
> -	exit $IGT_EXIT_FAILURE
> -fi
> diff --git a/tests/test_rte_check b/tests/test_rte_check
> deleted file mode 100755
> index 2a891b8..0000000
> --- a/tests/test_rte_check
> +++ /dev/null
> @@ -1,6 +0,0 @@
> -#!/bin/bash
> -
> -SOURCE_DIR="$( dirname "${BASH_SOURCE[0]}" )"
> -. $SOURCE_DIR/drm_lib.sh
> -
> -exit $IGT_EXIT_SUCCESS
> diff --git a/tests/tools.c b/tests/tools.c
> new file mode 100644
> index 0000000..5fc784c
> --- /dev/null
> +++ b/tests/tools.c
> @@ -0,0 +1,111 @@
> +/*
> + * Copyright © 2017 Intel Corporation
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a
> + * copy of this software and associated documentation files (the "Software"),
> + * to deal in the Software without restriction, including without limitation
> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
> + * and/or sell copies of the Software, and to permit persons to whom the
> + * Software is furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice (including the next
> + * paragraph) shall be included in all copies or substantial portions of the
> + * Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
> + * IN THE SOFTWARE.
> + */
> +#ifdef HAVE_CONFIG_H
> +#include "config.h"
> +#endif
> +#include "igt.h"
> +#include <stdio.h>
> +
> +/**
> + * Parse the r-value of a [cmd] string.
> + */
> +static bool check_cmd_return_value(const char *s, void *data)
> +{
> +	int *val = data;
> +	char *cmd, *found;
> +	const char *delim = "[cmd]";
> +	const int delim_len = strlen(delim);
> +
> +	if (!(cmd = strstr(s, delim)))
> +		return false;
> +
> +	found = cmd + delim_len + 1;
> +	igt_assert(delim_len + strlen(found) < strlen(cmd));
> +
> +	*val = atoi(found);
> +	return true;
> +}
> +
> +igt_main
> +{
> +	int fd = -1;
> +	igt_skip_on_simulation();
> +
> +	igt_fixture {
> +		/* Just make sure no other drm clients are running */
> +		fd = drm_open_driver_master(DRIVER_INTEL);
> +		igt_require_gem(fd);
> +		close(fd);
> +	}
> +
> +	igt_subtest_group {
> +		igt_subtest("sysfs_l3_parity") {
> +			char *cmd;
> +			int exec_return;
> +
> +			igt_assert(asprintf(&cmd,
> +					    "../tools/intel_l3_parity -l | "
> +					    "grep -c 'Row 0, Bank 0, Subbank 0 "
> +					    "is disabled'"));
> +			exec_return = igt_exec(cmd);
> +			free(cmd);
> +			if (exec_return == IGT_EXIT_SUCCESS) {
> +				int val = -1;
> +				igt_log_buffer_inspect(check_cmd_return_value,
> +						       &val);
> +				igt_assert(val == 1);
> +			} else {
> +				igt_fail(IGT_EXIT_FAILURE);
> +			}
> +		}
> +
> +		igt_subtest("tools_test") {
> +			char *cmd;
> +
> +			igt_assert(asprintf(&cmd,
> +					    "../tools/intel_reg read 0x4030")
> +				   != -1);
> +			igt_assert(igt_exec_quiet(cmd) == IGT_EXIT_SUCCESS);
> +			free(cmd);
> +
> +			igt_assert(asprintf(&cmd, "../tools/intel_reg dump")
> +				   != -1);

intel_reg can be used without i915.ko loaded, but the fixture above
requires it.



--
Petri Latvala




> +			igt_assert(igt_exec_quiet(cmd) == IGT_EXIT_SUCCESS);
> +			free(cmd);
> +		}
> +
> +		igt_subtest("ZZ_check_dmesg") {
> +			char *cmd;
> +			igt_assert(asprintf(&cmd, "dmesg | grep '\\*ERROR\\*'")
> +				   != -1);
> +			igt_assert(igt_exec_quiet(cmd) != IGT_EXIT_SUCCESS);
> +			free(cmd);
> +
> +			igt_assert(asprintf(&cmd, "dmesg | grep "
> +					    "-- '------\\[ cut here \\]----'")
> +				   != -1);
> +			igt_assert(igt_exec_quiet(cmd) != IGT_EXIT_SUCCESS);
> +			free(cmd);
> +		}
> +	}
> +}
> diff --git a/tests/tools_test b/tests/tools_test
> deleted file mode 100755
> index a27fb87..0000000
> --- a/tests/tools_test
> +++ /dev/null
> @@ -1,16 +0,0 @@
> -#!/bin/bash
> -# Test some of the most critical tools we have accidentally broken before.
> -# TODO: Possibly make tests parse output
> -
> -SOURCE_DIR="$( dirname "${BASH_SOURCE[0]}" )"
> -. $SOURCE_DIR/drm_lib.sh
> -
> -# ARB_MODE has existed for many gens
> -PATH=$SOURCE_DIR/../tools:$PATH
> -do_or_die "intel_reg read 0x4030"
> -do_or_die "intel_reg dump"
> -
> -# TODO: Add more tests
> -
> -exit $IGT_EXIT_SUCCESS
> -
> -- 
> 2.7.4
> 
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [i-g-t PATCH 1/4] lib/igt_core: Add igt_exec helpers
  2017-05-09 10:18 ` [i-g-t PATCH 1/4] lib/igt_core: Add igt_exec helpers Petri Latvala
@ 2017-05-10 12:10   ` Abdiel Janulgue
  2017-05-10 12:14     ` Petri Latvala
  0 siblings, 1 reply; 11+ messages in thread
From: Abdiel Janulgue @ 2017-05-10 12:10 UTC (permalink / raw)
  To: Petri Latvala; +Cc: intel-gfx



On 09.05.2017 13:18, Petri Latvala wrote:

snip 8<   -----
>> +		memset(buf, 0, sizeof(buf));
>> +		while (read(current->read_fd, buf, sizeof(buf)) > 0) {
>> +			if (current->redirected) {
>> +				if (!unredirect_output(current))
>> +					return -1;
>> +			}
>> +			igt_log(IGT_LOG_DOMAIN, current->log_level,
>> +				"[cmd] %s", buf);
>> +			memset(buf, 0, sizeof(buf));
>> +		}
>> +		close(current->read_fd);
>> +	}
> 
> 
> Unredirect_output calls for both pipes need to be called on all exit
> paths.
> 
> In redirect_output you set only the read fd of the pipe() pair to
> O_NONBLOCK. That will make the executed command block on its writes
> indefinitely if it prints more than whatsitnow, 64kB?
> the 

In case the stream output is more than the pipe buf, the read loop above
would just unblock the rest of the entries. From pipe(2) page:

 "Data written to the write end of the pipe is buffered
  by the kernel until it is read from the read end of the pipe."

Worked well when I tried it with igt_exec("../tools/intel_reg dump")
which dumps a screenfull of info.



_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [i-g-t PATCH 1/4] lib/igt_core: Add igt_exec helpers
  2017-05-10 12:10   ` Abdiel Janulgue
@ 2017-05-10 12:14     ` Petri Latvala
  2017-05-10 12:30       ` Abdiel Janulgue
  0 siblings, 1 reply; 11+ messages in thread
From: Petri Latvala @ 2017-05-10 12:14 UTC (permalink / raw)
  To: Abdiel Janulgue; +Cc: intel-gfx

On Wed, May 10, 2017 at 03:10:16PM +0300, Abdiel Janulgue wrote:
> In case the stream output is more than the pipe buf, the read loop above
> would just unblock the rest of the entries. From pipe(2) page:


But you don't reach that read loop until system() returns. Which
happens after the program has terminated. Which never happens.



--
Petri Latvala
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [i-g-t PATCH 1/4] lib/igt_core: Add igt_exec helpers
  2017-05-10 12:14     ` Petri Latvala
@ 2017-05-10 12:30       ` Abdiel Janulgue
  0 siblings, 0 replies; 11+ messages in thread
From: Abdiel Janulgue @ 2017-05-10 12:30 UTC (permalink / raw)
  To: Petri Latvala; +Cc: intel-gfx



On 10.05.2017 15:14, Petri Latvala wrote:
> On Wed, May 10, 2017 at 03:10:16PM +0300, Abdiel Janulgue wrote:
>> In case the stream output is more than the pipe buf, the read loop above
>> would just unblock the rest of the entries. From pipe(2) page:
> 
> 
> But you don't reach that read loop until system() returns. Which
> happens after the program has terminated. Which never happens.
> 

Experimented with setting the write end of the pipe as O_NONBLOCK, I
actually didn't notice any difference when dumping tons of stdout
compared with just setting only the read end.
Maybe it's because we are not using write() directly? Not sure if this
is expected behavior or not...

> 
> 
> --
> Petri Latvala
> 
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2017-05-10 12:31 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-04-20  8:13 [i-g-t PATCH 1/4] lib/igt_core: Add igt_exec helpers Abdiel Janulgue
2017-04-20  8:13 ` [i-g-t PATCH 2/4] igt/igt_core: Provide an option to check for the log buffer contents Abdiel Janulgue
2017-04-20  8:13 ` [i-g-t PATCH 3/4] lib/igt_debugfs: Add helper to return path to device Abdiel Janulgue
2017-05-09 10:21   ` Petri Latvala
2017-04-20  8:13 ` [i-g-t PATCH 4/4] Convert shell script tests to C version Abdiel Janulgue
2017-04-25  9:54   ` [i-g-t PATCH] Convert ddx_intel_after_fbdev to C Abdiel Janulgue
2017-05-09 10:55   ` [i-g-t PATCH 4/4] Convert shell script tests to C version Petri Latvala
2017-05-09 10:18 ` [i-g-t PATCH 1/4] lib/igt_core: Add igt_exec helpers Petri Latvala
2017-05-10 12:10   ` Abdiel Janulgue
2017-05-10 12:14     ` Petri Latvala
2017-05-10 12:30       ` Abdiel Janulgue

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.