* [igt-dev] [PATCH v4 i-g-t 0/6] Introduce KUnit
@ 2023-06-02 8:27 Dominik Karol Piatkowski
2023-06-02 8:27 ` [igt-dev] [PATCH i-g-t 1/6] lib/igt_kmod: rename kselftest functions to ktest Dominik Karol Piatkowski
` (8 more replies)
0 siblings, 9 replies; 11+ messages in thread
From: Dominik Karol Piatkowski @ 2023-06-02 8:27 UTC (permalink / raw)
To: igt-dev
This series is a continuation of Isabella's work on introducing
KUnit to IGT.
Sample drm_buddy output:
[thread:13223] TAP version 1
[thread:13223] Executing 6 tests in: drm_buddy
Starting subtest: drm_buddy__drm_test_buddy_alloc_limit
Subtest drm_buddy__drm_test_buddy_alloc_limit: SUCCESS (0.000s)
Starting subtest: drm_buddy__drm_test_buddy_alloc_range
Subtest drm_buddy__drm_test_buddy_alloc_range: SUCCESS (0.000s)
Starting subtest: drm_buddy__drm_test_buddy_alloc_optimistic
Subtest drm_buddy__drm_test_buddy_alloc_optimistic: SUCCESS (0.000s)
Starting subtest: drm_buddy__drm_test_buddy_alloc_pessimistic
Subtest drm_buddy__drm_test_buddy_alloc_pessimistic: SUCCESS (0.000s)
Starting subtest: drm_buddy__drm_test_buddy_alloc_smoke
Subtest drm_buddy__drm_test_buddy_alloc_smoke: SUCCESS (0.000s)
Starting subtest: drm_buddy__drm_test_buddy_alloc_pathological
Subtest drm_buddy__drm_test_buddy_alloc_pathological: SUCCESS (0.000s)
Starting subtest: drm_buddy
Subtest drm_buddy: SUCCESS (0.000s)
The issue of possibility of too many sublevels occurrence is solved
by name concatenation.
Cc: Janusz Krzysztofik <janusz.krzysztofik@linux.intel.com>
Cc: Mauro Carvalho Chehab <mauro.chehab@linux.intel.com>
Dominik Karol Piatkowski (2):
Change logic of ktap parser to run on a thread
Fix drm_mm build error
Isabella Basso (4):
lib/igt_kmod: rename kselftest functions to ktest
lib/igt_kmod.c: check if module is builtin before attempting to unload
it
lib/igt_kmod: add compatibility for KUnit
tests: DRM selftests: switch to KUnit
lib/igt_kmod.c | 133 ++++++-
lib/igt_kmod.h | 14 +-
lib/igt_ktap.c | 615 +++++++++++++++++++++++++++++++
lib/igt_ktap.h | 50 +++
lib/meson.build | 1 +
tests/drm_buddy.c | 4 +-
tests/drm_mm.c | 4 +-
tests/i915/i915_test_config.json | 2 +-
tests/kms_selftest.c | 8 +
9 files changed, 811 insertions(+), 20 deletions(-)
create mode 100644 lib/igt_ktap.c
create mode 100644 lib/igt_ktap.h
--
2.34.1
^ permalink raw reply [flat|nested] 11+ messages in thread
* [igt-dev] [PATCH i-g-t 1/6] lib/igt_kmod: rename kselftest functions to ktest
2023-06-02 8:27 [igt-dev] [PATCH v4 i-g-t 0/6] Introduce KUnit Dominik Karol Piatkowski
@ 2023-06-02 8:27 ` Dominik Karol Piatkowski
2023-06-02 8:27 ` [igt-dev] [PATCH i-g-t 2/6] lib/igt_kmod.c: check if module is builtin before attempting to unload it Dominik Karol Piatkowski
` (7 subsequent siblings)
8 siblings, 0 replies; 11+ messages in thread
From: Dominik Karol Piatkowski @ 2023-06-02 8:27 UTC (permalink / raw)
To: igt-dev; +Cc: Isabella Basso
From: Isabella Basso <isabbasso@riseup.net>
This aims at making IGT's structure more general to different kernel
testing frameworks such as KUnit, as they use a lot of the same
functionality.
Reviewed-by: Janusz Krzysztofik <janusz.krzysztofik@linux.intel.com>
Signed-off-by: Isabella Basso <isabbasso@riseup.net>
Signed-off-by: Dominik Karol Piątkowski <dominik.karol.piatkowski@intel.com>
---
lib/igt_kmod.c | 22 +++++++++++-----------
lib/igt_kmod.h | 12 ++++++------
2 files changed, 17 insertions(+), 17 deletions(-)
diff --git a/lib/igt_kmod.c b/lib/igt_kmod.c
index ccf0063c..93fa2006 100644
--- a/lib/igt_kmod.c
+++ b/lib/igt_kmod.c
@@ -749,8 +749,8 @@ static int open_parameters(const char *module_name)
return open(path, O_RDONLY);
}
-int igt_kselftest_init(struct igt_kselftest *tst,
- const char *module_name)
+int igt_ktest_init(struct igt_ktest *tst,
+ const char *module_name)
{
int err;
@@ -769,7 +769,7 @@ int igt_kselftest_init(struct igt_kselftest *tst,
return 0;
}
-int igt_kselftest_begin(struct igt_kselftest *tst)
+int igt_ktest_begin(struct igt_ktest *tst)
{
int err;
@@ -784,7 +784,7 @@ int igt_kselftest_begin(struct igt_kselftest *tst)
return 0;
}
-int igt_kselftest_execute(struct igt_kselftest *tst,
+int igt_kselftest_execute(struct igt_ktest *tst,
struct igt_kselftest_list *tl,
const char *options,
const char *result)
@@ -822,13 +822,13 @@ int igt_kselftest_execute(struct igt_kselftest *tst,
return err;
}
-void igt_kselftest_end(struct igt_kselftest *tst)
+void igt_ktest_end(struct igt_ktest *tst)
{
kmod_module_remove_module(tst->kmod, KMOD_REMOVE_FORCE);
close(tst->kmsg);
}
-void igt_kselftest_fini(struct igt_kselftest *tst)
+void igt_ktest_fini(struct igt_ktest *tst)
{
free(tst->module_name);
kmod_module_unref(tst->kmod);
@@ -851,15 +851,15 @@ void igt_kselftests(const char *module_name,
const char *result,
const char *filter)
{
- struct igt_kselftest tst;
+ struct igt_ktest tst;
IGT_LIST_HEAD(tests);
struct igt_kselftest_list *tl, *tn;
- if (igt_kselftest_init(&tst, module_name) != 0)
+ if (igt_ktest_init(&tst, module_name) != 0)
return;
igt_fixture
- igt_require(igt_kselftest_begin(&tst) == 0);
+ igt_require(igt_ktest_begin(&tst) == 0);
igt_kselftest_get_tests(tst.kmod, filter, &tests);
igt_subtest_with_dynamic(filter ?: "all-tests") {
@@ -878,9 +878,9 @@ void igt_kselftests(const char *module_name,
}
igt_fixture {
- igt_kselftest_end(&tst);
+ igt_ktest_end(&tst);
igt_require(!igt_list_empty(&tests));
}
- igt_kselftest_fini(&tst);
+ igt_ktest_fini(&tst);
}
diff --git a/lib/igt_kmod.h b/lib/igt_kmod.h
index d05af4a6..ff59f1ec 100644
--- a/lib/igt_kmod.h
+++ b/lib/igt_kmod.h
@@ -76,7 +76,7 @@ void igt_kselftests(const char *module_name,
const char *result_option,
const char *filter);
-struct igt_kselftest {
+struct igt_ktest {
struct kmod_module *kmod;
char *module_name;
int kmsg;
@@ -89,19 +89,19 @@ struct igt_kselftest_list {
char param[];
};
-int igt_kselftest_init(struct igt_kselftest *tst,
+int igt_ktest_init(struct igt_ktest *tst,
const char *module_name);
-int igt_kselftest_begin(struct igt_kselftest *tst);
+int igt_ktest_begin(struct igt_ktest *tst);
void igt_kselftest_get_tests(struct kmod_module *kmod,
const char *filter,
struct igt_list_head *tests);
-int igt_kselftest_execute(struct igt_kselftest *tst,
+int igt_kselftest_execute(struct igt_ktest *tst,
struct igt_kselftest_list *tl,
const char *module_options,
const char *result);
-void igt_kselftest_end(struct igt_kselftest *tst);
-void igt_kselftest_fini(struct igt_kselftest *tst);
+void igt_ktest_end(struct igt_ktest *tst);
+void igt_ktest_fini(struct igt_ktest *tst);
#endif /* IGT_KMOD_H */
--
2.34.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [igt-dev] [PATCH i-g-t 2/6] lib/igt_kmod.c: check if module is builtin before attempting to unload it
2023-06-02 8:27 [igt-dev] [PATCH v4 i-g-t 0/6] Introduce KUnit Dominik Karol Piatkowski
2023-06-02 8:27 ` [igt-dev] [PATCH i-g-t 1/6] lib/igt_kmod: rename kselftest functions to ktest Dominik Karol Piatkowski
@ 2023-06-02 8:27 ` Dominik Karol Piatkowski
2023-06-02 8:27 ` [igt-dev] [PATCH i-g-t 3/6] lib/igt_kmod: add compatibility for KUnit Dominik Karol Piatkowski
` (6 subsequent siblings)
8 siblings, 0 replies; 11+ messages in thread
From: Dominik Karol Piatkowski @ 2023-06-02 8:27 UTC (permalink / raw)
To: igt-dev; +Cc: Isabella Basso
From: Isabella Basso <isabbasso@riseup.net>
This change makes `igt_kmod_unload_r` safer as it checks whether the
module can be unloaded before attempting it.
v2 -> v3:
- Fix commit message
- Make return value clearer
Acked-by: Janusz Krzysztofik <janusz.krzysztofik@linux.intel.com>
Signed-off-by: Isabella Basso <isabbasso@riseup.net>
Signed-off-by: Dominik Karol Piątkowski <dominik.karol.piatkowski@intel.com>
---
lib/igt_kmod.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/lib/igt_kmod.c b/lib/igt_kmod.c
index 93fa2006..26d58e29 100644
--- a/lib/igt_kmod.c
+++ b/lib/igt_kmod.c
@@ -259,6 +259,9 @@ static int igt_kmod_unload_r(struct kmod_module *kmod, unsigned int flags)
int err, tries;
const char *mod_name = kmod_module_get_name(kmod);
+ if (kmod_module_get_initstate(kmod) == KMOD_MODULE_BUILTIN)
+ return 0;
+
holders = kmod_module_get_holders(kmod);
kmod_list_foreach(pos, holders) {
struct kmod_module *it = kmod_module_get_module(pos);
--
2.34.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [igt-dev] [PATCH i-g-t 3/6] lib/igt_kmod: add compatibility for KUnit
2023-06-02 8:27 [igt-dev] [PATCH v4 i-g-t 0/6] Introduce KUnit Dominik Karol Piatkowski
2023-06-02 8:27 ` [igt-dev] [PATCH i-g-t 1/6] lib/igt_kmod: rename kselftest functions to ktest Dominik Karol Piatkowski
2023-06-02 8:27 ` [igt-dev] [PATCH i-g-t 2/6] lib/igt_kmod.c: check if module is builtin before attempting to unload it Dominik Karol Piatkowski
@ 2023-06-02 8:27 ` Dominik Karol Piatkowski
2023-06-02 8:27 ` [igt-dev] [PATCH i-g-t 4/6] tests: DRM selftests: switch to KUnit Dominik Karol Piatkowski
` (5 subsequent siblings)
8 siblings, 0 replies; 11+ messages in thread
From: Dominik Karol Piatkowski @ 2023-06-02 8:27 UTC (permalink / raw)
To: igt-dev; +Cc: Isabella Basso
From: Isabella Basso <isabbasso@riseup.net>
This adds functions for both executing the tests as well as parsing (K)TAP
kmsg output, as per the KTAP spec [1].
[1] https://www.kernel.org/doc/html/latest/dev-tools/ktap.html
v1 -> v2:
- refactor igt_kunit function and ktap parser so that we have only one
parser that we call only once (code size is now less than half the
size as v1)
- add lookup_value helper
- fix parsing problems
v2 -> v3:
- move ktap parsing functions to own file
- rename to ktap_parser
- get rid of unneeded pointers in igt_kunit
- change return values to allow for subsequent call to igt_kselftests if
needed
- add docs to parsing functions and helpers
- switch to line buffering
- add line buffering logging helper
- fix kunit module handling
- fix parsing of version lines
- use igt_subtest blocks to improve output handling on the CI
- fix output handling during crashes
Signed-off-by: Isabella Basso <isabbasso@riseup.net>
v3 -> v4:
- handle igt_ktap_parser fail with IGT_EXIT_ABORT code
v4 -> v5:
- added missing newlines in igt_warn
- removed setvbuf
Signed-off-by: Dominik Karol Piątkowski <dominik.karol.piatkowski@intel.com>
Cc: Janusz Krzysztofik <janusz.krzysztofik@linux.intel.com>
Cc: Mauro Carvalho Chehab <mauro.chehab@linux.intel.com>
---
lib/igt_kmod.c | 79 ++++++++++++
lib/igt_kmod.h | 2 +
lib/igt_ktap.c | 334 ++++++++++++++++++++++++++++++++++++++++++++++++
lib/igt_ktap.h | 31 +++++
lib/meson.build | 1 +
5 files changed, 447 insertions(+)
create mode 100644 lib/igt_ktap.c
create mode 100644 lib/igt_ktap.h
diff --git a/lib/igt_kmod.c b/lib/igt_kmod.c
index 26d58e29..21e801bd 100644
--- a/lib/igt_kmod.c
+++ b/lib/igt_kmod.c
@@ -29,6 +29,7 @@
#include "igt_aux.h"
#include "igt_core.h"
#include "igt_kmod.h"
+#include "igt_ktap.h"
#include "igt_sysfs.h"
#include "igt_taints.h"
@@ -744,6 +745,84 @@ void igt_kselftest_get_tests(struct kmod_module *kmod,
kmod_module_info_free_list(pre);
}
+/**
+ * igt_kunit:
+ * @module_name: the name of the module
+ * @opts: options to load the module
+ *
+ * Loads the test module, parses its (k)tap dmesg output, then unloads it
+ *
+ * Returns: IGT default codes
+ */
+int igt_kunit(const char *module_name, const char *opts)
+{
+ struct igt_ktest tst;
+ struct kmod_module *kunit_kmod;
+ char record[BUF_LEN + 1];
+ FILE *f;
+ bool is_builtin;
+ int ret;
+
+ ret = IGT_EXIT_INVALID;
+
+ /* get normalized module name */
+ if (igt_ktest_init(&tst, module_name) != 0) {
+ igt_warn("Unable to initialize ktest for %s\n", module_name);
+ return ret;
+ }
+
+ if (igt_ktest_begin(&tst) != 0) {
+ igt_warn("Unable to begin ktest for %s\n", module_name);
+
+ igt_ktest_fini(&tst);
+ return ret;
+ }
+
+ if (tst.kmsg < 0) {
+ igt_warn("Could not open /dev/kmsg\n");
+ goto unload;
+ }
+
+ if (lseek(tst.kmsg, 0, SEEK_END)) {
+ igt_warn("Could not seek the end of /dev/kmsg\n");
+ goto unload;
+ }
+
+ f = fdopen(tst.kmsg, "r");
+
+ if (f == NULL) {
+ igt_warn("Could not turn /dev/kmsg file descriptor into a FILE pointer\n");
+ goto unload;
+ }
+
+ /* The KUnit module is required for running any KUnit tests */
+ if (igt_kmod_load("kunit", NULL) != 0 ||
+ kmod_module_new_from_name(kmod_ctx(), "kunit", &kunit_kmod) != 0) {
+ igt_warn("Unable to load KUnit\n");
+ igt_fail(IGT_EXIT_FAILURE);
+ }
+
+ is_builtin = kmod_module_get_initstate(kunit_kmod) == KMOD_MODULE_BUILTIN;
+
+ if (igt_kmod_load(module_name, opts) != 0) {
+ igt_warn("Unable to load %s module\n", module_name);
+ igt_fail(IGT_EXIT_FAILURE);
+ }
+
+ ret = igt_ktap_parser(f, record, is_builtin);
+ if (ret != 0)
+ ret = IGT_EXIT_ABORT;
+unload:
+ igt_ktest_end(&tst);
+
+ igt_ktest_fini(&tst);
+
+ if (ret == 0)
+ igt_success();
+
+ return ret;
+}
+
static int open_parameters(const char *module_name)
{
char path[256];
diff --git a/lib/igt_kmod.h b/lib/igt_kmod.h
index ff59f1ec..ce17c714 100644
--- a/lib/igt_kmod.h
+++ b/lib/igt_kmod.h
@@ -71,6 +71,8 @@ static inline int igt_xe_driver_unload(void)
int igt_amdgpu_driver_load(const char *opts);
int igt_amdgpu_driver_unload(void);
+int igt_kunit(const char *module_name, const char *opts);
+
void igt_kselftests(const char *module_name,
const char *module_options,
const char *result_option,
diff --git a/lib/igt_ktap.c b/lib/igt_ktap.c
new file mode 100644
index 00000000..117598fa
--- /dev/null
+++ b/lib/igt_ktap.c
@@ -0,0 +1,334 @@
+// SPDX-License-Identifier: MIT
+/*
+ * Copyright © 2023 Isabella Basso do Amaral <isabbasso@riseup.net>
+ */
+
+#include <ctype.h>
+#include <limits.h>
+
+#include "igt_aux.h"
+#include "igt_core.h"
+#include "igt_ktap.h"
+
+static int log_to_end(enum igt_log_level level, FILE *f,
+ char *record, const char *format, ...) __attribute__((format(printf, 4, 5)));
+
+/**
+ * log_to_end:
+ * @level: #igt_log_level
+ * @record: record to store the read data
+ * @format: format string
+ * @...: optional arguments used in the format string
+ *
+ * This is an altered version of the generic structured logging helper function
+ * igt_log capable of reading to the end of a given line.
+ *
+ * Returns: 0 for success, or -2 if there's an error reading from the file
+ */
+static int log_to_end(enum igt_log_level level, FILE *f,
+ char *record, const char *format, ...)
+{
+ va_list args;
+ const char *lend;
+
+ va_start(args, format);
+ igt_vlog(IGT_LOG_DOMAIN, level, format, args);
+ va_end(args);
+
+ lend = strchrnul(record, '\n');
+ while (*lend == '\0') {
+ igt_log(IGT_LOG_DOMAIN, level, "%s", record);
+ if (fgets(record, BUF_LEN, f) == NULL) {
+ igt_warn("kmsg truncated: unknown error (%m)\n");
+ return -2;
+ }
+ lend = strchrnul(record, '\n');
+ }
+ return 0;
+}
+
+/**
+ * lookup_value:
+ * @haystack: the string to search in
+ * @needle: the string to search for
+ *
+ * Returns: the value of the needle in the haystack, or -1 if not found.
+ */
+static long lookup_value(const char *haystack, const char *needle)
+{
+ const char *needle_rptr;
+ char *needle_end;
+ long num;
+
+ needle_rptr = strcasestr(haystack, needle);
+
+ if (needle_rptr == NULL)
+ return -1;
+
+ /* skip search string and whitespaces after it */
+ needle_rptr += strlen(needle);
+
+ num = strtol(needle_rptr, &needle_end, 10);
+
+ if (needle_rptr == needle_end)
+ return -1;
+
+ if (num == LONG_MIN || num == LONG_MAX)
+ return 0;
+
+ return num > 0 ? num : 0;
+}
+
+/**
+ * find_next_tap_subtest:
+ * @fp: FILE pointer
+ * @record: buffer used to read fp
+ * @is_builtin: whether KUnit is built-in or not
+ *
+ * Returns:
+ * 0 if there's missing information
+ * -1 if not found
+ * -2 if there are problems while reading the file.
+ * any other value corresponds to the amount of cases of the next (sub)test
+ */
+static int find_next_tap_subtest(FILE *fp, char *record, bool is_builtin)
+{
+ const char *test_lookup_str, *subtest_lookup_str, *name_rptr, *version_rptr;
+ char test_name[BUF_LEN + 1];
+ long test_count;
+
+ test_name[0] = '\0';
+ test_name[BUF_LEN] = '\0';
+
+ test_lookup_str = " subtest: ";
+ subtest_lookup_str = " test: ";
+
+ /*
+ * "(K)TAP version XX" should be the first line on all (sub)tests as per
+ * https://kernel.org/doc/html/latest/dev-tools/ktap.html#version-lines
+ *
+ * but actually isn't, as it currently depends on the KUnit module
+ * being built-in, so we can't rely on it every time
+ */
+ if (is_builtin) {
+ version_rptr = strcasestr(record, "TAP version ");
+ if (version_rptr == NULL)
+ return -1;
+
+ igt_info("%s", version_rptr);
+
+ if (fgets(record, BUF_LEN, fp) == NULL) {
+ igt_warn("kmsg truncated: unknown error (%m)\n");
+ return -2;
+ }
+ }
+
+ name_rptr = strcasestr(record, test_lookup_str);
+ if (name_rptr != NULL) {
+ name_rptr += strlen(test_lookup_str);
+ } else {
+ name_rptr = strcasestr(record, subtest_lookup_str);
+ if (name_rptr != NULL)
+ name_rptr += strlen(subtest_lookup_str);
+ }
+
+ if (name_rptr == NULL) {
+ if (!is_builtin)
+ /* we've probably found nothing */
+ return -1;
+ igt_info("Missing test name\n");
+ } else {
+ strncpy(test_name, name_rptr, BUF_LEN);
+ if (fgets(record, BUF_LEN, fp) == NULL) {
+ igt_warn("kmsg truncated: unknown error (%m)\n");
+ return -2;
+ }
+ /* now we can be sure we found tests */
+ if (!is_builtin)
+ igt_info("KUnit is not built-in, skipping version check...\n");
+ }
+
+ /*
+ * total test count will almost always appear as 0..N at the beginning
+ * of a run, so we use it to reliably identify a new run
+ */
+ test_count = lookup_value(record, "..");
+
+ if (test_count <= 0) {
+ igt_info("Missing test count\n");
+ if (test_name[0] == '\0')
+ return 0;
+ if (log_to_end(IGT_LOG_INFO, fp, record,
+ "Running some tests in: %s",
+ test_name) < 0)
+ return -2;
+ return 0;
+ } else if (test_name[0] == '\0') {
+ igt_info("Running %ld tests...\n", test_count);
+ return 0;
+ }
+
+ if (log_to_end(IGT_LOG_INFO, fp, record,
+ "Executing %ld tests in: %s",
+ test_count, test_name) < 0)
+ return -2;
+
+ return test_count;
+}
+
+/**
+ * find_next_tap_test:
+ * @fp: FILE pointer
+ * @record: buffer used to read fp
+ * @test_name: buffer to store the test name
+ *
+ * Returns:
+ * 1 if no results were found
+ * 0 if a test succeded
+ * -1 if a test failed
+ * -2 if there are problems reading the file
+ */
+static int parse_kmsg_for_tap(FILE *fp, char *record, char *test_name)
+{
+ const char *lstart, *ok_lookup_str, *nok_lookup_str,
+ *ok_rptr, *nok_rptr, *comment_start, *value_parse_start;
+ char *test_name_end;
+
+ ok_lookup_str = "ok ";
+ nok_lookup_str = "not ok ";
+
+ lstart = strchrnul(record, ';');
+
+ if (*lstart == '\0') {
+ igt_warn("kmsg truncated: output malformed (%m)\n");
+ return -2;
+ }
+
+ lstart++;
+ while (isspace(*lstart))
+ lstart++;
+
+ nok_rptr = strstr(lstart, nok_lookup_str);
+ if (nok_rptr != NULL) {
+ nok_rptr += strlen(nok_lookup_str);
+ while (isdigit(*nok_rptr) || isspace(*nok_rptr) || *nok_rptr == '-')
+ nok_rptr++;
+ test_name_end = strncpy(test_name, nok_rptr, BUF_LEN);
+ while (!isspace(*test_name_end))
+ test_name_end++;
+ *test_name_end = '\0';
+ if (log_to_end(IGT_LOG_WARN, fp, record,
+ "%s", lstart) < 0)
+ return -2;
+ return -1;
+ }
+
+ comment_start = strchrnul(lstart, '#');
+
+ /* check if we're still in a subtest */
+ if (*comment_start != '\0') {
+ comment_start++;
+ value_parse_start = comment_start;
+
+ if (lookup_value(value_parse_start, "fail: ") > 0) {
+ if (log_to_end(IGT_LOG_WARN, fp, record,
+ "%s", lstart) < 0)
+ return -2;
+ return -1;
+ }
+ }
+
+ ok_rptr = strstr(lstart, ok_lookup_str);
+ if (ok_rptr != NULL) {
+ ok_rptr += strlen(ok_lookup_str);
+ while (isdigit(*ok_rptr) || isspace(*ok_rptr) || *ok_rptr == '-')
+ ok_rptr++;
+ test_name_end = strncpy(test_name, ok_rptr, BUF_LEN);
+ while (!isspace(*test_name_end))
+ test_name_end++;
+ *test_name_end = '\0';
+ return 0;
+ }
+
+ return 1;
+}
+
+/**
+ * igt_ktap_parser:
+ * @fp: FILE pointer
+ * @record: buffer used to read fp
+ * @is_builtin: whether the KUnit module is built-in or not
+ *
+ * This function parses the output of a ktap script and prints the test results,
+ * as well as any other output to stdout.
+ *
+ * Returns: IGT default codes
+ */
+int igt_ktap_parser(FILE *fp, char *record, bool is_builtin)
+{
+ char test_name[BUF_LEN + 1];
+ bool failed_tests, found_tests;
+ int sublevel = 0;
+
+ test_name[0] = '\0';
+ test_name[BUF_LEN] = '\0';
+
+ failed_tests = false;
+ found_tests = false;
+
+ while (sublevel >= 0) {
+ if (fgets(record, BUF_LEN, fp) == NULL) {
+ if (!found_tests)
+ igt_warn("kmsg truncated: unknown error (%m)\n");
+ break;
+ }
+
+ switch (find_next_tap_subtest(fp, record, is_builtin)) {
+ case -2:
+ /* no more data to read */
+ return IGT_EXIT_FAILURE;
+ case -1:
+ /* no test found, so we keep parsing */
+ break;
+ case 0:
+ /*
+ * tests found, but they're missing info, so we might
+ * have read into test output
+ */
+ found_tests = true;
+ sublevel++;
+ break;
+ default:
+ if (fgets(record, BUF_LEN, fp) == NULL) {
+ igt_warn("kmsg truncated: unknown error (%m)\n");
+ return -2;
+ }
+ found_tests = true;
+ sublevel++;
+ break;
+ }
+
+ switch (parse_kmsg_for_tap(fp, record, test_name)) {
+ case -2:
+ return IGT_EXIT_FAILURE;
+ case -1:
+ sublevel--;
+ failed_tests = true;
+ igt_subtest(test_name)
+ igt_fail(IGT_EXIT_FAILURE);
+ test_name[0] = '\0';
+ break;
+ case 0: /* fallthrough */
+ igt_subtest(test_name)
+ igt_success();
+ test_name[0] = '\0';
+ default:
+ break;
+ }
+ }
+
+ if (failed_tests || !found_tests)
+ return IGT_EXIT_FAILURE;
+
+ return IGT_EXIT_SUCCESS;
+}
diff --git a/lib/igt_ktap.h b/lib/igt_ktap.h
new file mode 100644
index 00000000..b2f69df2
--- /dev/null
+++ b/lib/igt_ktap.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright © 2022 Isabella Basso do Amaral <isabbasso@riseup.net>
+ *
+ * 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.
+ */
+
+#ifndef IGT_KTAP_H
+#define IGT_KTAP_H
+
+#define BUF_LEN 4096
+
+int igt_ktap_parser(FILE *fp, char *record, bool is_builtin);
+
+#endif /* IGT_KTAP_H */
diff --git a/lib/meson.build b/lib/meson.build
index 55efdc83..1b33ea91 100644
--- a/lib/meson.build
+++ b/lib/meson.build
@@ -88,6 +88,7 @@ lib_sources = [
'igt_store.c',
'uwildmat/uwildmat.c',
'igt_kmod.c',
+ 'igt_ktap.c',
'igt_panfrost.c',
'igt_v3d.c',
'igt_vc4.c',
--
2.34.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [igt-dev] [PATCH i-g-t 4/6] tests: DRM selftests: switch to KUnit
2023-06-02 8:27 [igt-dev] [PATCH v4 i-g-t 0/6] Introduce KUnit Dominik Karol Piatkowski
` (2 preceding siblings ...)
2023-06-02 8:27 ` [igt-dev] [PATCH i-g-t 3/6] lib/igt_kmod: add compatibility for KUnit Dominik Karol Piatkowski
@ 2023-06-02 8:27 ` Dominik Karol Piatkowski
2023-06-02 8:27 ` [igt-dev] [PATCH i-g-t 5/6] Change logic of ktap parser to run on a thread Dominik Karol Piatkowski
` (4 subsequent siblings)
8 siblings, 0 replies; 11+ messages in thread
From: Dominik Karol Piatkowski @ 2023-06-02 8:27 UTC (permalink / raw)
To: igt-dev; +Cc: Isabella Basso
From: Isabella Basso <isabbasso@riseup.net>
As the DRM selftests are now using KUnit [1], update IGT tests as well.
[1] - https://lore.kernel.org/all/20220708203052.236290-1-maira.canal@usp.br/
Signed-off-by: Isabella Basso <isabbasso@riseup.net>
v1 -> v2:
- drm_buddy|drm_mm: fallback to igt_kselftests if igt_kunit failed
with code other than IGT_EXIT_ABORT
- kms_selftest: move igt_kunit tests to separate subtests
- kms_selftest: fallback to igt_kselftests if all subtests failed
v2 -> v3:
- expose all subtests
Signed-off-by: Dominik Karol Piątkowski <dominik.karol.piatkowski@intel.com>
Cc: Janusz Krzysztofik <janusz.krzysztofik@linux.intel.com>
Cc: Mauro Carvalho Chehab <mauro.chehab@linux.intel.com>
---
tests/drm_buddy.c | 4 +++-
tests/drm_mm.c | 4 +++-
tests/kms_selftest.c | 8 ++++++++
3 files changed, 14 insertions(+), 2 deletions(-)
diff --git a/tests/drm_buddy.c b/tests/drm_buddy.c
index 06876e0c..3261f0d6 100644
--- a/tests/drm_buddy.c
+++ b/tests/drm_buddy.c
@@ -10,5 +10,7 @@ IGT_TEST_DESCRIPTION("Basic sanity check of DRM's buddy allocator (struct drm_bu
igt_main
{
- igt_kselftests("test-drm_buddy", NULL, NULL, NULL);
+ int ret = igt_kunit("drm_buddy_test", NULL);
+ if (ret != 0 && ret != IGT_EXIT_ABORT)
+ igt_kselftests("test-drm_buddy", NULL, NULL, NULL);
}
diff --git a/tests/drm_mm.c b/tests/drm_mm.c
index 0bce7139..88f76a57 100644
--- a/tests/drm_mm.c
+++ b/tests/drm_mm.c
@@ -156,5 +156,7 @@ IGT_TEST_DESCRIPTION("Basic sanity check of DRM's range manager (struct drm_mm)"
igt_main
{
- igt_kselftests("test-drm_mm", NULL, NULL, NULL);
+ int ret = igt_kunit("drm_mm_test", NULL);
+ if (ret != 0 && ret != IGT_EXIT_ABORT)
+ igt_kselftests("test-drm_mm", NULL, NULL, NULL);
}
diff --git a/tests/kms_selftest.c b/tests/kms_selftest.c
index abc4bfe9..b27f60fb 100644
--- a/tests/kms_selftest.c
+++ b/tests/kms_selftest.c
@@ -28,5 +28,13 @@ IGT_TEST_DESCRIPTION("Basic sanity check of KMS selftests.");
igt_main
{
+ static const char *kunit_subtests[] = { "drm_cmdline_parser_test", "drm_damage_helper_test",
+ "drm_dp_mst_helper_test", "drm_format_helper_test",
+ "drm_format_test", "drm_framebuffer_test",
+ "drm_plane_helper_test", NULL };
+
+ for (int i = 0; kunit_subtests[i] != NULL; i++)
+ igt_kunit(kunit_subtests[i], NULL);
+
igt_kselftests("test-drm_modeset", NULL, NULL, NULL);
}
--
2.34.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [igt-dev] [PATCH i-g-t 5/6] Change logic of ktap parser to run on a thread
2023-06-02 8:27 [igt-dev] [PATCH v4 i-g-t 0/6] Introduce KUnit Dominik Karol Piatkowski
` (3 preceding siblings ...)
2023-06-02 8:27 ` [igt-dev] [PATCH i-g-t 4/6] tests: DRM selftests: switch to KUnit Dominik Karol Piatkowski
@ 2023-06-02 8:27 ` Dominik Karol Piatkowski
2023-06-02 8:27 ` [igt-dev] [PATCH i-g-t 6/6] Fix drm_mm build error Dominik Karol Piatkowski
` (3 subsequent siblings)
8 siblings, 0 replies; 11+ messages in thread
From: Dominik Karol Piatkowski @ 2023-06-02 8:27 UTC (permalink / raw)
To: igt-dev
The ktap parser should be listening and parsing messages as the tests
are executed, and not after the end of module load.
v1 -> v2:
- fix coding style
- remove usleep
- add error check logic
- follow the structure of igt_kselftests more closely
v2 -> v3:
- fixed sublevel issues by rewriting tap parser flow
Signed-off-by: Dominik Karol Piątkowski <dominik.karol.piatkowski@intel.com>
Cc: Janusz Krzysztofik <janusz.krzysztofik@linux.intel.com>
Cc: Mauro Carvalho Chehab <mauro.chehab@linux.intel.com>
---
lib/igt_kmod.c | 99 ++++++++----
lib/igt_ktap.c | 431 ++++++++++++++++++++++++++++++++++++++++---------
lib/igt_ktap.h | 21 ++-
3 files changed, 440 insertions(+), 111 deletions(-)
diff --git a/lib/igt_kmod.c b/lib/igt_kmod.c
index 21e801bd..8cb9cb2e 100644
--- a/lib/igt_kmod.c
+++ b/lib/igt_kmod.c
@@ -758,10 +758,11 @@ int igt_kunit(const char *module_name, const char *opts)
{
struct igt_ktest tst;
struct kmod_module *kunit_kmod;
- char record[BUF_LEN + 1];
FILE *f;
bool is_builtin;
int ret;
+ struct ktap_test_results *results;
+ struct ktap_test_results_element *temp;
ret = IGT_EXIT_INVALID;
@@ -771,55 +772,83 @@ int igt_kunit(const char *module_name, const char *opts)
return ret;
}
- if (igt_ktest_begin(&tst) != 0) {
- igt_warn("Unable to begin ktest for %s\n", module_name);
+ igt_fixture {
+ if (igt_ktest_begin(&tst) != 0) {
+ igt_warn("Unable to begin ktest for %s\n", module_name);
- igt_ktest_fini(&tst);
- return ret;
- }
+ igt_ktest_fini(&tst);
+ return ret;
+ }
- if (tst.kmsg < 0) {
- igt_warn("Could not open /dev/kmsg\n");
- goto unload;
- }
+ if (tst.kmsg < 0) {
+ igt_warn("Could not open /dev/kmsg\n");
+ goto unload;
+ }
- if (lseek(tst.kmsg, 0, SEEK_END)) {
- igt_warn("Could not seek the end of /dev/kmsg\n");
- goto unload;
- }
+ if (lseek(tst.kmsg, 0, SEEK_END)) {
+ igt_warn("Could not seek the end of /dev/kmsg\n");
+ goto unload;
+ }
- f = fdopen(tst.kmsg, "r");
+ f = fdopen(tst.kmsg, "r");
- if (f == NULL) {
- igt_warn("Could not turn /dev/kmsg file descriptor into a FILE pointer\n");
- goto unload;
- }
+ if (f == NULL) {
+ igt_warn("Could not turn /dev/kmsg file descriptor into a FILE pointer\n");
+ goto unload;
+ }
+
+ /* The KUnit module is required for running any KUnit tests */
+ if (igt_kmod_load("kunit", NULL) != 0 ||
+ kmod_module_new_from_name(kmod_ctx(), "kunit", &kunit_kmod) != 0) {
+ igt_warn("Unable to load KUnit\n");
+ igt_fail(IGT_EXIT_FAILURE);
+ }
- /* The KUnit module is required for running any KUnit tests */
- if (igt_kmod_load("kunit", NULL) != 0 ||
- kmod_module_new_from_name(kmod_ctx(), "kunit", &kunit_kmod) != 0) {
- igt_warn("Unable to load KUnit\n");
- igt_fail(IGT_EXIT_FAILURE);
+ is_builtin = kmod_module_get_initstate(kunit_kmod) == KMOD_MODULE_BUILTIN;
+
+ results = ktap_parser_start(f, is_builtin);
+
+ if (igt_kmod_load(module_name, opts) != 0) {
+ igt_warn("Unable to load %s module\n", module_name);
+ ret = ktap_parser_stop();
+ igt_fail(IGT_EXIT_FAILURE);
+ }
}
- is_builtin = kmod_module_get_initstate(kunit_kmod) == KMOD_MODULE_BUILTIN;
+ while (READ_ONCE(results->still_running) || READ_ONCE(results->head) != NULL)
+ {
+ if (READ_ONCE(results->head) != NULL) {
+ pthread_mutex_lock(&results->mutex);
- if (igt_kmod_load(module_name, opts) != 0) {
- igt_warn("Unable to load %s module\n", module_name);
- igt_fail(IGT_EXIT_FAILURE);
+ igt_subtest(results->head->test_name) {
+ if (READ_ONCE(results->head->passed))
+ igt_success();
+ else
+ igt_fail(IGT_EXIT_FAILURE);
+ }
+
+ temp = results->head;
+ results->head = results->head->next;
+ free(temp);
+
+ pthread_mutex_unlock(&results->mutex);
+ }
}
- ret = igt_ktap_parser(f, record, is_builtin);
- if (ret != 0)
- ret = IGT_EXIT_ABORT;
unload:
- igt_ktest_end(&tst);
+ igt_fixture {
+ igt_ktest_end(&tst);
- igt_ktest_fini(&tst);
+ igt_ktest_fini(&tst);
+
+ ret = ktap_parser_stop();
- if (ret == 0)
- igt_success();
+ if (ret != 0)
+ ret = IGT_EXIT_ABORT;
+ if (ret == 0)
+ igt_success();
+ }
return ret;
}
diff --git a/lib/igt_ktap.c b/lib/igt_ktap.c
index 117598fa..d8dec52d 100644
--- a/lib/igt_ktap.c
+++ b/lib/igt_ktap.c
@@ -5,11 +5,25 @@
#include <ctype.h>
#include <limits.h>
+#include <libkmod.h>
+#include <pthread.h>
+#include <errno.h>
#include "igt_aux.h"
#include "igt_core.h"
#include "igt_ktap.h"
+#define DELIMITER "__"
+
+struct ktap_parser_args {
+ FILE *fp;
+ bool is_builtin;
+ volatile bool is_running;
+ int ret;
+} ktap_args;
+
+static struct ktap_test_results results;
+
static int log_to_end(enum igt_log_level level, FILE *f,
char *record, const char *format, ...) __attribute__((format(printf, 4, 5)));
@@ -30,6 +44,14 @@ static int log_to_end(enum igt_log_level level, FILE *f,
{
va_list args;
const char *lend;
+ int f_fd = fileno(f);
+
+ /* Cutoff after newline character, in order to not display garbage */
+ char *cutoff = strchr(record, '\n');
+ if (cutoff) {
+ if (cutoff - record < BUF_LEN)
+ cutoff[1] = '\0';
+ }
va_start(args, format);
igt_vlog(IGT_LOG_DOMAIN, level, format, args);
@@ -38,10 +60,29 @@ static int log_to_end(enum igt_log_level level, FILE *f,
lend = strchrnul(record, '\n');
while (*lend == '\0') {
igt_log(IGT_LOG_DOMAIN, level, "%s", record);
- if (fgets(record, BUF_LEN, f) == NULL) {
+
+ while (read(f_fd, record, BUF_LEN) < 0) {
+ if (!READ_ONCE(ktap_args.is_running)) {
+ igt_warn("ktap parser stopped\n");
+ return -2;
+ }
+
+ if (errno == EINTR)
+ continue;
+
+ if (errno == EPIPE) {
+ igt_warn("kmsg truncated: too many messages. You may want to increase log_buf_len in kmcdline\n");
+ return -2;
+ }
+
+ if (errno == EAGAIN)
+ /* No records available */
+ continue;
+
igt_warn("kmsg truncated: unknown error (%m)\n");
return -2;
}
+
lend = strchrnul(record, '\n');
}
return 0;
@@ -65,7 +106,7 @@ static long lookup_value(const char *haystack, const char *needle)
if (needle_rptr == NULL)
return -1;
- /* skip search string and whitespaces after it */
+ /* Skip search string and whitespaces after it */
needle_rptr += strlen(needle);
num = strtol(needle_rptr, &needle_end, 10);
@@ -79,6 +120,41 @@ static long lookup_value(const char *haystack, const char *needle)
return num > 0 ? num : 0;
}
+/**
+ * tap_version_present:
+ * @record: buffer with tap data
+ * @print_info: whether tap version should be printed or not
+ *
+ * Returns:
+ * 0 if not found
+ * 1 if found
+ */
+static int tap_version_present(char* record, bool print_info)
+{
+ /*
+ * "(K)TAP version XX" should be the first line on all (sub)tests as per
+ * https://kernel.org/doc/html/latest/dev-tools/ktap.html#version-lines
+ *
+ * but actually isn't, as it currently depends on the KUnit module
+ * being built-in, so we can't rely on it every time
+ */
+ const char *version_rptr = strcasestr(record, "TAP version ");
+ char *cutoff;
+
+ if (version_rptr == NULL)
+ return 0;
+
+ /* Cutoff after newline character, in order to not display garbage */
+ cutoff = strchr(version_rptr, '\n');
+ if (cutoff)
+ cutoff[0] = '\0';
+
+ if (print_info)
+ igt_info("%s\n", version_rptr);
+
+ return 1;
+}
+
/**
* find_next_tap_subtest:
* @fp: FILE pointer
@@ -91,11 +167,12 @@ static long lookup_value(const char *haystack, const char *needle)
* -2 if there are problems while reading the file.
* any other value corresponds to the amount of cases of the next (sub)test
*/
-static int find_next_tap_subtest(FILE *fp, char *record, bool is_builtin)
+static int find_next_tap_subtest(FILE *fp, char *record, char *test_name, bool is_builtin)
{
- const char *test_lookup_str, *subtest_lookup_str, *name_rptr, *version_rptr;
- char test_name[BUF_LEN + 1];
+ const char *test_lookup_str, *subtest_lookup_str, *name_rptr;
long test_count;
+ int fp_fd = fileno(fp);
+ char *cutoff;
test_name[0] = '\0';
test_name[BUF_LEN] = '\0';
@@ -103,21 +180,28 @@ static int find_next_tap_subtest(FILE *fp, char *record, bool is_builtin)
test_lookup_str = " subtest: ";
subtest_lookup_str = " test: ";
- /*
- * "(K)TAP version XX" should be the first line on all (sub)tests as per
- * https://kernel.org/doc/html/latest/dev-tools/ktap.html#version-lines
- *
- * but actually isn't, as it currently depends on the KUnit module
- * being built-in, so we can't rely on it every time
- */
+ if (!tap_version_present(record, true))
+ return -1;
+
if (is_builtin) {
- version_rptr = strcasestr(record, "TAP version ");
- if (version_rptr == NULL)
- return -1;
+ while (read(fp_fd, record, BUF_LEN) < 0) {
+ if (!READ_ONCE(ktap_args.is_running)) {
+ igt_warn("ktap parser stopped\n");
+ return -2;
+ }
+
+ if (errno == EINTR)
+ continue;
- igt_info("%s", version_rptr);
+ if (errno == EPIPE) {
+ igt_warn("kmsg truncated: too many messages. You may want to increase log_buf_len in kmcdline\n");
+ return -2;
+ }
+
+ if (errno == EAGAIN)
+ /* No records available */
+ continue;
- if (fgets(record, BUF_LEN, fp) == NULL) {
igt_warn("kmsg truncated: unknown error (%m)\n");
return -2;
}
@@ -134,22 +218,45 @@ static int find_next_tap_subtest(FILE *fp, char *record, bool is_builtin)
if (name_rptr == NULL) {
if (!is_builtin)
- /* we've probably found nothing */
+ /* We've probably found nothing */
return -1;
igt_info("Missing test name\n");
} else {
strncpy(test_name, name_rptr, BUF_LEN);
- if (fgets(record, BUF_LEN, fp) == NULL) {
+ /* Cutoff after newline character, in order to not display garbage */
+ cutoff = strchr(test_name, '\n');
+ if (cutoff)
+ cutoff[0] = '\0';
+
+ while (read(fp_fd, record, BUF_LEN) < 0) {
+ if (!READ_ONCE(ktap_args.is_running)) {
+ igt_warn("ktap parser stopped\n");
+ return -2;
+ }
+
+ if (errno == EINTR)
+ continue;
+
+ if (errno == EPIPE) {
+ igt_warn("kmsg truncated: too many messages. You may want to increase log_buf_len in kmcdline\n");
+ return -2;
+ }
+
+ if (errno == EAGAIN)
+ /* No records available */
+ continue;
+
igt_warn("kmsg truncated: unknown error (%m)\n");
return -2;
}
- /* now we can be sure we found tests */
+
+ /* Now we can be sure we found tests */
if (!is_builtin)
igt_info("KUnit is not built-in, skipping version check...\n");
}
/*
- * total test count will almost always appear as 0..N at the beginning
+ * Total test count will almost always appear as 0..N at the beginning
* of a run, so we use it to reliably identify a new run
*/
test_count = lookup_value(record, "..");
@@ -159,7 +266,7 @@ static int find_next_tap_subtest(FILE *fp, char *record, bool is_builtin)
if (test_name[0] == '\0')
return 0;
if (log_to_end(IGT_LOG_INFO, fp, record,
- "Running some tests in: %s",
+ "Running some tests in: %s\n",
test_name) < 0)
return -2;
return 0;
@@ -169,7 +276,7 @@ static int find_next_tap_subtest(FILE *fp, char *record, bool is_builtin)
}
if (log_to_end(IGT_LOG_INFO, fp, record,
- "Executing %ld tests in: %s",
+ "Executing %ld tests in: %s\n",
test_count, test_name) < 0)
return -2;
@@ -177,7 +284,7 @@ static int find_next_tap_subtest(FILE *fp, char *record, bool is_builtin)
}
/**
- * find_next_tap_test:
+ * parse_kmsg_for_tap:
* @fp: FILE pointer
* @record: buffer used to read fp
* @test_name: buffer to store the test name
@@ -225,7 +332,7 @@ static int parse_kmsg_for_tap(FILE *fp, char *record, char *test_name)
comment_start = strchrnul(lstart, '#');
- /* check if we're still in a subtest */
+ /* Check if we're still in a subtest */
if (*comment_start != '\0') {
comment_start++;
value_parse_start = comment_start;
@@ -254,81 +361,255 @@ static int parse_kmsg_for_tap(FILE *fp, char *record, char *test_name)
}
/**
- * igt_ktap_parser:
+ * parse_tap_level:
* @fp: FILE pointer
- * @record: buffer used to read fp
+ * @base_test_name: test_name from upper recursion level
+ * @test_count: test_count of this level
+ * @failed_tests: top level failed_tests pointer
+ * @found_tests: top level found_tests pointer
* @is_builtin: whether the KUnit module is built-in or not
*
- * This function parses the output of a ktap script and prints the test results,
- * as well as any other output to stdout.
- *
- * Returns: IGT default codes
+ * Returns:
+ * 0 if succeded
+ * -1 if error occurred
*/
-int igt_ktap_parser(FILE *fp, char *record, bool is_builtin)
+static int parse_tap_level(FILE *fp, char *base_test_name, int test_count, bool *failed_tests,
+ bool *found_tests, bool is_builtin)
{
+ int fp_fd = fileno(fp);
+ char record[BUF_LEN + 1];
+ struct ktap_test_results_element *r, *temp;
+ int internal_test_count;
char test_name[BUF_LEN + 1];
- bool failed_tests, found_tests;
- int sublevel = 0;
+ char base_test_name_for_next_level[BUF_LEN + 1];
- test_name[0] = '\0';
- test_name[BUF_LEN] = '\0';
+ for (int i = 0; i < test_count; i++) {
+ while (read(fp_fd, record, BUF_LEN) < 0) {
+ if (!READ_ONCE(ktap_args.is_running)) {
+ igt_warn("ktap parser stopped\n");
+ return -1;
+ }
- failed_tests = false;
- found_tests = false;
+ if (errno == EINTR)
+ continue;
- while (sublevel >= 0) {
- if (fgets(record, BUF_LEN, fp) == NULL) {
- if (!found_tests)
- igt_warn("kmsg truncated: unknown error (%m)\n");
- break;
+ if (errno == EAGAIN)
+ /* No records available */
+ continue;
+
+ if (errno == EPIPE) {
+ igt_warn("kmsg truncated: too many messages. You may want to increase log_buf_len in kmcdline\n");
+ return -1;
+ }
+
+ igt_warn("kmsg truncated: unknown error (%m)\n");
+ return -1;
}
- switch (find_next_tap_subtest(fp, record, is_builtin)) {
- case -2:
- /* no more data to read */
- return IGT_EXIT_FAILURE;
- case -1:
- /* no test found, so we keep parsing */
- break;
- case 0:
- /*
- * tests found, but they're missing info, so we might
- * have read into test output
- */
- found_tests = true;
- sublevel++;
- break;
- default:
- if (fgets(record, BUF_LEN, fp) == NULL) {
- igt_warn("kmsg truncated: unknown error (%m)\n");
- return -2;
+ /* Sublevel found */
+ if (tap_version_present(record, false))
+ {
+ internal_test_count = find_next_tap_subtest(fp, record, test_name,
+ is_builtin);
+ switch (internal_test_count) {
+ case -2:
+ /* No more data to read */
+ return -1;
+ case -1:
+ /* No test found */
+ return -1;
+ case 0:
+ /* Tests found, but they're missing info */
+ *found_tests = true;
+ return -1;
+ default:
+ *found_tests = true;
+
+ memcpy(base_test_name_for_next_level, base_test_name, BUF_LEN);
+ if (strlen(base_test_name_for_next_level) < BUF_LEN - 1 &&
+ base_test_name_for_next_level[0])
+ strncat(base_test_name_for_next_level, DELIMITER,
+ BUF_LEN - strlen(base_test_name_for_next_level));
+ memcpy(base_test_name_for_next_level + strlen(base_test_name_for_next_level),
+ test_name, BUF_LEN - strlen(base_test_name_for_next_level));
+
+ if (parse_tap_level(fp, base_test_name_for_next_level,
+ internal_test_count, failed_tests, found_tests,
+ is_builtin) == -1)
+ return -1;
+ break;
}
- found_tests = true;
- sublevel++;
- break;
}
switch (parse_kmsg_for_tap(fp, record, test_name)) {
case -2:
- return IGT_EXIT_FAILURE;
+ return -1;
case -1:
- sublevel--;
- failed_tests = true;
- igt_subtest(test_name)
- igt_fail(IGT_EXIT_FAILURE);
+ *failed_tests = true;
+
+ r = malloc(sizeof(*r));
+
+ memcpy(r->test_name, base_test_name, BUF_LEN);
+ if (strlen(r->test_name) < BUF_LEN - 1)
+ if (r->test_name[0])
+ strncat(r->test_name, DELIMITER,
+ BUF_LEN - strlen(r->test_name));
+ memcpy(r->test_name + strlen(r->test_name), test_name,
+ BUF_LEN - strlen(r->test_name));
+ r->test_name[BUF_LEN] = '\0';
+
+ r->passed = false;
+ r->next = NULL;
+
+ pthread_mutex_lock(&results.mutex);
+ if (results.head == NULL) {
+ results.head = r;
+ } else {
+ temp = results.head;
+ while (temp->next != NULL)
+ temp = temp->next;
+ temp->next = r;
+ }
+ pthread_mutex_unlock(&results.mutex);
+
test_name[0] = '\0';
break;
- case 0: /* fallthrough */
- igt_subtest(test_name)
- igt_success();
+ case 0:
+ r = malloc(sizeof(*r));
+
+ memcpy(r->test_name, base_test_name, BUF_LEN);
+ if (strlen(r->test_name) < BUF_LEN - 1)
+ if (r->test_name[0])
+ strncat(r->test_name, DELIMITER,
+ BUF_LEN - strlen(r->test_name));
+ memcpy(r->test_name + strlen(r->test_name), test_name,
+ BUF_LEN - strlen(r->test_name));
+ r->test_name[BUF_LEN] = '\0';
+
+ r->passed = true;
+ r->next = NULL;
+
+ pthread_mutex_lock(&results.mutex);
+ if (results.head == NULL) {
+ results.head = r;
+ } else {
+ temp = results.head;
+ while (temp->next != NULL)
+ temp = temp->next;
+ temp->next = r;
+ }
+ pthread_mutex_unlock(&results.mutex);
+
test_name[0] = '\0';
+ break;
default:
break;
}
}
+ return 0;
+}
+
+/**
+ * igt_ktap_parser:
+ *
+ * This function parses the output of a ktap script and passes it to main thread.
+ */
+void *igt_ktap_parser(void *unused)
+{
+ FILE *fp = ktap_args.fp;
+ int fp_fd = fileno(fp);
+ char record[BUF_LEN + 1];
+ bool is_builtin = ktap_args.is_builtin;
+ char test_name[BUF_LEN + 1];
+ bool failed_tests, found_tests;
+ int test_count;
+
+ failed_tests = false;
+ found_tests = false;
+
+ if (!READ_ONCE(ktap_args.is_running))
+ goto igt_ktap_parser_end;
+
+igt_ktap_parser_start:
+ test_name[0] = '\0';
+ test_name[BUF_LEN] = '\0';
+
+ while (read(fp_fd, record, BUF_LEN) < 0) {
+ if (!READ_ONCE(ktap_args.is_running)) {
+ igt_warn("ktap parser stopped\n");
+ goto igt_ktap_parser_end;
+ }
+
+ if (errno == EAGAIN)
+ /* No records available */
+ continue;
+
+ if (errno == EINTR)
+ continue;
+
+ if (errno == EPIPE) {
+ igt_warn("kmsg truncated: too many messages. You may want to increase log_buf_len in kmcdline\n");
+ goto igt_ktap_parser_end;
+ }
+ }
+
+ test_count = find_next_tap_subtest(fp, record, test_name, is_builtin);
+
+ switch (test_count) {
+ case -2:
+ /* Problems while reading the file */
+ goto igt_ktap_parser_end;
+ case -1:
+ /* No test found */
+ goto igt_ktap_parser_start;
+ case 0:
+ /* Tests found, but they're missing info */
+ found_tests = true;
+ goto igt_ktap_parser_end;
+ default:
+ found_tests = true;
+
+ if (parse_tap_level(fp, test_name, test_count, &failed_tests, &found_tests,
+ is_builtin) == -1)
+ goto igt_ktap_parser_end;
+
+ break;
+ }
+
+ /* Parse topmost level */
+ test_name[0] = '\0';
+ parse_tap_level(fp, test_name, test_count, &failed_tests, &found_tests, is_builtin);
+
+igt_ktap_parser_end:
+ results.still_running = false;
if (failed_tests || !found_tests)
- return IGT_EXIT_FAILURE;
+ ktap_args.ret = IGT_EXIT_FAILURE;
+ else
+ ktap_args.ret = IGT_EXIT_SUCCESS;
+
+ return NULL;
+}
+
+static pthread_t ktap_parser_thread;
+
+struct ktap_test_results *ktap_parser_start(FILE *fp, bool is_builtin)
+{
+ results.head = NULL;
+ pthread_mutex_init(&results.mutex, NULL);
+ results.still_running = true;
- return IGT_EXIT_SUCCESS;
+ ktap_args.fp = fp;
+ ktap_args.is_builtin = is_builtin;
+ ktap_args.is_running = true;
+ pthread_create(&ktap_parser_thread, NULL, igt_ktap_parser, NULL);
+
+ return &results;
+}
+
+int ktap_parser_stop(void)
+{
+ ktap_args.is_running = false;
+ pthread_join(ktap_parser_thread, NULL);
+ return ktap_args.ret;
}
diff --git a/lib/igt_ktap.h b/lib/igt_ktap.h
index b2f69df2..34fe0957 100644
--- a/lib/igt_ktap.h
+++ b/lib/igt_ktap.h
@@ -26,6 +26,25 @@
#define BUF_LEN 4096
-int igt_ktap_parser(FILE *fp, char *record, bool is_builtin);
+#include <pthread.h>
+
+void *igt_ktap_parser(void *unused);
+
+typedef struct ktap_test_results_element {
+ char test_name[BUF_LEN + 1];
+ bool passed;
+ struct ktap_test_results_element *next;
+} ktap_test_results_element;
+
+struct ktap_test_results {
+ ktap_test_results_element *head;
+ pthread_mutex_t mutex;
+ bool still_running;
+};
+
+
+
+struct ktap_test_results *ktap_parser_start(FILE *fp, bool is_builtin);
+int ktap_parser_stop(void);
#endif /* IGT_KTAP_H */
--
2.34.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [igt-dev] [PATCH i-g-t 6/6] Fix drm_mm build error
2023-06-02 8:27 [igt-dev] [PATCH v4 i-g-t 0/6] Introduce KUnit Dominik Karol Piatkowski
` (4 preceding siblings ...)
2023-06-02 8:27 ` [igt-dev] [PATCH i-g-t 5/6] Change logic of ktap parser to run on a thread Dominik Karol Piatkowski
@ 2023-06-02 8:27 ` Dominik Karol Piatkowski
2023-06-05 10:46 ` Mauro Carvalho Chehab
2023-06-02 9:16 ` [igt-dev] ✗ GitLab.Pipeline: warning for Introduce KUnit (rev4) Patchwork
` (2 subsequent siblings)
8 siblings, 1 reply; 11+ messages in thread
From: Dominik Karol Piatkowski @ 2023-06-02 8:27 UTC (permalink / raw)
To: igt-dev
Quick workaround for drm_mm documentation causing compilation error.
Signed-off-by: Dominik Karol Piątkowski <dominik.karol.piatkowski@intel.com>
Cc: Janusz Krzysztofik <janusz.krzysztofik@linux.intel.com>
Cc: Mauro Carvalho Chehab <mauro.chehab@linux.intel.com>
---
tests/i915/i915_test_config.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tests/i915/i915_test_config.json b/tests/i915/i915_test_config.json
index a029801a..ba49de2a 100644
--- a/tests/i915/i915_test_config.json
+++ b/tests/i915/i915_test_config.json
@@ -6,7 +6,7 @@
"../core_hotunplug.c", "../core_setmaster.c",
"../core_setmaster_vs_auth.c", "../debugfs_test.c",
"../device_reset.c", "../dmabuf.c",
- "../drm_import_export.c", "../drm_mm.c",
+ "../drm_import_export.c",
"../dumb_buffer.c", "../prime_busy.c", "../prime_mmap.c",
"../prime_mmap_coherency.c", "../prime_self_import.c",
"../prime_vgem.c", "../sw_sync.c", "../syncobj_basic.c",
--
2.34.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [igt-dev] ✗ GitLab.Pipeline: warning for Introduce KUnit (rev4)
2023-06-02 8:27 [igt-dev] [PATCH v4 i-g-t 0/6] Introduce KUnit Dominik Karol Piatkowski
` (5 preceding siblings ...)
2023-06-02 8:27 ` [igt-dev] [PATCH i-g-t 6/6] Fix drm_mm build error Dominik Karol Piatkowski
@ 2023-06-02 9:16 ` Patchwork
2023-06-02 9:42 ` [igt-dev] ✓ Fi.CI.BAT: success " Patchwork
2023-06-04 8:13 ` [igt-dev] ✓ Fi.CI.IGT: " Patchwork
8 siblings, 0 replies; 11+ messages in thread
From: Patchwork @ 2023-06-02 9:16 UTC (permalink / raw)
To: Dominik Karol Piatkowski; +Cc: igt-dev
== Series Details ==
Series: Introduce KUnit (rev4)
URL : https://patchwork.freedesktop.org/series/114612/
State : warning
== Summary ==
Pipeline status: FAILED.
see https://gitlab.freedesktop.org/gfx-ci/igt-ci-tags/-/pipelines/897380 for the overview.
test:ninja-test has failed (https://gitlab.freedesktop.org/gfx-ci/igt-ci-tags/-/jobs/42942059):
379/383 assembler test/rnde-intsrc OK 0.02 s
380/383 assembler test/rndz OK 0.02 s
381/383 assembler test/lzd OK 0.01 s
382/383 assembler test/not OK 0.01 s
383/383 assembler test/immediate OK 0.02 s
Ok: 376
Expected Fail: 4
Fail: 3
Unexpected Pass: 0
Skipped: 0
Timeout: 0
Full log written to /builds/gfx-ci/igt-ci-tags/build/meson-logs/testlog.txt
section_end:1685697309:step_script
section_start:1685697309:cleanup_file_variables
Cleaning up project directory and file based variables
section_end:1685697312:cleanup_file_variables
ERROR: Job failed: exit code 1
test:ninja-test-clang has failed (https://gitlab.freedesktop.org/gfx-ci/igt-ci-tags/-/jobs/42942058):
379/383 assembler test/rnde-intsrc OK 0.01 s
380/383 assembler test/rndz OK 0.01 s
381/383 assembler test/lzd OK 0.01 s
382/383 assembler test/not OK 0.01 s
383/383 assembler test/immediate OK 0.01 s
Ok: 376
Expected Fail: 4
Fail: 3
Unexpected Pass: 0
Skipped: 0
Timeout: 0
Full log written to /builds/gfx-ci/igt-ci-tags/build/meson-logs/testlog.txt
section_end:1685697255:step_script
section_start:1685697255:cleanup_file_variables
Cleaning up project directory and file based variables
section_end:1685697257:cleanup_file_variables
ERROR: Job failed: exit code 1
== Logs ==
For more details see: https://gitlab.freedesktop.org/gfx-ci/igt-ci-tags/-/pipelines/897380
^ permalink raw reply [flat|nested] 11+ messages in thread
* [igt-dev] ✓ Fi.CI.BAT: success for Introduce KUnit (rev4)
2023-06-02 8:27 [igt-dev] [PATCH v4 i-g-t 0/6] Introduce KUnit Dominik Karol Piatkowski
` (6 preceding siblings ...)
2023-06-02 9:16 ` [igt-dev] ✗ GitLab.Pipeline: warning for Introduce KUnit (rev4) Patchwork
@ 2023-06-02 9:42 ` Patchwork
2023-06-04 8:13 ` [igt-dev] ✓ Fi.CI.IGT: " Patchwork
8 siblings, 0 replies; 11+ messages in thread
From: Patchwork @ 2023-06-02 9:42 UTC (permalink / raw)
To: Dominik Karol Piatkowski; +Cc: igt-dev
[-- Attachment #1: Type: text/plain, Size: 8345 bytes --]
== Series Details ==
Series: Introduce KUnit (rev4)
URL : https://patchwork.freedesktop.org/series/114612/
State : success
== Summary ==
CI Bug Log - changes from CI_DRM_13218 -> IGTPW_9095
====================================================
Summary
-------
**SUCCESS**
No regressions found.
External URL: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9095/index.html
Participating hosts (38 -> 35)
------------------------------
Missing (3): fi-kbl-soraka fi-glk-j4005 fi-kbl-7567u
Known issues
------------
Here are the changes found in IGTPW_9095 that come from known issues:
### IGT changes ###
#### Issues hit ####
* igt@core_hotunplug@unbind-rebind:
- fi-kbl-8809g: NOTRUN -> [ABORT][1] ([i915#8298] / [i915#8299] / [i915#8397])
[1]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9095/fi-kbl-8809g/igt@core_hotunplug@unbind-rebind.html
* igt@gem_huc_copy@huc-copy:
- fi-kbl-8809g: NOTRUN -> [SKIP][2] ([fdo#109271] / [i915#2190])
[2]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9095/fi-kbl-8809g/igt@gem_huc_copy@huc-copy.html
* igt@i915_pm_rpm@basic-pci-d3-state:
- fi-hsw-4770: [PASS][3] -> [SKIP][4] ([fdo#109271])
[3]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13218/fi-hsw-4770/igt@i915_pm_rpm@basic-pci-d3-state.html
[4]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9095/fi-hsw-4770/igt@i915_pm_rpm@basic-pci-d3-state.html
* igt@i915_pm_rpm@basic-rte:
- fi-hsw-4770: [PASS][5] -> [FAIL][6] ([i915#7364])
[5]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13218/fi-hsw-4770/igt@i915_pm_rpm@basic-rte.html
[6]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9095/fi-hsw-4770/igt@i915_pm_rpm@basic-rte.html
* igt@i915_selftest@live@execlists:
- fi-bsw-n3050: [PASS][7] -> [ABORT][8] ([i915#7911] / [i915#7913])
[7]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13218/fi-bsw-n3050/igt@i915_selftest@live@execlists.html
[8]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9095/fi-bsw-n3050/igt@i915_selftest@live@execlists.html
* igt@i915_selftest@live@slpc:
- bat-rpls-2: NOTRUN -> [DMESG-WARN][9] ([i915#6367])
[9]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9095/bat-rpls-2/igt@i915_selftest@live@slpc.html
* igt@i915_suspend@basic-s2idle-without-i915:
- bat-rpls-2: NOTRUN -> [ABORT][10] ([i915#6687])
[10]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9095/bat-rpls-2/igt@i915_suspend@basic-s2idle-without-i915.html
* igt@kms_addfb_basic@too-high:
- fi-kbl-8809g: NOTRUN -> [FAIL][11] ([i915#8296]) +2 similar issues
[11]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9095/fi-kbl-8809g/igt@kms_addfb_basic@too-high.html
* igt@kms_force_connector_basic@force-connector-state:
- fi-kbl-8809g: NOTRUN -> [DMESG-FAIL][12] ([i915#8299])
[12]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9095/fi-kbl-8809g/igt@kms_force_connector_basic@force-connector-state.html
* igt@kms_force_connector_basic@force-edid:
- fi-kbl-8809g: NOTRUN -> [CRASH][13] ([i915#8299])
[13]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9095/fi-kbl-8809g/igt@kms_force_connector_basic@force-edid.html
* igt@kms_pipe_crc_basic@nonblocking-crc@pipe-c-dp-1:
- bat-dg2-8: [PASS][14] -> [FAIL][15] ([i915#7932])
[14]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13218/bat-dg2-8/igt@kms_pipe_crc_basic@nonblocking-crc@pipe-c-dp-1.html
[15]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9095/bat-dg2-8/igt@kms_pipe_crc_basic@nonblocking-crc@pipe-c-dp-1.html
* igt@kms_pipe_crc_basic@read-crc:
- bat-adlp-9: NOTRUN -> [SKIP][16] ([i915#3546]) +1 similar issue
[16]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9095/bat-adlp-9/igt@kms_pipe_crc_basic@read-crc.html
* igt@kms_psr@cursor_plane_move:
- fi-kbl-8809g: NOTRUN -> [SKIP][17] ([fdo#109271]) +59 similar issues
[17]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9095/fi-kbl-8809g/igt@kms_psr@cursor_plane_move.html
* igt@kms_setmode@basic-clone-single-crtc:
- fi-kbl-8809g: NOTRUN -> [SKIP][18] ([fdo#109271] / [i915#4579])
[18]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9095/fi-kbl-8809g/igt@kms_setmode@basic-clone-single-crtc.html
#### Possible fixes ####
* igt@core_auth@basic-auth:
- {bat-adlp-11}: [ABORT][19] ([i915#4423] / [i915#8011]) -> [PASS][20]
[19]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13218/bat-adlp-11/igt@core_auth@basic-auth.html
[20]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9095/bat-adlp-11/igt@core_auth@basic-auth.html
* igt@i915_module_load@load:
- {bat-adlp-11}: [DMESG-WARN][21] ([i915#4423]) -> [PASS][22]
[21]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13218/bat-adlp-11/igt@i915_module_load@load.html
[22]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9095/bat-adlp-11/igt@i915_module_load@load.html
* igt@i915_selftest@live@gt_heartbeat:
- fi-apl-guc: [DMESG-FAIL][23] ([i915#5334]) -> [PASS][24]
[23]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13218/fi-apl-guc/igt@i915_selftest@live@gt_heartbeat.html
[24]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9095/fi-apl-guc/igt@i915_selftest@live@gt_heartbeat.html
* igt@i915_selftest@live@hugepages:
- fi-apl-guc: [DMESG-FAIL][25] -> [PASS][26]
[25]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13218/fi-apl-guc/igt@i915_selftest@live@hugepages.html
[26]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9095/fi-apl-guc/igt@i915_selftest@live@hugepages.html
* igt@i915_selftest@live@requests:
- bat-rpls-2: [ABORT][27] ([i915#4983] / [i915#7913]) -> [PASS][28]
[27]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13218/bat-rpls-2/igt@i915_selftest@live@requests.html
[28]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9095/bat-rpls-2/igt@i915_selftest@live@requests.html
{name}: This element is suppressed. This means it is ignored when computing
the status of the difference (SUCCESS, WARNING, or FAILURE).
[fdo#109271]: https://bugs.freedesktop.org/show_bug.cgi?id=109271
[i915#2190]: https://gitlab.freedesktop.org/drm/intel/issues/2190
[i915#3282]: https://gitlab.freedesktop.org/drm/intel/issues/3282
[i915#3546]: https://gitlab.freedesktop.org/drm/intel/issues/3546
[i915#4423]: https://gitlab.freedesktop.org/drm/intel/issues/4423
[i915#4579]: https://gitlab.freedesktop.org/drm/intel/issues/4579
[i915#4983]: https://gitlab.freedesktop.org/drm/intel/issues/4983
[i915#5334]: https://gitlab.freedesktop.org/drm/intel/issues/5334
[i915#6367]: https://gitlab.freedesktop.org/drm/intel/issues/6367
[i915#6687]: https://gitlab.freedesktop.org/drm/intel/issues/6687
[i915#7269]: https://gitlab.freedesktop.org/drm/intel/issues/7269
[i915#7364]: https://gitlab.freedesktop.org/drm/intel/issues/7364
[i915#7456]: https://gitlab.freedesktop.org/drm/intel/issues/7456
[i915#7911]: https://gitlab.freedesktop.org/drm/intel/issues/7911
[i915#7913]: https://gitlab.freedesktop.org/drm/intel/issues/7913
[i915#7932]: https://gitlab.freedesktop.org/drm/intel/issues/7932
[i915#8011]: https://gitlab.freedesktop.org/drm/intel/issues/8011
[i915#8296]: https://gitlab.freedesktop.org/drm/intel/issues/8296
[i915#8298]: https://gitlab.freedesktop.org/drm/intel/issues/8298
[i915#8299]: https://gitlab.freedesktop.org/drm/intel/issues/8299
[i915#8397]: https://gitlab.freedesktop.org/drm/intel/issues/8397
Build changes
-------------
* CI: CI-20190529 -> None
* IGT: IGT_7317 -> IGTPW_9095
CI-20190529: 20190529
CI_DRM_13218: 42043133c83c69e384fb66060c97b093df67aed7 @ git://anongit.freedesktop.org/gfx-ci/linux
IGTPW_9095: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9095/index.html
IGT_7317: c902b72df45aa49faa38205bc5be3c748d33a3e0 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
Testlist changes
----------------
+igt@kms_dp_tiled_display@basic-test-pattern
+igt@kms_dp_tiled_display@basic-test-pattern-with-chamelium
-igt@drm_buddy@all-tests
-igt@drm_mm@all-tests
-igt@kms_selftest@all-tests
-igt@kms_tiled_display@basic-test-pattern
-igt@kms_tiled_display@basic-test-pattern-with-chamelium
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9095/index.html
[-- Attachment #2: Type: text/html, Size: 9712 bytes --]
^ permalink raw reply [flat|nested] 11+ messages in thread
* [igt-dev] ✓ Fi.CI.IGT: success for Introduce KUnit (rev4)
2023-06-02 8:27 [igt-dev] [PATCH v4 i-g-t 0/6] Introduce KUnit Dominik Karol Piatkowski
` (7 preceding siblings ...)
2023-06-02 9:42 ` [igt-dev] ✓ Fi.CI.BAT: success " Patchwork
@ 2023-06-04 8:13 ` Patchwork
8 siblings, 0 replies; 11+ messages in thread
From: Patchwork @ 2023-06-04 8:13 UTC (permalink / raw)
To: Dominik Karol Piatkowski; +Cc: igt-dev
[-- Attachment #1: Type: text/plain, Size: 13986 bytes --]
== Series Details ==
Series: Introduce KUnit (rev4)
URL : https://patchwork.freedesktop.org/series/114612/
State : success
== Summary ==
CI Bug Log - changes from CI_DRM_13218_full -> IGTPW_9095_full
====================================================
Summary
-------
**SUCCESS**
No regressions found.
External URL: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9095/index.html
Participating hosts (7 -> 7)
------------------------------
No changes in participating hosts
Known issues
------------
Here are the changes found in IGTPW_9095_full that come from known issues:
### IGT changes ###
#### Issues hit ####
* igt@gem_barrier_race@remote-request@rcs0:
- shard-apl: [PASS][1] -> [ABORT][2] ([i915#7461] / [i915#8190])
[1]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13218/shard-apl3/igt@gem_barrier_race@remote-request@rcs0.html
[2]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9095/shard-apl1/igt@gem_barrier_race@remote-request@rcs0.html
* igt@gem_exec_fair@basic-pace-solo@rcs0:
- shard-apl: [PASS][3] -> [FAIL][4] ([i915#2842])
[3]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13218/shard-apl6/igt@gem_exec_fair@basic-pace-solo@rcs0.html
[4]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9095/shard-apl6/igt@gem_exec_fair@basic-pace-solo@rcs0.html
* igt@i915_pm_dc@dc9-dpms:
- shard-apl: [PASS][5] -> [SKIP][6] ([fdo#109271])
[5]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13218/shard-apl3/igt@i915_pm_dc@dc9-dpms.html
[6]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9095/shard-apl7/igt@i915_pm_dc@dc9-dpms.html
* igt@i915_suspend@forcewake:
- shard-apl: [PASS][7] -> [ABORT][8] ([i915#180])
[7]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13218/shard-apl6/igt@i915_suspend@forcewake.html
[8]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9095/shard-apl1/igt@i915_suspend@forcewake.html
* igt@kms_cursor_legacy@flip-vs-cursor-atomic-transitions:
- shard-apl: [PASS][9] -> [FAIL][10] ([i915#2346])
[9]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13218/shard-apl6/igt@kms_cursor_legacy@flip-vs-cursor-atomic-transitions.html
[10]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9095/shard-apl7/igt@kms_cursor_legacy@flip-vs-cursor-atomic-transitions.html
* igt@kms_fbcon_fbt@fbc-suspend:
- shard-apl: [PASS][11] -> [FAIL][12] ([i915#4767])
[11]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13218/shard-apl3/igt@kms_fbcon_fbt@fbc-suspend.html
[12]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9095/shard-apl1/igt@kms_fbcon_fbt@fbc-suspend.html
* igt@kms_flip@flip-vs-expired-vblank-interruptible@a-hdmi-a2:
- shard-glk: [PASS][13] -> [FAIL][14] ([i915#79])
[13]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13218/shard-glk8/igt@kms_flip@flip-vs-expired-vblank-interruptible@a-hdmi-a2.html
[14]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9095/shard-glk9/igt@kms_flip@flip-vs-expired-vblank-interruptible@a-hdmi-a2.html
* igt@kms_hdmi_inject@inject-audio:
- shard-snb: [PASS][15] -> [SKIP][16] ([fdo#109271])
[15]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13218/shard-snb4/igt@kms_hdmi_inject@inject-audio.html
[16]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9095/shard-snb4/igt@kms_hdmi_inject@inject-audio.html
* igt@kms_plane_scaling@planes-downscale-factor-0-75-unity-scaling@pipe-a-vga-1:
- shard-snb: NOTRUN -> [SKIP][17] ([fdo#109271]) +15 similar issues
[17]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9095/shard-snb6/igt@kms_plane_scaling@planes-downscale-factor-0-75-unity-scaling@pipe-a-vga-1.html
* igt@kms_plane_scaling@planes-downscale-factor-0-75-unity-scaling@pipe-b-vga-1:
- shard-snb: NOTRUN -> [SKIP][18] ([fdo#109271] / [i915#4579]) +11 similar issues
[18]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9095/shard-snb6/igt@kms_plane_scaling@planes-downscale-factor-0-75-unity-scaling@pipe-b-vga-1.html
#### Possible fixes ####
* igt@gem_eio@reset-stress:
- {shard-dg1}: [FAIL][19] ([i915#5784]) -> [PASS][20]
[19]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13218/shard-dg1-14/igt@gem_eio@reset-stress.html
[20]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9095/shard-dg1-16/igt@gem_eio@reset-stress.html
* igt@gem_exec_fair@basic-pace-share@rcs0:
- shard-glk: [FAIL][21] ([i915#2842]) -> [PASS][22] +3 similar issues
[21]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13218/shard-glk7/igt@gem_exec_fair@basic-pace-share@rcs0.html
[22]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9095/shard-glk3/igt@gem_exec_fair@basic-pace-share@rcs0.html
* igt@gem_exec_fair@basic-pace@rcs0:
- {shard-rkl}: [FAIL][23] ([i915#2842]) -> [PASS][24] +1 similar issue
[23]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13218/shard-rkl-1/igt@gem_exec_fair@basic-pace@rcs0.html
[24]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9095/shard-rkl-6/igt@gem_exec_fair@basic-pace@rcs0.html
* igt@i915_pm_rc6_residency@rc6-fence:
- {shard-tglu}: [WARN][25] ([i915#2681]) -> [PASS][26]
[25]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13218/shard-tglu-5/igt@i915_pm_rc6_residency@rc6-fence.html
[26]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9095/shard-tglu-6/igt@i915_pm_rc6_residency@rc6-fence.html
* igt@i915_pm_rpm@dpms-mode-unset-lpsp:
- {shard-rkl}: [SKIP][27] ([i915#1397]) -> [PASS][28] +1 similar issue
[27]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13218/shard-rkl-1/igt@i915_pm_rpm@dpms-mode-unset-lpsp.html
[28]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9095/shard-rkl-7/igt@i915_pm_rpm@dpms-mode-unset-lpsp.html
* igt@i915_pm_rpm@modeset-non-lpsp:
- {shard-dg1}: [SKIP][29] ([i915#1397]) -> [PASS][30]
[29]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13218/shard-dg1-19/igt@i915_pm_rpm@modeset-non-lpsp.html
[30]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9095/shard-dg1-18/igt@i915_pm_rpm@modeset-non-lpsp.html
* igt@kms_big_fb@y-tiled-32bpp-rotate-90:
- shard-glk: [DMESG-WARN][31] -> [PASS][32]
[31]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13218/shard-glk9/igt@kms_big_fb@y-tiled-32bpp-rotate-90.html
[32]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9095/shard-glk9/igt@kms_big_fb@y-tiled-32bpp-rotate-90.html
* igt@kms_cursor_legacy@single-move@pipe-b:
- {shard-dg1}: [INCOMPLETE][33] ([i915#8011] / [i915#8347]) -> [PASS][34] +1 similar issue
[33]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13218/shard-dg1-19/igt@kms_cursor_legacy@single-move@pipe-b.html
[34]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9095/shard-dg1-17/igt@kms_cursor_legacy@single-move@pipe-b.html
* igt@kms_flip@flip-vs-expired-vblank-interruptible@a-dp1:
- shard-apl: [FAIL][35] ([i915#79]) -> [PASS][36]
[35]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_13218/shard-apl3/igt@kms_flip@flip-vs-expired-vblank-interruptible@a-dp1.html
[36]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9095/shard-apl3/igt@kms_flip@flip-vs-expired-vblank-interruptible@a-dp1.html
{name}: This element is suppressed. This means it is ignored when computing
the status of the difference (SUCCESS, WARNING, or FAILURE).
[fdo#109271]: https://bugs.freedesktop.org/show_bug.cgi?id=109271
[fdo#109280]: https://bugs.freedesktop.org/show_bug.cgi?id=109280
[fdo#109289]: https://bugs.freedesktop.org/show_bug.cgi?id=109289
[fdo#109300]: https://bugs.freedesktop.org/show_bug.cgi?id=109300
[fdo#109315]: https://bugs.freedesktop.org/show_bug.cgi?id=109315
[fdo#110189]: https://bugs.freedesktop.org/show_bug.cgi?id=110189
[fdo#110723]: https://bugs.freedesktop.org/show_bug.cgi?id=110723
[fdo#111068]: https://bugs.freedesktop.org/show_bug.cgi?id=111068
[fdo#111614]: https://bugs.freedesktop.org/show_bug.cgi?id=111614
[fdo#111615]: https://bugs.freedesktop.org/show_bug.cgi?id=111615
[fdo#111825]: https://bugs.freedesktop.org/show_bug.cgi?id=111825
[fdo#111827]: https://bugs.freedesktop.org/show_bug.cgi?id=111827
[i915#1072]: https://gitlab.freedesktop.org/drm/intel/issues/1072
[i915#1397]: https://gitlab.freedesktop.org/drm/intel/issues/1397
[i915#180]: https://gitlab.freedesktop.org/drm/intel/issues/180
[i915#1825]: https://gitlab.freedesktop.org/drm/intel/issues/1825
[i915#2346]: https://gitlab.freedesktop.org/drm/intel/issues/2346
[i915#2527]: https://gitlab.freedesktop.org/drm/intel/issues/2527
[i915#2575]: https://gitlab.freedesktop.org/drm/intel/issues/2575
[i915#2587]: https://gitlab.freedesktop.org/drm/intel/issues/2587
[i915#2672]: https://gitlab.freedesktop.org/drm/intel/issues/2672
[i915#2681]: https://gitlab.freedesktop.org/drm/intel/issues/2681
[i915#2705]: https://gitlab.freedesktop.org/drm/intel/issues/2705
[i915#2842]: https://gitlab.freedesktop.org/drm/intel/issues/2842
[i915#3023]: https://gitlab.freedesktop.org/drm/intel/issues/3023
[i915#3281]: https://gitlab.freedesktop.org/drm/intel/issues/3281
[i915#3282]: https://gitlab.freedesktop.org/drm/intel/issues/3282
[i915#3297]: https://gitlab.freedesktop.org/drm/intel/issues/3297
[i915#3359]: https://gitlab.freedesktop.org/drm/intel/issues/3359
[i915#3361]: https://gitlab.freedesktop.org/drm/intel/issues/3361
[i915#3458]: https://gitlab.freedesktop.org/drm/intel/issues/3458
[i915#3539]: https://gitlab.freedesktop.org/drm/intel/issues/3539
[i915#3555]: https://gitlab.freedesktop.org/drm/intel/issues/3555
[i915#3591]: https://gitlab.freedesktop.org/drm/intel/issues/3591
[i915#3638]: https://gitlab.freedesktop.org/drm/intel/issues/3638
[i915#3689]: https://gitlab.freedesktop.org/drm/intel/issues/3689
[i915#3734]: https://gitlab.freedesktop.org/drm/intel/issues/3734
[i915#3742]: https://gitlab.freedesktop.org/drm/intel/issues/3742
[i915#3886]: https://gitlab.freedesktop.org/drm/intel/issues/3886
[i915#3955]: https://gitlab.freedesktop.org/drm/intel/issues/3955
[i915#404]: https://gitlab.freedesktop.org/drm/intel/issues/404
[i915#4070]: https://gitlab.freedesktop.org/drm/intel/issues/4070
[i915#4077]: https://gitlab.freedesktop.org/drm/intel/issues/4077
[i915#4078]: https://gitlab.freedesktop.org/drm/intel/issues/4078
[i915#4079]: https://gitlab.freedesktop.org/drm/intel/issues/4079
[i915#4083]: https://gitlab.freedesktop.org/drm/intel/issues/4083
[i915#4103]: https://gitlab.freedesktop.org/drm/intel/issues/4103
[i915#4213]: https://gitlab.freedesktop.org/drm/intel/issues/4213
[i915#4270]: https://gitlab.freedesktop.org/drm/intel/issues/4270
[i915#4275]: https://gitlab.freedesktop.org/drm/intel/issues/4275
[i915#4281]: https://gitlab.freedesktop.org/drm/intel/issues/4281
[i915#4349]: https://gitlab.freedesktop.org/drm/intel/issues/4349
[i915#4387]: https://gitlab.freedesktop.org/drm/intel/issues/4387
[i915#4391]: https://gitlab.freedesktop.org/drm/intel/issues/4391
[i915#4423]: https://gitlab.freedesktop.org/drm/intel/issues/4423
[i915#4525]: https://gitlab.freedesktop.org/drm/intel/issues/4525
[i915#4538]: https://gitlab.freedesktop.org/drm/intel/issues/4538
[i915#4565]: https://gitlab.freedesktop.org/drm/intel/issues/4565
[i915#4579]: https://gitlab.freedesktop.org/drm/intel/issues/4579
[i915#4613]: https://gitlab.freedesktop.org/drm/intel/issues/4613
[i915#4767]: https://gitlab.freedesktop.org/drm/intel/issues/4767
[i915#4833]: https://gitlab.freedesktop.org/drm/intel/issues/4833
[i915#4860]: https://gitlab.freedesktop.org/drm/intel/issues/4860
[i915#5176]: https://gitlab.freedesktop.org/drm/intel/issues/5176
[i915#5235]: https://gitlab.freedesktop.org/drm/intel/issues/5235
[i915#5286]: https://gitlab.freedesktop.org/drm/intel/issues/5286
[i915#5289]: https://gitlab.freedesktop.org/drm/intel/issues/5289
[i915#533]: https://gitlab.freedesktop.org/drm/intel/issues/533
[i915#5354]: https://gitlab.freedesktop.org/drm/intel/issues/5354
[i915#5784]: https://gitlab.freedesktop.org/drm/intel/issues/5784
[i915#6095]: https://gitlab.freedesktop.org/drm/intel/issues/6095
[i915#6524]: https://gitlab.freedesktop.org/drm/intel/issues/6524
[i915#658]: https://gitlab.freedesktop.org/drm/intel/issues/658
[i915#6768]: https://gitlab.freedesktop.org/drm/intel/issues/6768
[i915#7116]: https://gitlab.freedesktop.org/drm/intel/issues/7116
[i915#7118]: https://gitlab.freedesktop.org/drm/intel/issues/7118
[i915#7461]: https://gitlab.freedesktop.org/drm/intel/issues/7461
[i915#7561]: https://gitlab.freedesktop.org/drm/intel/issues/7561
[i915#7697]: https://gitlab.freedesktop.org/drm/intel/issues/7697
[i915#7711]: https://gitlab.freedesktop.org/drm/intel/issues/7711
[i915#7828]: https://gitlab.freedesktop.org/drm/intel/issues/7828
[i915#79]: https://gitlab.freedesktop.org/drm/intel/issues/79
[i915#8011]: https://gitlab.freedesktop.org/drm/intel/issues/8011
[i915#8190]: https://gitlab.freedesktop.org/drm/intel/issues/8190
[i915#8347]: https://gitlab.freedesktop.org/drm/intel/issues/8347
[i915#8411]: https://gitlab.freedesktop.org/drm/intel/issues/8411
[i915#8414]: https://gitlab.freedesktop.org/drm/intel/issues/8414
[i915#8502]: https://gitlab.freedesktop.org/drm/intel/issues/8502
Build changes
-------------
* CI: CI-20190529 -> None
* IGT: IGT_7317 -> IGTPW_9095
* Piglit: piglit_4509 -> None
CI-20190529: 20190529
CI_DRM_13218: 42043133c83c69e384fb66060c97b093df67aed7 @ git://anongit.freedesktop.org/gfx-ci/linux
IGTPW_9095: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9095/index.html
IGT_7317: c902b72df45aa49faa38205bc5be3c748d33a3e0 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
piglit_4509: fdc5a4ca11124ab8413c7988896eec4c97336694 @ git://anongit.freedesktop.org/piglit
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_9095/index.html
[-- Attachment #2: Type: text/html, Size: 10518 bytes --]
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [igt-dev] [PATCH i-g-t 6/6] Fix drm_mm build error
2023-06-02 8:27 ` [igt-dev] [PATCH i-g-t 6/6] Fix drm_mm build error Dominik Karol Piatkowski
@ 2023-06-05 10:46 ` Mauro Carvalho Chehab
0 siblings, 0 replies; 11+ messages in thread
From: Mauro Carvalho Chehab @ 2023-06-05 10:46 UTC (permalink / raw)
To: Dominik Karol Piatkowski; +Cc: igt-dev
On Fri, 2 Jun 2023 10:27:21 +0200
Dominik Karol Piatkowski <dominik.karol.piatkowski@intel.com> wrote:
> Quick workaround for drm_mm documentation causing compilation error.
NACK.
This is actually a runtime error at drm_mm:
$ ./build/tests/drm_mm --list
Received signal SIGSEGV.
Stack trace:
#0 [fatal_sig_handler+0x17b]
#1 [__sigaction+0x50]
#2 [igt_kunit+0x55]
#3 [main+0x2a]
#4 [__libc_start_call_main+0x7a]
#5 [__libc_start_main+0x8b]
#6 [_start+0x25]
Segmentation fault (core dumped)
I'll reply to this thread with two patches addressing the issue.
Regards,
Mauro
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2023-06-05 10:46 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-06-02 8:27 [igt-dev] [PATCH v4 i-g-t 0/6] Introduce KUnit Dominik Karol Piatkowski
2023-06-02 8:27 ` [igt-dev] [PATCH i-g-t 1/6] lib/igt_kmod: rename kselftest functions to ktest Dominik Karol Piatkowski
2023-06-02 8:27 ` [igt-dev] [PATCH i-g-t 2/6] lib/igt_kmod.c: check if module is builtin before attempting to unload it Dominik Karol Piatkowski
2023-06-02 8:27 ` [igt-dev] [PATCH i-g-t 3/6] lib/igt_kmod: add compatibility for KUnit Dominik Karol Piatkowski
2023-06-02 8:27 ` [igt-dev] [PATCH i-g-t 4/6] tests: DRM selftests: switch to KUnit Dominik Karol Piatkowski
2023-06-02 8:27 ` [igt-dev] [PATCH i-g-t 5/6] Change logic of ktap parser to run on a thread Dominik Karol Piatkowski
2023-06-02 8:27 ` [igt-dev] [PATCH i-g-t 6/6] Fix drm_mm build error Dominik Karol Piatkowski
2023-06-05 10:46 ` Mauro Carvalho Chehab
2023-06-02 9:16 ` [igt-dev] ✗ GitLab.Pipeline: warning for Introduce KUnit (rev4) Patchwork
2023-06-02 9:42 ` [igt-dev] ✓ Fi.CI.BAT: success " Patchwork
2023-06-04 8:13 ` [igt-dev] ✓ Fi.CI.IGT: " Patchwork
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.