All of lore.kernel.org
 help / color / mirror / Atom feed
* [igt-dev] [PATCH i-g-t] lib/igt_list: Update, clean-up and document igt_list
@ 2019-10-24 12:31 Arkadiusz Hiler
  2019-10-24 14:47 ` [igt-dev] ✓ Fi.CI.BAT: success for lib/igt_list: Update, clean-up and document igt_list (rev2) Patchwork
                   ` (6 more replies)
  0 siblings, 7 replies; 9+ messages in thread
From: Arkadiusz Hiler @ 2019-10-24 12:31 UTC (permalink / raw)
  To: igt-dev; +Cc: Petri Latvala

Our list was something between Wayland and Linux Kernel list
implementations, right in the uncanny valley.

On top of that it falsely claimed that it's a straight copy from the
Wayland project.

Let's make our impl more akin to the kernel one to ease the cognitive
dissonance for the developers working on all those projects.

This patch:
 * mimics the current kernel list interface
 * separates IGT helpers in the source files
 * adds brief explanation and code example for igt-doc
 * introduces igt_list.c as static inlines are not visible in the docs

v2: mimic the kernel instead of wayland (Chris)
    - _head suffix for the sentinel/link struct
    - _entry_ in iterator names that go over the elements

Cc: Petri Latvala <petri.latvala@intel.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Arkadiusz Hiler <arkadiusz.hiler@intel.com>
---
 benchmarks/gem_wsim.c                         |   6 +-
 .../igt-gpu-tools/igt-gpu-tools-docs.xml      |   1 +
 lib/Makefile.sources                          |   2 +
 lib/igt_chamelium.c                           |   8 +-
 lib/igt_core.c                                |   8 +-
 lib/igt_dummyload.c                           |  10 +-
 lib/igt_dummyload.h                           |   2 +-
 lib/igt_kmod.c                                |  10 +-
 lib/igt_kmod.h                                |   4 +-
 lib/igt_list.c                                |  66 +++++++
 lib/igt_list.h                                | 164 +++++++++---------
 lib/meson.build                               |   1 +
 tests/vc4_purgeable_bo.c                      |  28 +--
 13 files changed, 189 insertions(+), 121 deletions(-)
 create mode 100644 lib/igt_list.c

diff --git a/benchmarks/gem_wsim.c b/benchmarks/gem_wsim.c
index 87f873b0..d3c88615 100644
--- a/benchmarks/gem_wsim.c
+++ b/benchmarks/gem_wsim.c
@@ -142,7 +142,7 @@ struct w_step
 
 	/* Implementation details */
 	unsigned int idx;
-	struct igt_list rq_link;
+	struct igt_list_head rq_link;
 	unsigned int request;
 	unsigned int preempt_us;
 
@@ -213,7 +213,7 @@ struct workload
 	unsigned long qd_sum[NUM_ENGINES];
 	unsigned long nr_bb[NUM_ENGINES];
 
-	struct igt_list requests[NUM_ENGINES];
+	struct igt_list_head requests[NUM_ENGINES];
 	unsigned int nrequest[NUM_ENGINES];
 
 	struct workload *global_wrk;
@@ -1061,7 +1061,7 @@ clone_workload(struct workload *_wrk)
 	}
 
 	for (i = 0; i < NUM_ENGINES; i++)
-		igt_list_init(&wrk->requests[i]);
+		IGT_INIT_LIST_HEAD(&wrk->requests[i]);
 
 	return wrk;
 }
diff --git a/docs/reference/igt-gpu-tools/igt-gpu-tools-docs.xml b/docs/reference/igt-gpu-tools/igt-gpu-tools-docs.xml
index ac83272f..3f14d7be 100644
--- a/docs/reference/igt-gpu-tools/igt-gpu-tools-docs.xml
+++ b/docs/reference/igt-gpu-tools/igt-gpu-tools-docs.xml
@@ -31,6 +31,7 @@
     <xi:include href="xml/igt_gvt.xml"/>
     <xi:include href="xml/igt_kmod.xml"/>
     <xi:include href="xml/igt_kms.xml"/>
+    <xi:include href="xml/igt_list.xml"/>
     <xi:include href="xml/igt_pm.xml"/>
     <xi:include href="xml/igt_primes.xml"/>
     <xi:include href="xml/igt_rand.xml"/>
diff --git a/lib/Makefile.sources b/lib/Makefile.sources
index 34e0c012..1b58b6d0 100644
--- a/lib/Makefile.sources
+++ b/lib/Makefile.sources
@@ -41,6 +41,8 @@ lib_source_list =	 	\
 	igt_halffloat.h		\
 	igt_infoframe.c		\
 	igt_infoframe.h		\
+	igt_list.c		\
+	igt_list.h		\
 	igt_matrix.c		\
 	igt_matrix.h		\
 	igt_primes.c		\
diff --git a/lib/igt_chamelium.c b/lib/igt_chamelium.c
index 1b03a103..9971f51d 100644
--- a/lib/igt_chamelium.c
+++ b/lib/igt_chamelium.c
@@ -87,7 +87,7 @@ struct chamelium_edid {
 	struct edid *base;
 	struct edid *raw[CHAMELIUM_MAX_PORTS];
 	int ids[CHAMELIUM_MAX_PORTS];
-	struct igt_list link;
+	struct igt_list_head link;
 };
 
 struct chamelium_port {
@@ -122,7 +122,7 @@ struct chamelium {
 
 	int drm_fd;
 
-	struct igt_list edids;
+	struct igt_list_head edids;
 	struct chamelium_port ports[CHAMELIUM_MAX_PORTS];
 	int port_count;
 };
@@ -2336,7 +2336,7 @@ struct chamelium *chamelium_init(int drm_fd)
 
 	memset(chamelium, 0, sizeof(*chamelium));
 	chamelium->drm_fd = drm_fd;
-	igt_list_init(&chamelium->edids);
+	IGT_INIT_LIST_HEAD(&chamelium->edids);
 
 	/* Setup the libxmlrpc context */
 	xmlrpc_env_init(&chamelium->env);
@@ -2388,7 +2388,7 @@ void chamelium_deinit(struct chamelium *chamelium)
 		chamelium_plug(chamelium, &chamelium->ports[i]);
 
 	/* Destroy any EDIDs we created to make sure we don't leak them */
-	igt_list_for_each_safe(pos, tmp, &chamelium->edids, link) {
+	igt_list_for_each_entry_safe(pos, tmp, &chamelium->edids, link) {
 		for (i = 0; i < CHAMELIUM_MAX_PORTS; i++) {
 			if (pos->ids[i])
 				chamelium_destroy_edid(chamelium, pos->ids[i]);
diff --git a/lib/igt_core.c b/lib/igt_core.c
index 7bd5afa5..86ce8af9 100644
--- a/lib/igt_core.c
+++ b/lib/igt_core.c
@@ -278,10 +278,10 @@ static char __current_description[512];
 
 struct description_node {
 	char desc[sizeof(__current_description)];
-	struct igt_list link;
+	struct igt_list_head link;
 };
 
-static struct igt_list subgroup_descriptions;
+static struct igt_list_head subgroup_descriptions;
 
 
 bool __igt_plain_output = false;
@@ -797,7 +797,7 @@ static int common_init(int *argc, char **argv,
 	int ret = 0;
 
 	common_init_env();
-	igt_list_init(&subgroup_descriptions);
+	IGT_INIT_LIST_HEAD(&subgroup_descriptions);
 
 	command_str = argv[0];
 	if (strrchr(command_str, '/'))
@@ -1068,7 +1068,7 @@ static void __igt_print_description(const char *subtest_name, const char *file,
 
 	printf("SUB %s %s:%d:\n", subtest_name, file, line);
 
-	igt_list_for_each(desc, &subgroup_descriptions, link) {
+	igt_list_for_each_entry(desc, &subgroup_descriptions, link) {
 		print_line_wrapping(indent, desc->desc);
 		printf("\n");
 		has_doc = true;
diff --git a/lib/igt_dummyload.c b/lib/igt_dummyload.c
index 6060878d..b9e239db 100644
--- a/lib/igt_dummyload.c
+++ b/lib/igt_dummyload.c
@@ -65,7 +65,7 @@
 static const int BATCH_SIZE = 4096;
 static const int LOOP_START_OFFSET = 64;
 
-static IGT_LIST(spin_list);
+static IGT_LIST_HEAD(spin_list);
 static pthread_mutex_t list_lock = PTHREAD_MUTEX_INITIALIZER;
 
 static int
@@ -464,7 +464,7 @@ void igt_terminate_spins(void)
 	struct igt_spin *iter;
 
 	pthread_mutex_lock(&list_lock);
-	igt_list_for_each(iter, &spin_list, link)
+	igt_list_for_each_entry(iter, &spin_list, link)
 		igt_spin_end(iter);
 	pthread_mutex_unlock(&list_lock);
 }
@@ -474,9 +474,9 @@ void igt_unshare_spins(void)
 	struct igt_spin *it, *n;
 
 	/* Disable the automatic termination on inherited spinners */
-	igt_list_for_each_safe(it, n, &spin_list, link)
-		igt_list_init(&it->link);
-	igt_list_init(&spin_list);
+	igt_list_for_each_entry_safe(it, n, &spin_list, link)
+		IGT_INIT_LIST_HEAD(&it->link);
+	IGT_INIT_LIST_HEAD(&spin_list);
 }
 
 static uint32_t plug_vgem_handle(struct igt_cork *cork, int fd)
diff --git a/lib/igt_dummyload.h b/lib/igt_dummyload.h
index 66837057..421ca183 100644
--- a/lib/igt_dummyload.h
+++ b/lib/igt_dummyload.h
@@ -35,7 +35,7 @@
 typedef struct igt_spin {
 	unsigned int handle;
 	timer_t timer;
-	struct igt_list link;
+	struct igt_list_head link;
 
 	uint32_t *condition;
 	uint32_t cmd_precondition;
diff --git a/lib/igt_kmod.c b/lib/igt_kmod.c
index c3da4667..f756f80e 100644
--- a/lib/igt_kmod.c
+++ b/lib/igt_kmod.c
@@ -412,11 +412,11 @@ static void kmsg_dump(int fd)
 	}
 }
 
-static void tests_add(struct igt_kselftest_list *tl, struct igt_list *list)
+static void tests_add(struct igt_kselftest_list *tl, struct igt_list_head *list)
 {
 	struct igt_kselftest_list *pos;
 
-	igt_list_for_each(pos, list, link)
+	igt_list_for_each_entry(pos, list, link)
 		if (pos->number > tl->number)
 			break;
 
@@ -425,7 +425,7 @@ static void tests_add(struct igt_kselftest_list *tl, struct igt_list *list)
 
 void igt_kselftest_get_tests(struct kmod_module *kmod,
 			     const char *filter,
-			     struct igt_list *tests)
+			     struct igt_list_head *tests)
 {
 	const char *param_prefix = "igt__";
 	const int prefix_len = strlen(param_prefix);
@@ -568,7 +568,7 @@ void igt_kselftests(const char *module_name,
 		    const char *filter)
 {
 	struct igt_kselftest tst;
-	IGT_LIST(tests);
+	IGT_LIST_HEAD(tests);
 	struct igt_kselftest_list *tl, *tn;
 
 	if (igt_kselftest_init(&tst, module_name) != 0)
@@ -578,7 +578,7 @@ void igt_kselftests(const char *module_name,
 		igt_require(igt_kselftest_begin(&tst) == 0);
 
 	igt_kselftest_get_tests(tst.kmod, filter, &tests);
-	igt_list_for_each_safe(tl, tn, &tests, link) {
+	igt_list_for_each_entry_safe(tl, tn, &tests, link) {
 		igt_subtest_f("%s", tl->name)
 			igt_kselftest_execute(&tst, tl, options, result);
 		free(tl);
diff --git a/lib/igt_kmod.h b/lib/igt_kmod.h
index 87d36d40..b15cde46 100644
--- a/lib/igt_kmod.h
+++ b/lib/igt_kmod.h
@@ -49,7 +49,7 @@ struct igt_kselftest {
 };
 
 struct igt_kselftest_list {
-	struct igt_list link;
+	struct igt_list_head link;
 	unsigned int number;
 	char *name;
 	char param[];
@@ -61,7 +61,7 @@ int igt_kselftest_begin(struct igt_kselftest *tst);
 
 void igt_kselftest_get_tests(struct kmod_module *kmod,
 			     const char *filter,
-			     struct igt_list *tests);
+			     struct igt_list_head *tests);
 int igt_kselftest_execute(struct igt_kselftest *tst,
 			  struct igt_kselftest_list *tl,
 			  const char *module_options,
diff --git a/lib/igt_list.c b/lib/igt_list.c
new file mode 100644
index 00000000..5e45161b
--- /dev/null
+++ b/lib/igt_list.c
@@ -0,0 +1,66 @@
+/*
+ * Copyright © 2019 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.
+ *
+ */
+
+#include "igt_list.h"
+
+void IGT_INIT_LIST_HEAD(struct igt_list_head *list)
+{
+	list->prev = list;
+	list->next = list;
+}
+
+void igt_list_add(struct igt_list_head *elem, struct igt_list_head *head)
+{
+	elem->prev = head;
+	elem->next = head->next;
+	head->next = elem;
+	elem->next->prev = elem;
+}
+
+
+void igt_list_del(struct igt_list_head *elem)
+{
+	elem->prev->next = elem->next;
+	elem->next->prev = elem->prev;
+	elem->next = NULL;
+	elem->prev = NULL;
+}
+
+int igt_list_length(const struct igt_list_head *head)
+{
+	struct  igt_list_head *e = head->next;
+	int count = 0;
+
+	while (e != head) {
+		e = e->next;
+		count++;
+	}
+
+	return count;
+}
+
+bool igt_list_empty(const struct igt_list_head *head)
+{
+	return head->next == head;
+}
diff --git a/lib/igt_list.h b/lib/igt_list.h
index cadf9dd3..3e139b8a 100644
--- a/lib/igt_list.h
+++ b/lib/igt_list.h
@@ -28,102 +28,100 @@
 #include <stdbool.h>
 #include <stddef.h>
 
-/*
- * This list data structure is a verbatim copy from wayland-util.h from the
- * Wayland project; except that wl_ prefix has been removed.
+/**
+ * SECTION:igt_list
+ * @short_description: a list implementation inspired by the kernel
+ * @title: IGT List
+ * @include: igt_list.h
+ *
+ * This list data structure mimics the one we can find in the kernel. A few
+ * bonus helpers are provided.
+ *
+ * igt_list is a doubly-linked list where an instance of igt_list_head is a
+ * head sentinel and has to be initialized.
+ *
+ * Example usage:
+ *
+ * |[<!-- language="C" -->
+ * struct igt_list_head foo_head;
+ *
+ * struct element {
+ *         int foo;
+ *         struct igt_list_head link;
+ * };
+ *
+ * struct element e1, e2, e3;
+ *
+ * IGT_INIT_LIST_HEAD(&foo_head);
+ * igt_list_add(&e1.link, &foo_head);   // e1 is the first element
+ * igt_list_add(&e2.link, &foo_head);   // e2 is now the first element
+ * igt_list_add(&e3.link, &e2.link);    // insert e3 after e2
+ *
+ * printf("list length: %d\n", igt_list_length(&foo_head));
+ *
+ * struct element *iter;
+ * igt_list_for_each_entry(iter, &foo_head, link) {
+ * 	printf("  %d\n", iter->foo);
+ * }
+ * ]|
  */
 
-struct igt_list {
-	struct igt_list *prev;
-	struct igt_list *next;
+struct igt_list_head {
+	struct igt_list_head *prev;
+	struct igt_list_head *next;
 };
 
-#define __IGT_INIT_LIST(name) { &(name), &(name) }
-#define IGT_LIST(name) struct igt_list name = __IGT_INIT_LIST(name)
 
-static inline void igt_list_init(struct igt_list *list)
-{
-	list->prev = list;
-	list->next = list;
-}
+void IGT_INIT_LIST_HEAD(struct igt_list_head *head);
+void igt_list_add(struct igt_list_head *elem, struct igt_list_head *head);
+void igt_list_del(struct igt_list_head *elem);
+int igt_list_length(const struct igt_list_head *head);
+bool igt_list_empty(const struct igt_list_head *head);
 
-static inline void __igt_list_add(struct igt_list *list,
-				  struct igt_list *prev,
-				  struct igt_list *next)
-{
-	next->prev = list;
-	list->next = next;
-	list->prev = prev;
-	prev->next = list;
-}
+#define igt_container_of(ptr, sample, member)				\
+	(__typeof__(sample))((char *)(ptr) -				\
+				offsetof(__typeof__(*sample), member))
 
-static inline void igt_list_add(struct igt_list *elm, struct igt_list *list)
-{
-	__igt_list_add(elm, list, list->next);
-}
-
-static inline void igt_list_add_tail(struct igt_list *elm,
-				     struct igt_list *list)
-{
-	__igt_list_add(elm, list->prev, list);
-}
-
-static inline void __igt_list_del(struct igt_list *prev, struct igt_list *next)
-{
-	next->prev = prev;
-	prev->next = next;
-}
-
-static inline void igt_list_del(struct igt_list *elm)
-{
-	__igt_list_del(elm->prev, elm->next);
-}
-
-static inline void igt_list_move(struct igt_list *elm, struct igt_list *list)
-{
-	igt_list_del(elm);
-	igt_list_add(elm, list);
-}
-
-static inline void igt_list_move_tail(struct igt_list *elm,
-				      struct igt_list *list)
-{
-	igt_list_del(elm);
-	igt_list_add_tail(elm, list);
-}
+#define igt_list_for_each_entry(pos, head, member)			\
+	for (pos = igt_container_of((head)->next, pos, member);		\
+	     &pos->member != (head);					\
+	     pos = igt_container_of((pos)->member.next, pos, member))
+
+/**
+ * igt_list_for_each_safe
+ *
+ * Safe against removel of the *current* list element. To achive this it
+ * requires an extra helper variable `tmp` with the same type as `pos`.
+ */
+#define igt_list_for_each_entry_safe(pos, tmp, head, member)			\
+	for (pos = igt_container_of((head)->next, pos, member),		\
+	     tmp = igt_container_of((pos)->member.next, tmp, member); 	\
+	     &pos->member != (head);					\
+	     pos = tmp,							\
+	     tmp = igt_container_of((pos)->member.next, tmp, member))
 
-static inline bool igt_list_empty(const struct igt_list *list)
-{
-	return list->next == list;
-}
+#define igt_list_for_each_entry_reverse(pos, head, member)		\
+	for (pos = igt_container_of((head)->prev, pos, member);		\
+	     &pos->member != (head);					\
+	     pos = igt_container_of((pos)->member.prev, pos, member))
 
-#define container_of(ptr, sample, member)				\
-	(typeof(sample))((char *)(ptr) - offsetof(typeof(*sample), member))
 
-#define igt_list_first_entry(head, pos, member) \
-	container_of((head)->next, (pos), member)
-#define igt_list_last_entry(head, pos, member) \
-	container_of((head)->prev, (pos), member)
+/* IGT custom helpers */
 
-#define igt_list_next_entry(pos, member) \
-	container_of((pos)->member.next, (pos), member)
-#define igt_list_prev_entry(pos, member) \
-	container_of((pos)->member.prev, (pos), member)
+/**
+ * IGT_LIST_HEAD
+ *
+ * Instead of having to use `IGT_INIT_LIST_HEAD()` list can be defined using
+ * this helper, e.g. `static IGT_LIST_HEAD(list);`
+ */
+#define IGT_LIST_HEAD(name) struct igt_list_head name = { &(name), &(name) }
 
-#define igt_list_for_each(pos, head, member)				\
-	for (pos = igt_list_first_entry(head, pos, member);		\
-	     &pos->member != (head);					\
-	     pos = igt_list_next_entry(pos, member))
+#define igt_list_add_tail(elem, head) igt_list_add(elem, (head)->prev)
 
-#define igt_list_for_each_reverse(pos, head, member)			\
-	for (pos = igt_list_last_entry(head, pos, member);		\
-	     &pos->member != (head);					\
-	     pos = igt_list_prev_entry(pos, member))
+#define igt_list_first_entry(head, type, member) \
+	igt_container_of((head)->next, (type), member)
 
-#define igt_list_for_each_safe(pos, tmp, head, member)			\
-	for (pos = igt_list_first_entry(head, pos, member),		\
-	     tmp = igt_list_next_entry(pos, member);			\
-	     &pos->member != (head);					\
-	     pos = tmp, tmp = igt_list_next_entry(pos, member))
+#define igt_list_last_entry(head, type, member) \
+	igt_container_of((head)->prev, (type), member)
 
 #endif /* IGT_LIST_H */
diff --git a/lib/meson.build b/lib/meson.build
index fbc0c8d1..19cb6255 100644
--- a/lib/meson.build
+++ b/lib/meson.build
@@ -50,6 +50,7 @@ lib_sources = [
 	'igt_fb.c',
 	'igt_core.c',
 	'igt_draw.c',
+	'igt_list.c',
 	'igt_pm.c',
 	'igt_dummyload.c',
 	'uwildmat/uwildmat.c',
diff --git a/tests/vc4_purgeable_bo.c b/tests/vc4_purgeable_bo.c
index cfe14e70..ee89e153 100644
--- a/tests/vc4_purgeable_bo.c
+++ b/tests/vc4_purgeable_bo.c
@@ -36,7 +36,7 @@
 #include "vc4_drm.h"
 
 struct igt_vc4_bo {
-	struct igt_list node;
+	struct igt_list_head node;
 	int handle;
 	void *map;
 	size_t size;
@@ -49,7 +49,7 @@ static void __attribute__((noreturn)) sigtrap(int sig)
 	longjmp(jmp, sig);
 }
 
-static void igt_vc4_alloc_mmap_max_bo(int fd, struct igt_list *list,
+static void igt_vc4_alloc_mmap_max_bo(int fd, struct igt_list_head *list,
 				      size_t size)
 {
 	struct igt_vc4_bo *bo;
@@ -71,7 +71,7 @@ static void igt_vc4_alloc_mmap_max_bo(int fd, struct igt_list *list,
 	}
 }
 
-static void igt_vc4_unmap_free_bo_pool(int fd, struct igt_list *list)
+static void igt_vc4_unmap_free_bo_pool(int fd, struct igt_list_head *list)
 {
 	struct igt_vc4_bo *bo;
 
@@ -87,9 +87,9 @@ static void igt_vc4_unmap_free_bo_pool(int fd, struct igt_list *list)
 
 static void igt_vc4_trigger_purge(int fd)
 {
-	struct igt_list list;
+	struct igt_list_head list;
 
-	igt_list_init(&list);
+	IGT_INIT_LIST_HEAD(&list);
 
 	/* Try to allocate as much as we can to trigger a purge. */
 	igt_vc4_alloc_mmap_max_bo(fd, &list, 64 * 1024);
@@ -97,7 +97,7 @@ static void igt_vc4_trigger_purge(int fd)
 	igt_vc4_unmap_free_bo_pool(fd, &list);
 }
 
-static void igt_vc4_purgeable_subtest_prepare(int fd, struct igt_list *list)
+static void igt_vc4_purgeable_subtest_prepare(int fd, struct igt_list_head *list)
 {
 	igt_vc4_unmap_free_bo_pool(fd, list);
 	igt_vc4_alloc_mmap_max_bo(fd, list, 64 * 1024);
@@ -107,7 +107,7 @@ static void igt_vc4_purgeable_subtest_prepare(int fd, struct igt_list *list)
 igt_main
 {
 	struct igt_vc4_bo *bo;
-	struct igt_list list;
+	struct igt_list_head list;
 	uint32_t *map;
 	int fd, ret;
 
@@ -117,22 +117,22 @@ igt_main
 		fd = drm_open_driver(DRIVER_VC4);
 		igt_vc4_get_param(fd, DRM_VC4_PARAM_SUPPORTS_MADVISE, &val);
 		igt_require(val);
-		igt_list_init(&list);
+		IGT_INIT_LIST_HEAD(&list);
 	}
 
 	igt_subtest("mark-willneed") {
 		igt_vc4_purgeable_subtest_prepare(fd, &list);
-		igt_list_for_each(bo, &list, node)
+		igt_list_for_each_entry(bo, &list, node)
 			igt_assert(igt_vc4_purgeable_bo(fd, bo->handle,
 							false));
 	}
 
 	igt_subtest("mark-purgeable") {
 		igt_vc4_purgeable_subtest_prepare(fd, &list);
-		igt_list_for_each(bo, &list, node)
+		igt_list_for_each_entry(bo, &list, node)
 			igt_vc4_purgeable_bo(fd, bo->handle, true);
 
-		igt_list_for_each(bo, &list, node)
+		igt_list_for_each_entry(bo, &list, node)
 			igt_vc4_purgeable_bo(fd, bo->handle, false);
 	}
 
@@ -205,13 +205,13 @@ igt_main
 
 	igt_subtest("mark-unpurgeable-check-retained") {
 		igt_vc4_purgeable_subtest_prepare(fd, &list);
-		igt_list_for_each(bo, &list, node) {
+		igt_list_for_each_entry(bo, &list, node) {
 			map = (uint32_t *)bo->map;
 			*map = 0xdeadbeef;
 			igt_vc4_purgeable_bo(fd, bo->handle, true);
 		}
 
-		igt_list_for_each(bo, &list, node) {
+		igt_list_for_each_entry(bo, &list, node) {
 			map = (uint32_t *)bo->map;
 			if (igt_vc4_purgeable_bo(fd, bo->handle, false))
 				igt_assert(*map == 0xdeadbeef);
@@ -221,7 +221,7 @@ igt_main
 	igt_subtest("mark-unpurgeable-purged") {
 		igt_vc4_purgeable_subtest_prepare(fd, &list);
 
-		igt_list_for_each(bo, &list, node)
+		igt_list_for_each_entry(bo, &list, node)
 			igt_vc4_purgeable_bo(fd, bo->handle, true);
 
 		/* Trigger a purge. */
-- 
2.21.0

_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev

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

* [igt-dev] ✓ Fi.CI.BAT: success for lib/igt_list: Update, clean-up and document igt_list (rev2)
  2019-10-24 12:31 [igt-dev] [PATCH i-g-t] lib/igt_list: Update, clean-up and document igt_list Arkadiusz Hiler
@ 2019-10-24 14:47 ` Patchwork
  2019-10-25  8:27 ` [igt-dev] [PATCH i-g-t] lib/igt_list: Update, clean-up and document igt_list Chris Wilson
                   ` (5 subsequent siblings)
  6 siblings, 0 replies; 9+ messages in thread
From: Patchwork @ 2019-10-24 14:47 UTC (permalink / raw)
  To: Arkadiusz Hiler; +Cc: igt-dev

== Series Details ==

Series: lib/igt_list: Update, clean-up and document igt_list (rev2)
URL   : https://patchwork.freedesktop.org/series/66806/
State : success

== Summary ==

CI Bug Log - changes from CI_DRM_7172 -> IGTPW_3606
====================================================

Summary
-------

  **SUCCESS**

  No regressions found.

  External URL: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3606/index.html

Known issues
------------

  Here are the changes found in IGTPW_3606 that come from known issues:

### IGT changes ###

#### Issues hit ####

  * igt@gem_basic@create-close:
    - fi-icl-u3:          [PASS][1] -> [DMESG-WARN][2] ([fdo#107724]) +1 similar issue
   [1]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7172/fi-icl-u3/igt@gem_basic@create-close.html
   [2]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3606/fi-icl-u3/igt@gem_basic@create-close.html

  * igt@gem_flink_basic@basic:
    - fi-icl-u3:          [PASS][3] -> [DMESG-WARN][4] ([fdo#107724] / [fdo#112052 ])
   [3]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7172/fi-icl-u3/igt@gem_flink_basic@basic.html
   [4]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3606/fi-icl-u3/igt@gem_flink_basic@basic.html

  * igt@i915_pm_rpm@module-reload:
    - fi-skl-6770hq:      [PASS][5] -> [FAIL][6] ([fdo#108511])
   [5]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7172/fi-skl-6770hq/igt@i915_pm_rpm@module-reload.html
   [6]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3606/fi-skl-6770hq/igt@i915_pm_rpm@module-reload.html

  
#### Possible fixes ####

  * igt@gem_exec_reloc@basic-write-read:
    - fi-icl-u3:          [DMESG-WARN][7] ([fdo#107724]) -> [PASS][8] +3 similar issues
   [7]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7172/fi-icl-u3/igt@gem_exec_reloc@basic-write-read.html
   [8]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3606/fi-icl-u3/igt@gem_exec_reloc@basic-write-read.html

  * igt@i915_selftest@live_hangcheck:
    - {fi-icl-u4}:        [INCOMPLETE][9] ([fdo#107713] / [fdo#108569]) -> [PASS][10]
   [9]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7172/fi-icl-u4/igt@i915_selftest@live_hangcheck.html
   [10]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3606/fi-icl-u4/igt@i915_selftest@live_hangcheck.html

  
  {name}: This element is suppressed. This means it is ignored when computing
          the status of the difference (SUCCESS, WARNING, or FAILURE).

  [fdo#107713]: https://bugs.freedesktop.org/show_bug.cgi?id=107713
  [fdo#107724]: https://bugs.freedesktop.org/show_bug.cgi?id=107724
  [fdo#108511]: https://bugs.freedesktop.org/show_bug.cgi?id=108511
  [fdo#108569]: https://bugs.freedesktop.org/show_bug.cgi?id=108569
  [fdo#111736]: https://bugs.freedesktop.org/show_bug.cgi?id=111736
  [fdo#112052 ]: https://bugs.freedesktop.org/show_bug.cgi?id=112052 
  [fdo#112096]: https://bugs.freedesktop.org/show_bug.cgi?id=112096


Participating hosts (52 -> 42)
------------------------------

  Missing    (10): fi-ilk-m540 fi-bsw-n3050 fi-byt-j1900 fi-hsw-4200u fi-byt-squawks fi-bsw-cyan fi-pnv-d510 fi-icl-y fi-byt-clapper fi-bdw-samus 


Build changes
-------------

  * CI: CI-20190529 -> None
  * IGT: IGT_5237 -> IGTPW_3606

  CI-20190529: 20190529
  CI_DRM_7172: c6e7ee3e8a2d06a8934ad5298208e3867994e6e8 @ git://anongit.freedesktop.org/gfx-ci/linux
  IGTPW_3606: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3606/index.html
  IGT_5237: 9a46404de7c42c8cc2d492176e956597ef28d7c4 @ git://anongit.freedesktop.org/xorg/app/intel-gpu-tools

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3606/index.html
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev

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

* Re: [igt-dev] [PATCH i-g-t] lib/igt_list: Update, clean-up and document igt_list
  2019-10-24 12:31 [igt-dev] [PATCH i-g-t] lib/igt_list: Update, clean-up and document igt_list Arkadiusz Hiler
  2019-10-24 14:47 ` [igt-dev] ✓ Fi.CI.BAT: success for lib/igt_list: Update, clean-up and document igt_list (rev2) Patchwork
@ 2019-10-25  8:27 ` Chris Wilson
  2019-10-25 11:22 ` Petri Latvala
                   ` (4 subsequent siblings)
  6 siblings, 0 replies; 9+ messages in thread
From: Chris Wilson @ 2019-10-25  8:27 UTC (permalink / raw)
  To: Arkadiusz Hiler, igt-dev; +Cc: Petri Latvala

Quoting Arkadiusz Hiler (2019-10-24 13:31:14)
> Our list was something between Wayland and Linux Kernel list
> implementations, right in the uncanny valley.
> 
> On top of that it falsely claimed that it's a straight copy from the
> Wayland project.
> 
> Let's make our impl more akin to the kernel one to ease the cognitive
> dissonance for the developers working on all those projects.
> 
> This patch:
>  * mimics the current kernel list interface
>  * separates IGT helpers in the source files
>  * adds brief explanation and code example for igt-doc
>  * introduces igt_list.c as static inlines are not visible in the docs
> 
> v2: mimic the kernel instead of wayland (Chris)
>     - _head suffix for the sentinel/link struct
>     - _entry_ in iterator names that go over the elements

We didn't list the _head suffix as the list is both its head and
node. :)

The other option was to go with mesa's with automatic variables
(different container_of implementation).

> Cc: Petri Latvala <petri.latvala@intel.com>
> Cc: Chris Wilson <chris@chris-wilson.co.uk>
> Signed-off-by: Arkadiusz Hiler <arkadiusz.hiler@intel.com>

I'd get a second opinion, but since you feel strongly enough to write
the patch...

Acked-by: Chris Wilson <chris@chris-wilson.co.uk>
-Chris
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev

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

* Re: [igt-dev] [PATCH i-g-t] lib/igt_list: Update, clean-up and document igt_list
  2019-10-24 12:31 [igt-dev] [PATCH i-g-t] lib/igt_list: Update, clean-up and document igt_list Arkadiusz Hiler
  2019-10-24 14:47 ` [igt-dev] ✓ Fi.CI.BAT: success for lib/igt_list: Update, clean-up and document igt_list (rev2) Patchwork
  2019-10-25  8:27 ` [igt-dev] [PATCH i-g-t] lib/igt_list: Update, clean-up and document igt_list Chris Wilson
@ 2019-10-25 11:22 ` Petri Latvala
  2019-10-25 20:10 ` [igt-dev] ✗ Fi.CI.IGT: failure for lib/igt_list: Update, clean-up and document igt_list (rev2) Patchwork
                   ` (3 subsequent siblings)
  6 siblings, 0 replies; 9+ messages in thread
From: Petri Latvala @ 2019-10-25 11:22 UTC (permalink / raw)
  To: Arkadiusz Hiler; +Cc: igt-dev

On Thu, Oct 24, 2019 at 03:31:14PM +0300, Arkadiusz Hiler wrote:
> Our list was something between Wayland and Linux Kernel list
> implementations, right in the uncanny valley.
> 
> On top of that it falsely claimed that it's a straight copy from the
> Wayland project.
> 
> Let's make our impl more akin to the kernel one to ease the cognitive
> dissonance for the developers working on all those projects.
> 
> This patch:
>  * mimics the current kernel list interface
>  * separates IGT helpers in the source files
>  * adds brief explanation and code example for igt-doc
>  * introduces igt_list.c as static inlines are not visible in the docs
> 
> v2: mimic the kernel instead of wayland (Chris)
>     - _head suffix for the sentinel/link struct
>     - _entry_ in iterator names that go over the elements
> 
> Cc: Petri Latvala <petri.latvala@intel.com>
> Cc: Chris Wilson <chris@chris-wilson.co.uk>
> Signed-off-by: Arkadiusz Hiler <arkadiusz.hiler@intel.com>
> ---
>  benchmarks/gem_wsim.c                         |   6 +-
>  .../igt-gpu-tools/igt-gpu-tools-docs.xml      |   1 +
>  lib/Makefile.sources                          |   2 +
>  lib/igt_chamelium.c                           |   8 +-
>  lib/igt_core.c                                |   8 +-
>  lib/igt_dummyload.c                           |  10 +-
>  lib/igt_dummyload.h                           |   2 +-
>  lib/igt_kmod.c                                |  10 +-
>  lib/igt_kmod.h                                |   4 +-
>  lib/igt_list.c                                |  66 +++++++
>  lib/igt_list.h                                | 164 +++++++++---------
>  lib/meson.build                               |   1 +
>  tests/vc4_purgeable_bo.c                      |  28 +--
>  13 files changed, 189 insertions(+), 121 deletions(-)
>  create mode 100644 lib/igt_list.c
> 
> diff --git a/benchmarks/gem_wsim.c b/benchmarks/gem_wsim.c
> index 87f873b0..d3c88615 100644
> --- a/benchmarks/gem_wsim.c
> +++ b/benchmarks/gem_wsim.c
> @@ -142,7 +142,7 @@ struct w_step
>  
>  	/* Implementation details */
>  	unsigned int idx;
> -	struct igt_list rq_link;
> +	struct igt_list_head rq_link;
>  	unsigned int request;
>  	unsigned int preempt_us;
>  
> @@ -213,7 +213,7 @@ struct workload
>  	unsigned long qd_sum[NUM_ENGINES];
>  	unsigned long nr_bb[NUM_ENGINES];
>  
> -	struct igt_list requests[NUM_ENGINES];
> +	struct igt_list_head requests[NUM_ENGINES];
>  	unsigned int nrequest[NUM_ENGINES];
>  
>  	struct workload *global_wrk;
> @@ -1061,7 +1061,7 @@ clone_workload(struct workload *_wrk)
>  	}
>  
>  	for (i = 0; i < NUM_ENGINES; i++)
> -		igt_list_init(&wrk->requests[i]);
> +		IGT_INIT_LIST_HEAD(&wrk->requests[i]);
>  
>  	return wrk;
>  }
> diff --git a/docs/reference/igt-gpu-tools/igt-gpu-tools-docs.xml b/docs/reference/igt-gpu-tools/igt-gpu-tools-docs.xml
> index ac83272f..3f14d7be 100644
> --- a/docs/reference/igt-gpu-tools/igt-gpu-tools-docs.xml
> +++ b/docs/reference/igt-gpu-tools/igt-gpu-tools-docs.xml
> @@ -31,6 +31,7 @@
>      <xi:include href="xml/igt_gvt.xml"/>
>      <xi:include href="xml/igt_kmod.xml"/>
>      <xi:include href="xml/igt_kms.xml"/>
> +    <xi:include href="xml/igt_list.xml"/>
>      <xi:include href="xml/igt_pm.xml"/>
>      <xi:include href="xml/igt_primes.xml"/>
>      <xi:include href="xml/igt_rand.xml"/>
> diff --git a/lib/Makefile.sources b/lib/Makefile.sources
> index 34e0c012..1b58b6d0 100644
> --- a/lib/Makefile.sources
> +++ b/lib/Makefile.sources
> @@ -41,6 +41,8 @@ lib_source_list =	 	\
>  	igt_halffloat.h		\
>  	igt_infoframe.c		\
>  	igt_infoframe.h		\
> +	igt_list.c		\
> +	igt_list.h		\
>  	igt_matrix.c		\
>  	igt_matrix.h		\
>  	igt_primes.c		\
> diff --git a/lib/igt_chamelium.c b/lib/igt_chamelium.c
> index 1b03a103..9971f51d 100644
> --- a/lib/igt_chamelium.c
> +++ b/lib/igt_chamelium.c
> @@ -87,7 +87,7 @@ struct chamelium_edid {
>  	struct edid *base;
>  	struct edid *raw[CHAMELIUM_MAX_PORTS];
>  	int ids[CHAMELIUM_MAX_PORTS];
> -	struct igt_list link;
> +	struct igt_list_head link;
>  };
>  
>  struct chamelium_port {
> @@ -122,7 +122,7 @@ struct chamelium {
>  
>  	int drm_fd;
>  
> -	struct igt_list edids;
> +	struct igt_list_head edids;
>  	struct chamelium_port ports[CHAMELIUM_MAX_PORTS];
>  	int port_count;
>  };
> @@ -2336,7 +2336,7 @@ struct chamelium *chamelium_init(int drm_fd)
>  
>  	memset(chamelium, 0, sizeof(*chamelium));
>  	chamelium->drm_fd = drm_fd;
> -	igt_list_init(&chamelium->edids);
> +	IGT_INIT_LIST_HEAD(&chamelium->edids);
>  
>  	/* Setup the libxmlrpc context */
>  	xmlrpc_env_init(&chamelium->env);
> @@ -2388,7 +2388,7 @@ void chamelium_deinit(struct chamelium *chamelium)
>  		chamelium_plug(chamelium, &chamelium->ports[i]);
>  
>  	/* Destroy any EDIDs we created to make sure we don't leak them */
> -	igt_list_for_each_safe(pos, tmp, &chamelium->edids, link) {
> +	igt_list_for_each_entry_safe(pos, tmp, &chamelium->edids, link) {
>  		for (i = 0; i < CHAMELIUM_MAX_PORTS; i++) {
>  			if (pos->ids[i])
>  				chamelium_destroy_edid(chamelium, pos->ids[i]);
> diff --git a/lib/igt_core.c b/lib/igt_core.c
> index 7bd5afa5..86ce8af9 100644
> --- a/lib/igt_core.c
> +++ b/lib/igt_core.c
> @@ -278,10 +278,10 @@ static char __current_description[512];
>  
>  struct description_node {
>  	char desc[sizeof(__current_description)];
> -	struct igt_list link;
> +	struct igt_list_head link;
>  };
>  
> -static struct igt_list subgroup_descriptions;
> +static struct igt_list_head subgroup_descriptions;
>  
>  
>  bool __igt_plain_output = false;
> @@ -797,7 +797,7 @@ static int common_init(int *argc, char **argv,
>  	int ret = 0;
>  
>  	common_init_env();
> -	igt_list_init(&subgroup_descriptions);
> +	IGT_INIT_LIST_HEAD(&subgroup_descriptions);
>  
>  	command_str = argv[0];
>  	if (strrchr(command_str, '/'))
> @@ -1068,7 +1068,7 @@ static void __igt_print_description(const char *subtest_name, const char *file,
>  
>  	printf("SUB %s %s:%d:\n", subtest_name, file, line);
>  
> -	igt_list_for_each(desc, &subgroup_descriptions, link) {
> +	igt_list_for_each_entry(desc, &subgroup_descriptions, link) {
>  		print_line_wrapping(indent, desc->desc);
>  		printf("\n");
>  		has_doc = true;
> diff --git a/lib/igt_dummyload.c b/lib/igt_dummyload.c
> index 6060878d..b9e239db 100644
> --- a/lib/igt_dummyload.c
> +++ b/lib/igt_dummyload.c
> @@ -65,7 +65,7 @@
>  static const int BATCH_SIZE = 4096;
>  static const int LOOP_START_OFFSET = 64;
>  
> -static IGT_LIST(spin_list);
> +static IGT_LIST_HEAD(spin_list);
>  static pthread_mutex_t list_lock = PTHREAD_MUTEX_INITIALIZER;
>  
>  static int
> @@ -464,7 +464,7 @@ void igt_terminate_spins(void)
>  	struct igt_spin *iter;
>  
>  	pthread_mutex_lock(&list_lock);
> -	igt_list_for_each(iter, &spin_list, link)
> +	igt_list_for_each_entry(iter, &spin_list, link)
>  		igt_spin_end(iter);
>  	pthread_mutex_unlock(&list_lock);
>  }
> @@ -474,9 +474,9 @@ void igt_unshare_spins(void)
>  	struct igt_spin *it, *n;
>  
>  	/* Disable the automatic termination on inherited spinners */
> -	igt_list_for_each_safe(it, n, &spin_list, link)
> -		igt_list_init(&it->link);
> -	igt_list_init(&spin_list);
> +	igt_list_for_each_entry_safe(it, n, &spin_list, link)
> +		IGT_INIT_LIST_HEAD(&it->link);
> +	IGT_INIT_LIST_HEAD(&spin_list);
>  }
>  
>  static uint32_t plug_vgem_handle(struct igt_cork *cork, int fd)
> diff --git a/lib/igt_dummyload.h b/lib/igt_dummyload.h
> index 66837057..421ca183 100644
> --- a/lib/igt_dummyload.h
> +++ b/lib/igt_dummyload.h
> @@ -35,7 +35,7 @@
>  typedef struct igt_spin {
>  	unsigned int handle;
>  	timer_t timer;
> -	struct igt_list link;
> +	struct igt_list_head link;
>  
>  	uint32_t *condition;
>  	uint32_t cmd_precondition;
> diff --git a/lib/igt_kmod.c b/lib/igt_kmod.c
> index c3da4667..f756f80e 100644
> --- a/lib/igt_kmod.c
> +++ b/lib/igt_kmod.c
> @@ -412,11 +412,11 @@ static void kmsg_dump(int fd)
>  	}
>  }
>  
> -static void tests_add(struct igt_kselftest_list *tl, struct igt_list *list)
> +static void tests_add(struct igt_kselftest_list *tl, struct igt_list_head *list)
>  {
>  	struct igt_kselftest_list *pos;
>  
> -	igt_list_for_each(pos, list, link)
> +	igt_list_for_each_entry(pos, list, link)
>  		if (pos->number > tl->number)
>  			break;
>  
> @@ -425,7 +425,7 @@ static void tests_add(struct igt_kselftest_list *tl, struct igt_list *list)
>  
>  void igt_kselftest_get_tests(struct kmod_module *kmod,
>  			     const char *filter,
> -			     struct igt_list *tests)
> +			     struct igt_list_head *tests)
>  {
>  	const char *param_prefix = "igt__";
>  	const int prefix_len = strlen(param_prefix);
> @@ -568,7 +568,7 @@ void igt_kselftests(const char *module_name,
>  		    const char *filter)
>  {
>  	struct igt_kselftest tst;
> -	IGT_LIST(tests);
> +	IGT_LIST_HEAD(tests);
>  	struct igt_kselftest_list *tl, *tn;
>  
>  	if (igt_kselftest_init(&tst, module_name) != 0)
> @@ -578,7 +578,7 @@ void igt_kselftests(const char *module_name,
>  		igt_require(igt_kselftest_begin(&tst) == 0);
>  
>  	igt_kselftest_get_tests(tst.kmod, filter, &tests);
> -	igt_list_for_each_safe(tl, tn, &tests, link) {
> +	igt_list_for_each_entry_safe(tl, tn, &tests, link) {
>  		igt_subtest_f("%s", tl->name)
>  			igt_kselftest_execute(&tst, tl, options, result);
>  		free(tl);
> diff --git a/lib/igt_kmod.h b/lib/igt_kmod.h
> index 87d36d40..b15cde46 100644
> --- a/lib/igt_kmod.h
> +++ b/lib/igt_kmod.h
> @@ -49,7 +49,7 @@ struct igt_kselftest {
>  };
>  
>  struct igt_kselftest_list {
> -	struct igt_list link;
> +	struct igt_list_head link;
>  	unsigned int number;
>  	char *name;
>  	char param[];
> @@ -61,7 +61,7 @@ int igt_kselftest_begin(struct igt_kselftest *tst);
>  
>  void igt_kselftest_get_tests(struct kmod_module *kmod,
>  			     const char *filter,
> -			     struct igt_list *tests);
> +			     struct igt_list_head *tests);
>  int igt_kselftest_execute(struct igt_kselftest *tst,
>  			  struct igt_kselftest_list *tl,
>  			  const char *module_options,
> diff --git a/lib/igt_list.c b/lib/igt_list.c
> new file mode 100644
> index 00000000..5e45161b
> --- /dev/null
> +++ b/lib/igt_list.c
> @@ -0,0 +1,66 @@
> +/*
> + * Copyright © 2019 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.
> + *
> + */
> +
> +#include "igt_list.h"
> +
> +void IGT_INIT_LIST_HEAD(struct igt_list_head *list)
> +{
> +	list->prev = list;
> +	list->next = list;
> +}
> +
> +void igt_list_add(struct igt_list_head *elem, struct igt_list_head *head)
> +{
> +	elem->prev = head;
> +	elem->next = head->next;
> +	head->next = elem;
> +	elem->next->prev = elem;
> +}
> +
> +
> +void igt_list_del(struct igt_list_head *elem)
> +{
> +	elem->prev->next = elem->next;
> +	elem->next->prev = elem->prev;
> +	elem->next = NULL;
> +	elem->prev = NULL;
> +}
> +
> +int igt_list_length(const struct igt_list_head *head)
> +{
> +	struct  igt_list_head *e = head->next;
> +	int count = 0;
> +
> +	while (e != head) {
> +		e = e->next;
> +		count++;
> +	}
> +
> +	return count;
> +}
> +
> +bool igt_list_empty(const struct igt_list_head *head)
> +{
> +	return head->next == head;
> +}
> diff --git a/lib/igt_list.h b/lib/igt_list.h
> index cadf9dd3..3e139b8a 100644
> --- a/lib/igt_list.h
> +++ b/lib/igt_list.h
> @@ -28,102 +28,100 @@
>  #include <stdbool.h>
>  #include <stddef.h>
>  
> -/*
> - * This list data structure is a verbatim copy from wayland-util.h from the
> - * Wayland project; except that wl_ prefix has been removed.
> +/**
> + * SECTION:igt_list
> + * @short_description: a list implementation inspired by the kernel
> + * @title: IGT List
> + * @include: igt_list.h
> + *
> + * This list data structure mimics the one we can find in the kernel. A few
> + * bonus helpers are provided.
> + *
> + * igt_list is a doubly-linked list where an instance of igt_list_head is a
> + * head sentinel and has to be initialized.
> + *
> + * Example usage:
> + *
> + * |[<!-- language="C" -->
> + * struct igt_list_head foo_head;
> + *
> + * struct element {
> + *         int foo;
> + *         struct igt_list_head link;
> + * };
> + *
> + * struct element e1, e2, e3;
> + *
> + * IGT_INIT_LIST_HEAD(&foo_head);
> + * igt_list_add(&e1.link, &foo_head);   // e1 is the first element
> + * igt_list_add(&e2.link, &foo_head);   // e2 is now the first element
> + * igt_list_add(&e3.link, &e2.link);    // insert e3 after e2
> + *
> + * printf("list length: %d\n", igt_list_length(&foo_head));
> + *
> + * struct element *iter;
> + * igt_list_for_each_entry(iter, &foo_head, link) {
> + * 	printf("  %d\n", iter->foo);
> + * }
> + * ]|
>   */
>  
> -struct igt_list {
> -	struct igt_list *prev;
> -	struct igt_list *next;
> +struct igt_list_head {
> +	struct igt_list_head *prev;
> +	struct igt_list_head *next;
>  };
>  
> -#define __IGT_INIT_LIST(name) { &(name), &(name) }
> -#define IGT_LIST(name) struct igt_list name = __IGT_INIT_LIST(name)
>  
> -static inline void igt_list_init(struct igt_list *list)
> -{
> -	list->prev = list;
> -	list->next = list;
> -}
> +void IGT_INIT_LIST_HEAD(struct igt_list_head *head);
> +void igt_list_add(struct igt_list_head *elem, struct igt_list_head *head);
> +void igt_list_del(struct igt_list_head *elem);
> +int igt_list_length(const struct igt_list_head *head);
> +bool igt_list_empty(const struct igt_list_head *head);
>  
> -static inline void __igt_list_add(struct igt_list *list,
> -				  struct igt_list *prev,
> -				  struct igt_list *next)
> -{
> -	next->prev = list;
> -	list->next = next;
> -	list->prev = prev;
> -	prev->next = list;
> -}
> +#define igt_container_of(ptr, sample, member)				\
> +	(__typeof__(sample))((char *)(ptr) -				\
> +				offsetof(__typeof__(*sample), member))
>  
> -static inline void igt_list_add(struct igt_list *elm, struct igt_list *list)
> -{
> -	__igt_list_add(elm, list, list->next);
> -}
> -
> -static inline void igt_list_add_tail(struct igt_list *elm,
> -				     struct igt_list *list)
> -{
> -	__igt_list_add(elm, list->prev, list);
> -}
> -
> -static inline void __igt_list_del(struct igt_list *prev, struct igt_list *next)
> -{
> -	next->prev = prev;
> -	prev->next = next;
> -}
> -
> -static inline void igt_list_del(struct igt_list *elm)
> -{
> -	__igt_list_del(elm->prev, elm->next);
> -}
> -
> -static inline void igt_list_move(struct igt_list *elm, struct igt_list *list)
> -{
> -	igt_list_del(elm);
> -	igt_list_add(elm, list);
> -}
> -
> -static inline void igt_list_move_tail(struct igt_list *elm,
> -				      struct igt_list *list)
> -{
> -	igt_list_del(elm);
> -	igt_list_add_tail(elm, list);
> -}
> +#define igt_list_for_each_entry(pos, head, member)			\
> +	for (pos = igt_container_of((head)->next, pos, member);		\
> +	     &pos->member != (head);					\
> +	     pos = igt_container_of((pos)->member.next, pos, member))
> +
> +/**
> + * igt_list_for_each_safe
> + *
> + * Safe against removel of the *current* list element. To achive this it

removal
     ^


> + * requires an extra helper variable `tmp` with the same type as `pos`.
> + */
> +#define igt_list_for_each_entry_safe(pos, tmp, head, member)			\
> +	for (pos = igt_container_of((head)->next, pos, member),		\

That one \ is trying to escape.



Otherwise LGTM. Straightforward code changes, and I don't have strong
feelings as to which list implementation to chase, but definitely we
should choose and not lie what it is.


Reviewed-by: Petri Latvala <petri.latvala@intel.com>
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev

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

* [igt-dev] ✗ Fi.CI.IGT: failure for lib/igt_list: Update, clean-up and document igt_list (rev2)
  2019-10-24 12:31 [igt-dev] [PATCH i-g-t] lib/igt_list: Update, clean-up and document igt_list Arkadiusz Hiler
                   ` (2 preceding siblings ...)
  2019-10-25 11:22 ` Petri Latvala
@ 2019-10-25 20:10 ` Patchwork
  2019-10-28  9:12 ` [igt-dev] ✗ Fi.CI.BAT: failure for lib/igt_list: Update, clean-up and document igt_list (rev3) Patchwork
                   ` (2 subsequent siblings)
  6 siblings, 0 replies; 9+ messages in thread
From: Patchwork @ 2019-10-25 20:10 UTC (permalink / raw)
  To: Arkadiusz Hiler; +Cc: igt-dev

== Series Details ==

Series: lib/igt_list: Update, clean-up and document igt_list (rev2)
URL   : https://patchwork.freedesktop.org/series/66806/
State : failure

== Summary ==

CI Bug Log - changes from CI_DRM_7172_full -> IGTPW_3606_full
====================================================

Summary
-------

  **FAILURE**

  Serious unknown changes coming with IGTPW_3606_full absolutely need to be
  verified manually.
  
  If you think the reported changes have nothing to do with the changes
  introduced in IGTPW_3606_full, please notify your bug team to allow them
  to document this new failure mode, which will reduce false positives in CI.

  External URL: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3606/index.html

Possible new issues
-------------------

  Here are the unknown changes that may have been introduced in IGTPW_3606_full:

### IGT changes ###

#### Possible regressions ####

  * igt@gem_exec_schedule@preempt-contexts-render:
    - shard-apl:          [PASS][1] -> [FAIL][2] +1 similar issue
   [1]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7172/shard-apl7/igt@gem_exec_schedule@preempt-contexts-render.html
   [2]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3606/shard-apl1/igt@gem_exec_schedule@preempt-contexts-render.html
    - shard-glk:          [PASS][3] -> [FAIL][4] +1 similar issue
   [3]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7172/shard-glk6/igt@gem_exec_schedule@preempt-contexts-render.html
   [4]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3606/shard-glk9/igt@gem_exec_schedule@preempt-contexts-render.html

  
#### Suppressed ####

  The following results come from untrusted machines, tests, or statuses.
  They do not affect the overall result.

  * igt@kms_plane_lowres@pipe-a-tiling-x:
    - {shard-tglb}:       [PASS][5] -> [INCOMPLETE][6]
   [5]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7172/shard-tglb7/igt@kms_plane_lowres@pipe-a-tiling-x.html
   [6]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3606/shard-tglb1/igt@kms_plane_lowres@pipe-a-tiling-x.html

  
Known issues
------------

  Here are the changes found in IGTPW_3606_full that come from known issues:

### IGT changes ###

#### Issues hit ####

  * igt@gem_ctx_isolation@rcs0-s3:
    - shard-kbl:          [PASS][7] -> [DMESG-WARN][8] ([fdo#108566]) +6 similar issues
   [7]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7172/shard-kbl3/igt@gem_ctx_isolation@rcs0-s3.html
   [8]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3606/shard-kbl1/igt@gem_ctx_isolation@rcs0-s3.html

  * igt@gem_exec_async@concurrent-writes-bsd:
    - shard-iclb:         [PASS][9] -> [SKIP][10] ([fdo#111325]) +2 similar issues
   [9]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7172/shard-iclb3/igt@gem_exec_async@concurrent-writes-bsd.html
   [10]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3606/shard-iclb4/igt@gem_exec_async@concurrent-writes-bsd.html

  * igt@gem_exec_schedule@deep-render:
    - shard-glk:          [PASS][11] -> [INCOMPLETE][12] ([fdo#103359] / [k.org#198133])
   [11]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7172/shard-glk6/igt@gem_exec_schedule@deep-render.html
   [12]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3606/shard-glk9/igt@gem_exec_schedule@deep-render.html

  * igt@gem_exec_schedule@preempt-hang-render:
    - shard-apl:          [PASS][13] -> [SKIP][14] ([fdo#109271]) +10 similar issues
   [13]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7172/shard-apl8/igt@gem_exec_schedule@preempt-hang-render.html
   [14]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3606/shard-apl1/igt@gem_exec_schedule@preempt-hang-render.html

  * igt@gem_exec_schedule@preempt-queue-bsd1:
    - shard-iclb:         [PASS][15] -> [SKIP][16] ([fdo#109276]) +13 similar issues
   [15]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7172/shard-iclb2/igt@gem_exec_schedule@preempt-queue-bsd1.html
   [16]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3606/shard-iclb8/igt@gem_exec_schedule@preempt-queue-bsd1.html

  * igt@gem_exec_schedule@preempt-queue-chain-bsd2:
    - shard-iclb:         [PASS][17] -> [INCOMPLETE][18] ([fdo#107713])
   [17]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7172/shard-iclb4/igt@gem_exec_schedule@preempt-queue-chain-bsd2.html
   [18]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3606/shard-iclb4/igt@gem_exec_schedule@preempt-queue-chain-bsd2.html
    - shard-kbl:          [PASS][19] -> [INCOMPLETE][20] ([fdo#103665])
   [19]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7172/shard-kbl2/igt@gem_exec_schedule@preempt-queue-chain-bsd2.html
   [20]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3606/shard-kbl2/igt@gem_exec_schedule@preempt-queue-chain-bsd2.html

  * igt@gem_persistent_relocs@forked-interruptible-thrashing:
    - shard-snb:          [PASS][21] -> [FAIL][22] ([fdo#112037])
   [21]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7172/shard-snb2/igt@gem_persistent_relocs@forked-interruptible-thrashing.html
   [22]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3606/shard-snb1/igt@gem_persistent_relocs@forked-interruptible-thrashing.html

  * igt@gem_softpin@softpin:
    - shard-iclb:         [PASS][23] -> [INCOMPLETE][24] ([fdo#107713] / [fdo#109100])
   [23]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7172/shard-iclb6/igt@gem_softpin@softpin.html
   [24]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3606/shard-iclb7/igt@gem_softpin@softpin.html

  * igt@gem_userptr_blits@dmabuf-sync:
    - shard-snb:          [PASS][25] -> [DMESG-WARN][26] ([fdo#111870]) +2 similar issues
   [25]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7172/shard-snb2/igt@gem_userptr_blits@dmabuf-sync.html
   [26]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3606/shard-snb2/igt@gem_userptr_blits@dmabuf-sync.html
    - shard-hsw:          [PASS][27] -> [DMESG-WARN][28] ([fdo#111870])
   [27]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7172/shard-hsw7/igt@gem_userptr_blits@dmabuf-sync.html
   [28]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3606/shard-hsw2/igt@gem_userptr_blits@dmabuf-sync.html

  * igt@kms_flip@2x-flip-vs-suspend-interruptible:
    - shard-hsw:          [PASS][29] -> [INCOMPLETE][30] ([fdo#103540]) +1 similar issue
   [29]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7172/shard-hsw1/igt@kms_flip@2x-flip-vs-suspend-interruptible.html
   [30]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3606/shard-hsw2/igt@kms_flip@2x-flip-vs-suspend-interruptible.html

  * igt@kms_frontbuffer_tracking@fbc-rgb565-draw-blt:
    - shard-iclb:         [PASS][31] -> [FAIL][32] ([fdo#103167]) +7 similar issues
   [31]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7172/shard-iclb6/igt@kms_frontbuffer_tracking@fbc-rgb565-draw-blt.html
   [32]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3606/shard-iclb8/igt@kms_frontbuffer_tracking@fbc-rgb565-draw-blt.html

  * igt@kms_vblank@pipe-b-query-forked-hang:
    - shard-glk:          [PASS][33] -> [SKIP][34] ([fdo#109271]) +8 similar issues
   [33]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7172/shard-glk4/igt@kms_vblank@pipe-b-query-forked-hang.html
   [34]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3606/shard-glk9/igt@kms_vblank@pipe-b-query-forked-hang.html

  * igt@perf_pmu@busy-check-all-vcs1:
    - shard-iclb:         [PASS][35] -> [SKIP][36] ([fdo#112080]) +6 similar issues
   [35]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7172/shard-iclb1/igt@perf_pmu@busy-check-all-vcs1.html
   [36]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3606/shard-iclb8/igt@perf_pmu@busy-check-all-vcs1.html

  
#### Possible fixes ####

  * igt@gem_ctx_exec@basic-invalid-context-vcs1:
    - shard-iclb:         [SKIP][37] ([fdo#112080]) -> [PASS][38] +5 similar issues
   [37]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7172/shard-iclb3/igt@gem_ctx_exec@basic-invalid-context-vcs1.html
   [38]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3606/shard-iclb4/igt@gem_ctx_exec@basic-invalid-context-vcs1.html

  * igt@gem_ctx_isolation@vcs1-none:
    - shard-iclb:         [SKIP][39] ([fdo#109276] / [fdo#112080]) -> [PASS][40] +1 similar issue
   [39]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7172/shard-iclb7/igt@gem_ctx_isolation@vcs1-none.html
   [40]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3606/shard-iclb2/igt@gem_ctx_isolation@vcs1-none.html

  * igt@gem_ctx_shared@q-smoketest-all:
    - {shard-tglb}:       [INCOMPLETE][41] ([fdo#111735]) -> [PASS][42]
   [41]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7172/shard-tglb4/igt@gem_ctx_shared@q-smoketest-all.html
   [42]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3606/shard-tglb7/igt@gem_ctx_shared@q-smoketest-all.html

  * igt@gem_exec_schedule@independent-bsd2:
    - shard-iclb:         [SKIP][43] ([fdo#109276]) -> [PASS][44] +10 similar issues
   [43]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7172/shard-iclb7/igt@gem_exec_schedule@independent-bsd2.html
   [44]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3606/shard-iclb2/igt@gem_exec_schedule@independent-bsd2.html

  * igt@gem_exec_schedule@promotion-bsd:
    - shard-iclb:         [SKIP][45] ([fdo#111325]) -> [PASS][46]
   [45]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7172/shard-iclb4/igt@gem_exec_schedule@promotion-bsd.html
   [46]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3606/shard-iclb3/igt@gem_exec_schedule@promotion-bsd.html

  * igt@gem_linear_blits@normal:
    - shard-apl:          [INCOMPLETE][47] ([fdo#103927]) -> [PASS][48] +1 similar issue
   [47]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7172/shard-apl3/igt@gem_linear_blits@normal.html
   [48]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3606/shard-apl8/igt@gem_linear_blits@normal.html

  * igt@gem_persistent_relocs@forked-interruptible-thrashing:
    - shard-hsw:          [FAIL][49] ([fdo#112037]) -> [PASS][50]
   [49]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7172/shard-hsw8/igt@gem_persistent_relocs@forked-interruptible-thrashing.html
   [50]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3606/shard-hsw1/igt@gem_persistent_relocs@forked-interruptible-thrashing.html

  * igt@gem_userptr_blits@map-fixed-invalidate-overlap-busy:
    - shard-snb:          [DMESG-WARN][51] ([fdo#111870]) -> [PASS][52] +2 similar issues
   [51]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7172/shard-snb5/igt@gem_userptr_blits@map-fixed-invalidate-overlap-busy.html
   [52]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3606/shard-snb4/igt@gem_userptr_blits@map-fixed-invalidate-overlap-busy.html

  * igt@gem_userptr_blits@sync-unmap-after-close:
    - shard-hsw:          [DMESG-WARN][53] ([fdo#111870]) -> [PASS][54] +3 similar issues
   [53]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7172/shard-hsw8/igt@gem_userptr_blits@sync-unmap-after-close.html
   [54]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3606/shard-hsw5/igt@gem_userptr_blits@sync-unmap-after-close.html

  * igt@gem_workarounds@suspend-resume-fd:
    - shard-kbl:          [DMESG-WARN][55] -> [PASS][56]
   [55]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7172/shard-kbl6/igt@gem_workarounds@suspend-resume-fd.html
   [56]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3606/shard-kbl6/igt@gem_workarounds@suspend-resume-fd.html

  * igt@i915_pm_rpm@system-suspend:
    - {shard-tglb}:       [INCOMPLETE][57] ([fdo#111747] / [fdo#111850]) -> [PASS][58]
   [57]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7172/shard-tglb4/igt@i915_pm_rpm@system-suspend.html
   [58]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3606/shard-tglb3/igt@i915_pm_rpm@system-suspend.html

  * igt@i915_suspend@sysfs-reader:
    - {shard-tglb}:       [INCOMPLETE][59] ([fdo#111832] / [fdo#111850]) -> [PASS][60] +2 similar issues
   [59]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7172/shard-tglb4/igt@i915_suspend@sysfs-reader.html
   [60]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3606/shard-tglb1/igt@i915_suspend@sysfs-reader.html

  * igt@kms_cursor_crc@pipe-a-cursor-suspend:
    - shard-kbl:          [DMESG-WARN][61] ([fdo#108566]) -> [PASS][62] +9 similar issues
   [61]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7172/shard-kbl4/igt@kms_cursor_crc@pipe-a-cursor-suspend.html
   [62]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3606/shard-kbl3/igt@kms_cursor_crc@pipe-a-cursor-suspend.html

  * igt@kms_cursor_crc@pipe-b-cursor-256x256-sliding:
    - shard-kbl:          [FAIL][63] ([fdo#103232]) -> [PASS][64]
   [63]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7172/shard-kbl6/igt@kms_cursor_crc@pipe-b-cursor-256x256-sliding.html
   [64]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3606/shard-kbl3/igt@kms_cursor_crc@pipe-b-cursor-256x256-sliding.html

  * igt@kms_cursor_legacy@2x-long-flip-vs-cursor-atomic:
    - shard-glk:          [FAIL][65] ([fdo#104873]) -> [PASS][66]
   [65]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7172/shard-glk6/igt@kms_cursor_legacy@2x-long-flip-vs-cursor-atomic.html
   [66]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3606/shard-glk7/igt@kms_cursor_legacy@2x-long-flip-vs-cursor-atomic.html

  * igt@kms_flip@flip-vs-suspend-interruptible:
    - shard-hsw:          [INCOMPLETE][67] ([fdo#103540]) -> [PASS][68]
   [67]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7172/shard-hsw2/igt@kms_flip@flip-vs-suspend-interruptible.html
   [68]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3606/shard-hsw8/igt@kms_flip@flip-vs-suspend-interruptible.html

  * igt@kms_frontbuffer_tracking@fbc-1p-pri-indfb-multidraw:
    - {shard-tglb}:       [FAIL][69] ([fdo#103167]) -> [PASS][70]
   [69]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7172/shard-tglb4/igt@kms_frontbuffer_tracking@fbc-1p-pri-indfb-multidraw.html
   [70]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3606/shard-tglb1/igt@kms_frontbuffer_tracking@fbc-1p-pri-indfb-multidraw.html

  * igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-cur-indfb-draw-mmap-cpu:
    - shard-glk:          [FAIL][71] ([fdo#103167]) -> [PASS][72]
   [71]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7172/shard-glk6/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-cur-indfb-draw-mmap-cpu.html
   [72]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3606/shard-glk2/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-cur-indfb-draw-mmap-cpu.html

  * igt@kms_frontbuffer_tracking@fbc-suspend:
    - {shard-tglb}:       [INCOMPLETE][73] ([fdo#111832] / [fdo#111850] / [fdo#111884]) -> [PASS][74] +1 similar issue
   [73]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7172/shard-tglb5/igt@kms_frontbuffer_tracking@fbc-suspend.html
   [74]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3606/shard-tglb6/igt@kms_frontbuffer_tracking@fbc-suspend.html

  * igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-spr-indfb-draw-render:
    - shard-iclb:         [FAIL][75] ([fdo#103167]) -> [PASS][76] +3 similar issues
   [75]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7172/shard-iclb7/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-spr-indfb-draw-render.html
   [76]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3606/shard-iclb8/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-spr-indfb-draw-render.html

  * igt@kms_plane@plane-panning-bottom-right-pipe-b-planes:
    - shard-iclb:         [INCOMPLETE][77] ([fdo#107713]) -> [PASS][78]
   [77]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7172/shard-iclb1/igt@kms_plane@plane-panning-bottom-right-pipe-b-planes.html
   [78]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3606/shard-iclb4/igt@kms_plane@plane-panning-bottom-right-pipe-b-planes.html

  * igt@kms_plane@plane-panning-bottom-right-suspend-pipe-b-planes:
    - shard-apl:          [DMESG-WARN][79] ([fdo#108566]) -> [PASS][80] +3 similar issues
   [79]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7172/shard-apl1/igt@kms_plane@plane-panning-bottom-right-suspend-pipe-b-planes.html
   [80]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3606/shard-apl2/igt@kms_plane@plane-panning-bottom-right-suspend-pipe-b-planes.html

  * igt@kms_psr@psr2_cursor_plane_onoff:
    - shard-iclb:         [SKIP][81] ([fdo#109441]) -> [PASS][82] +1 similar issue
   [81]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7172/shard-iclb7/igt@kms_psr@psr2_cursor_plane_onoff.html
   [82]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3606/shard-iclb2/igt@kms_psr@psr2_cursor_plane_onoff.html

  * igt@kms_rotation_crc@primary-yf-tiled-reflect-x-0:
    - shard-iclb:         [INCOMPLETE][83] ([fdo#107713] / [fdo#110026] / [fdo#110040 ]) -> [PASS][84]
   [83]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7172/shard-iclb7/igt@kms_rotation_crc@primary-yf-tiled-reflect-x-0.html
   [84]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3606/shard-iclb2/igt@kms_rotation_crc@primary-yf-tiled-reflect-x-0.html

  * igt@kms_setmode@basic:
    - shard-glk:          [FAIL][85] ([fdo#99912]) -> [PASS][86]
   [85]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7172/shard-glk9/igt@kms_setmode@basic.html
   [86]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3606/shard-glk6/igt@kms_setmode@basic.html

  
#### Warnings ####

  * igt@gem_mocs_settings@mocs-rc6-bsd2:
    - shard-iclb:         [SKIP][87] ([fdo#109276]) -> [FAIL][88] ([fdo#111330])
   [87]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7172/shard-iclb6/igt@gem_mocs_settings@mocs-rc6-bsd2.html
   [88]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3606/shard-iclb2/igt@gem_mocs_settings@mocs-rc6-bsd2.html

  * igt@prime_busy@wait-hang-default:
    - shard-apl:          [INCOMPLETE][89] ([fdo#103927]) -> [SKIP][90] ([fdo#109271])
   [89]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7172/shard-apl6/igt@prime_busy@wait-hang-default.html
   [90]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3606/shard-apl1/igt@prime_busy@wait-hang-default.html

  
  {name}: This element is suppressed. This means it is ignored when computing
          the status of the difference (SUCCESS, WARNING, or FAILURE).

  [fdo#103167]: https://bugs.freedesktop.org/show_bug.cgi?id=103167
  [fdo#103232]: https://bugs.freedesktop.org/show_bug.cgi?id=103232
  [fdo#103359]: https://bugs.freedesktop.org/show_bug.cgi?id=103359
  [fdo#103540]: https://bugs.freedesktop.org/show_bug.cgi?id=103540
  [fdo#103665]: https://bugs.freedesktop.org/show_bug.cgi?id=103665
  [fdo#103927]: https://bugs.freedesktop.org/show_bug.cgi?id=103927
  [fdo#104873]: https://bugs.freedesktop.org/show_bug.cgi?id=104873
  [fdo#107713]: https://bugs.freedesktop.org/show_bug.cgi?id=107713
  [fdo#108566]: https://bugs.freedesktop.org/show_bug.cgi?id=108566
  [fdo#109100]: https://bugs.freedesktop.org/show_bug.cgi?id=109100
  [fdo#109271]: https://bugs.freedesktop.org/show_bug.cgi?id=109271
  [fdo#109276]: https://bugs.freedesktop.org/show_bug.cgi?id=109276
  [fdo#109441]: https://bugs.freedesktop.org/show_bug.cgi?id=109441
  [fdo#110026]: https://bugs.freedesktop.org/show_bug.cgi?id=110026
  [fdo#110040 ]: https://bugs.freedesktop.org/show_bug.cgi?id=110040 
  [fdo#111325]: https://bugs.freedesktop.org/show_bug.cgi?id=111325
  [fdo#111329]: https://bugs.freedesktop.org/show_bug.cgi?id=111329
  [fdo#111330]: https://bugs.freedesktop.org/show_bug.cgi?id=111330
  [fdo#111646]: https://bugs.freedesktop.org/show_bug.cgi?id=111646
  [fdo#111671]: https://bugs.freedesktop.org/show_bug.cgi?id=111671
  [fdo#111735]: https://bugs.freedesktop.org/show_bug.cgi?id=111735
  [fdo#111747]: https://bugs.freedesktop.org/show_bug.cgi?id=111747
  [fdo#111832]: https://bugs.freedesktop.org/show_bug.cgi?id=111832
  [fdo#111850]: https://bugs.freedesktop.org/show_bug.cgi?id=111850
  [fdo#111855]: https://bugs.freedesktop.org/show_bug.cgi?id=111855
  [fdo#111870]: https://bugs.freedesktop.org/show_bug.cgi?id=111870
  [fdo#111884]: https://bugs.freedesktop.org/show_bug.cgi?id=111884
  [fdo#112037]: https://bugs.freedesktop.org/show_bug.cgi?id=112037
  [fdo#112080]: https://bugs.freedesktop.org/show_bug.cgi?id=112080
  [fdo#112096]: https://bugs.freedesktop.org/show_bug.cgi?id=112096
  [fdo#112117]: https://bugs.freedesktop.org/show_bug.cgi?id=112117
  [fdo#99912]: https://bugs.freedesktop.org/show_bug.cgi?id=99912
  [k.org#198133]: https://bugzilla.kernel.org/show_bug.cgi?id=198133


Participating hosts (11 -> 8)
--

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3606/index.html
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev

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

* [igt-dev] ✗ Fi.CI.BAT: failure for lib/igt_list: Update, clean-up and document igt_list (rev3)
  2019-10-24 12:31 [igt-dev] [PATCH i-g-t] lib/igt_list: Update, clean-up and document igt_list Arkadiusz Hiler
                   ` (3 preceding siblings ...)
  2019-10-25 20:10 ` [igt-dev] ✗ Fi.CI.IGT: failure for lib/igt_list: Update, clean-up and document igt_list (rev2) Patchwork
@ 2019-10-28  9:12 ` Patchwork
  2019-10-28 10:25 ` [igt-dev] ✓ Fi.CI.BAT: success " Patchwork
  2019-10-29  4:05 ` [igt-dev] ✓ Fi.CI.IGT: " Patchwork
  6 siblings, 0 replies; 9+ messages in thread
From: Patchwork @ 2019-10-28  9:12 UTC (permalink / raw)
  To: Arkadiusz Hiler; +Cc: igt-dev

== Series Details ==

Series: lib/igt_list: Update, clean-up and document igt_list (rev3)
URL   : https://patchwork.freedesktop.org/series/66806/
State : failure

== Summary ==

CI Bug Log - changes from IGT_5247 -> IGTPW_3622
====================================================

Summary
-------

  **FAILURE**

  Serious unknown changes coming with IGTPW_3622 absolutely need to be
  verified manually.
  
  If you think the reported changes have nothing to do with the changes
  introduced in IGTPW_3622, please notify your bug team to allow them
  to document this new failure mode, which will reduce false positives in CI.

  External URL: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/index.html

Possible new issues
-------------------

  Here are the unknown changes that may have been introduced in IGTPW_3622:

### IGT changes ###

#### Possible regressions ####

  * igt@i915_selftest@live_blt:
    - fi-hsw-peppy:       [PASS][1] -> [DMESG-FAIL][2]
   [1]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_5247/fi-hsw-peppy/igt@i915_selftest@live_blt.html
   [2]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/fi-hsw-peppy/igt@i915_selftest@live_blt.html

  
Known issues
------------

  Here are the changes found in IGTPW_3622 that come from known issues:

### IGT changes ###

#### Issues hit ####

  * igt@prime_vgem@basic-fence-read:
    - fi-icl-u3:          [PASS][3] -> [DMESG-WARN][4] ([fdo#107724]) +1 similar issue
   [3]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_5247/fi-icl-u3/igt@prime_vgem@basic-fence-read.html
   [4]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/fi-icl-u3/igt@prime_vgem@basic-fence-read.html

  
#### Possible fixes ####

  * igt@gem_ctx_switch@legacy-render:
    - {fi-icl-guc}:       [INCOMPLETE][5] ([fdo#107713] / [fdo#111381]) -> [PASS][6]
   [5]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_5247/fi-icl-guc/igt@gem_ctx_switch@legacy-render.html
   [6]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/fi-icl-guc/igt@gem_ctx_switch@legacy-render.html

  * igt@gem_flink_basic@double-flink:
    - fi-icl-u3:          [DMESG-WARN][7] ([fdo#107724]) -> [PASS][8]
   [7]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_5247/fi-icl-u3/igt@gem_flink_basic@double-flink.html
   [8]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/fi-icl-u3/igt@gem_flink_basic@double-flink.html

  * igt@kms_frontbuffer_tracking@basic:
    - fi-icl-u3:          [FAIL][9] ([fdo#103167]) -> [PASS][10]
   [9]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_5247/fi-icl-u3/igt@kms_frontbuffer_tracking@basic.html
   [10]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/fi-icl-u3/igt@kms_frontbuffer_tracking@basic.html

  
#### Warnings ####

  * igt@kms_chamelium@hdmi-hpd-fast:
    - fi-kbl-7500u:       [FAIL][11] ([fdo#111045] / [fdo#111096]) -> [FAIL][12] ([fdo#111407])
   [11]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_5247/fi-kbl-7500u/igt@kms_chamelium@hdmi-hpd-fast.html
   [12]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/fi-kbl-7500u/igt@kms_chamelium@hdmi-hpd-fast.html

  
  {name}: This element is suppressed. This means it is ignored when computing
          the status of the difference (SUCCESS, WARNING, or FAILURE).

  [fdo#103167]: https://bugs.freedesktop.org/show_bug.cgi?id=103167
  [fdo#107713]: https://bugs.freedesktop.org/show_bug.cgi?id=107713
  [fdo#107724]: https://bugs.freedesktop.org/show_bug.cgi?id=107724
  [fdo#111045]: https://bugs.freedesktop.org/show_bug.cgi?id=111045
  [fdo#111096]: https://bugs.freedesktop.org/show_bug.cgi?id=111096
  [fdo#111381]: https://bugs.freedesktop.org/show_bug.cgi?id=111381
  [fdo#111407]: https://bugs.freedesktop.org/show_bug.cgi?id=111407
  [fdo#111736]: https://bugs.freedesktop.org/show_bug.cgi?id=111736


Participating hosts (49 -> 41)
------------------------------

  Additional (2): fi-bwr-2160 fi-skl-6700k2 
  Missing    (10): fi-ilk-m540 fi-icl-u4 fi-bxt-dsi fi-tgl-u fi-hsw-4200u fi-byt-squawks fi-bsw-cyan fi-icl-y fi-byt-clapper fi-bdw-samus 


Build changes
-------------

  * CI: CI-20190529 -> None
  * IGT: IGT_5247 -> IGTPW_3622

  CI-20190529: 20190529
  CI_DRM_7196: 54520983c610850dc9034dfdfeec2a0492949d8f @ git://anongit.freedesktop.org/gfx-ci/linux
  IGTPW_3622: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/index.html
  IGT_5247: 4d1f6036dfceeee64f92c02475f9ae2cc8ffcc1b @ git://anongit.freedesktop.org/xorg/app/intel-gpu-tools

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/index.html
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev

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

* [igt-dev] ✓ Fi.CI.BAT: success for lib/igt_list: Update, clean-up and document igt_list (rev3)
  2019-10-24 12:31 [igt-dev] [PATCH i-g-t] lib/igt_list: Update, clean-up and document igt_list Arkadiusz Hiler
                   ` (4 preceding siblings ...)
  2019-10-28  9:12 ` [igt-dev] ✗ Fi.CI.BAT: failure for lib/igt_list: Update, clean-up and document igt_list (rev3) Patchwork
@ 2019-10-28 10:25 ` Patchwork
  2019-10-29  4:05 ` [igt-dev] ✓ Fi.CI.IGT: " Patchwork
  6 siblings, 0 replies; 9+ messages in thread
From: Patchwork @ 2019-10-28 10:25 UTC (permalink / raw)
  To: Arkadiusz Hiler; +Cc: igt-dev

== Series Details ==

Series: lib/igt_list: Update, clean-up and document igt_list (rev3)
URL   : https://patchwork.freedesktop.org/series/66806/
State : success

== Summary ==

CI Bug Log - changes from IGT_5247 -> IGTPW_3622
====================================================

Summary
-------

  **SUCCESS**

  No regressions found.

  External URL: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/index.html

Known issues
------------

  Here are the changes found in IGTPW_3622 that come from known issues:

### IGT changes ###

#### Issues hit ####

  * igt@i915_selftest@live_blt:
    - fi-hsw-peppy:       [PASS][1] -> [DMESG-FAIL][2] ([fdo#112147])
   [1]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_5247/fi-hsw-peppy/igt@i915_selftest@live_blt.html
   [2]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/fi-hsw-peppy/igt@i915_selftest@live_blt.html

  * igt@prime_vgem@basic-fence-read:
    - fi-icl-u3:          [PASS][3] -> [DMESG-WARN][4] ([fdo#107724]) +1 similar issue
   [3]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_5247/fi-icl-u3/igt@prime_vgem@basic-fence-read.html
   [4]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/fi-icl-u3/igt@prime_vgem@basic-fence-read.html

  
#### Possible fixes ####

  * igt@gem_ctx_switch@legacy-render:
    - {fi-icl-guc}:       [INCOMPLETE][5] ([fdo#107713] / [fdo#111381]) -> [PASS][6]
   [5]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_5247/fi-icl-guc/igt@gem_ctx_switch@legacy-render.html
   [6]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/fi-icl-guc/igt@gem_ctx_switch@legacy-render.html

  * igt@gem_flink_basic@double-flink:
    - fi-icl-u3:          [DMESG-WARN][7] ([fdo#107724]) -> [PASS][8]
   [7]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_5247/fi-icl-u3/igt@gem_flink_basic@double-flink.html
   [8]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/fi-icl-u3/igt@gem_flink_basic@double-flink.html

  * igt@kms_frontbuffer_tracking@basic:
    - fi-icl-u3:          [FAIL][9] ([fdo#103167]) -> [PASS][10]
   [9]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_5247/fi-icl-u3/igt@kms_frontbuffer_tracking@basic.html
   [10]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/fi-icl-u3/igt@kms_frontbuffer_tracking@basic.html

  
#### Warnings ####

  * igt@kms_chamelium@hdmi-hpd-fast:
    - fi-kbl-7500u:       [FAIL][11] ([fdo#111045] / [fdo#111096]) -> [FAIL][12] ([fdo#111407])
   [11]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_5247/fi-kbl-7500u/igt@kms_chamelium@hdmi-hpd-fast.html
   [12]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/fi-kbl-7500u/igt@kms_chamelium@hdmi-hpd-fast.html

  
  {name}: This element is suppressed. This means it is ignored when computing
          the status of the difference (SUCCESS, WARNING, or FAILURE).

  [fdo#103167]: https://bugs.freedesktop.org/show_bug.cgi?id=103167
  [fdo#107713]: https://bugs.freedesktop.org/show_bug.cgi?id=107713
  [fdo#107724]: https://bugs.freedesktop.org/show_bug.cgi?id=107724
  [fdo#111045]: https://bugs.freedesktop.org/show_bug.cgi?id=111045
  [fdo#111096]: https://bugs.freedesktop.org/show_bug.cgi?id=111096
  [fdo#111381]: https://bugs.freedesktop.org/show_bug.cgi?id=111381
  [fdo#111407]: https://bugs.freedesktop.org/show_bug.cgi?id=111407
  [fdo#111736]: https://bugs.freedesktop.org/show_bug.cgi?id=111736
  [fdo#112147]: https://bugs.freedesktop.org/show_bug.cgi?id=112147


Participating hosts (49 -> 41)
------------------------------

  Additional (2): fi-bwr-2160 fi-skl-6700k2 
  Missing    (10): fi-ilk-m540 fi-icl-u4 fi-bxt-dsi fi-tgl-u fi-hsw-4200u fi-byt-squawks fi-bsw-cyan fi-icl-y fi-byt-clapper fi-bdw-samus 


Build changes
-------------

  * CI: CI-20190529 -> None
  * IGT: IGT_5247 -> IGTPW_3622

  CI-20190529: 20190529
  CI_DRM_7196: 54520983c610850dc9034dfdfeec2a0492949d8f @ git://anongit.freedesktop.org/gfx-ci/linux
  IGTPW_3622: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/index.html
  IGT_5247: 4d1f6036dfceeee64f92c02475f9ae2cc8ffcc1b @ git://anongit.freedesktop.org/xorg/app/intel-gpu-tools

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/index.html
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev

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

* [igt-dev] ✓ Fi.CI.IGT: success for lib/igt_list: Update, clean-up and document igt_list (rev3)
  2019-10-24 12:31 [igt-dev] [PATCH i-g-t] lib/igt_list: Update, clean-up and document igt_list Arkadiusz Hiler
                   ` (5 preceding siblings ...)
  2019-10-28 10:25 ` [igt-dev] ✓ Fi.CI.BAT: success " Patchwork
@ 2019-10-29  4:05 ` Patchwork
  6 siblings, 0 replies; 9+ messages in thread
From: Patchwork @ 2019-10-29  4:05 UTC (permalink / raw)
  To: Arkadiusz Hiler; +Cc: igt-dev

== Series Details ==

Series: lib/igt_list: Update, clean-up and document igt_list (rev3)
URL   : https://patchwork.freedesktop.org/series/66806/
State : success

== Summary ==

CI Bug Log - changes from IGT_5247_full -> IGTPW_3622_full
====================================================

Summary
-------

  **SUCCESS**

  No regressions found.

  External URL: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/index.html

Possible new issues
-------------------

  Here are the unknown changes that may have been introduced in IGTPW_3622_full:

### IGT changes ###

#### Suppressed ####

  The following results come from untrusted machines, tests, or statuses.
  They do not affect the overall result.

  * igt@gem_sync@basic-many-each:
    - {shard-tglb}:       [PASS][1] -> [INCOMPLETE][2]
   [1]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_5247/shard-tglb1/igt@gem_sync@basic-many-each.html
   [2]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/shard-tglb8/igt@gem_sync@basic-many-each.html

  
Known issues
------------

  Here are the changes found in IGTPW_3622_full that come from known issues:

### IGT changes ###

#### Issues hit ####

  * igt@gem_ctx_isolation@vcs1-clean:
    - shard-iclb:         [PASS][3] -> [SKIP][4] ([fdo#109276] / [fdo#112080])
   [3]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_5247/shard-iclb2/igt@gem_ctx_isolation@vcs1-clean.html
   [4]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/shard-iclb7/igt@gem_ctx_isolation@vcs1-clean.html

  * igt@gem_ctx_shared@exec-single-timeline-bsd:
    - shard-iclb:         [PASS][5] -> [SKIP][6] ([fdo#110841])
   [5]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_5247/shard-iclb3/igt@gem_ctx_shared@exec-single-timeline-bsd.html
   [6]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/shard-iclb4/igt@gem_ctx_shared@exec-single-timeline-bsd.html

  * igt@gem_eio@reset-stress:
    - shard-snb:          [PASS][7] -> [FAIL][8] ([fdo#109661])
   [7]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_5247/shard-snb5/igt@gem_eio@reset-stress.html
   [8]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/shard-snb6/igt@gem_eio@reset-stress.html

  * igt@gem_exec_gttfill@basic:
    - shard-apl:          [PASS][9] -> [INCOMPLETE][10] ([fdo#103927]) +2 similar issues
   [9]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_5247/shard-apl3/igt@gem_exec_gttfill@basic.html
   [10]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/shard-apl8/igt@gem_exec_gttfill@basic.html

  * igt@gem_exec_schedule@independent-bsd:
    - shard-iclb:         [PASS][11] -> [SKIP][12] ([fdo#112146])
   [11]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_5247/shard-iclb3/igt@gem_exec_schedule@independent-bsd.html
   [12]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/shard-iclb1/igt@gem_exec_schedule@independent-bsd.html

  * igt@gem_userptr_blits@map-fixed-invalidate-busy-gup:
    - shard-hsw:          [PASS][13] -> [DMESG-WARN][14] ([fdo#111870]) +1 similar issue
   [13]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_5247/shard-hsw5/igt@gem_userptr_blits@map-fixed-invalidate-busy-gup.html
   [14]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/shard-hsw6/igt@gem_userptr_blits@map-fixed-invalidate-busy-gup.html
    - shard-snb:          [PASS][15] -> [DMESG-WARN][16] ([fdo#111870])
   [15]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_5247/shard-snb6/igt@gem_userptr_blits@map-fixed-invalidate-busy-gup.html
   [16]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/shard-snb2/igt@gem_userptr_blits@map-fixed-invalidate-busy-gup.html

  * igt@i915_pm_rc6_residency@rc6-accuracy:
    - shard-snb:          [PASS][17] -> [SKIP][18] ([fdo#109271])
   [17]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_5247/shard-snb6/igt@i915_pm_rc6_residency@rc6-accuracy.html
   [18]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/shard-snb4/igt@i915_pm_rc6_residency@rc6-accuracy.html

  * igt@kms_cursor_crc@pipe-b-cursor-64x21-sliding:
    - shard-apl:          [PASS][19] -> [FAIL][20] ([fdo#103232])
   [19]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_5247/shard-apl1/igt@kms_cursor_crc@pipe-b-cursor-64x21-sliding.html
   [20]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/shard-apl4/igt@kms_cursor_crc@pipe-b-cursor-64x21-sliding.html
    - shard-kbl:          [PASS][21] -> [FAIL][22] ([fdo#103232])
   [21]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_5247/shard-kbl1/igt@kms_cursor_crc@pipe-b-cursor-64x21-sliding.html
   [22]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/shard-kbl6/igt@kms_cursor_crc@pipe-b-cursor-64x21-sliding.html

  * igt@kms_cursor_legacy@2x-long-flip-vs-cursor-atomic:
    - shard-glk:          [PASS][23] -> [FAIL][24] ([fdo#104873])
   [23]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_5247/shard-glk5/igt@kms_cursor_legacy@2x-long-flip-vs-cursor-atomic.html
   [24]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/shard-glk2/igt@kms_cursor_legacy@2x-long-flip-vs-cursor-atomic.html

  * igt@kms_flip@2x-plain-flip-fb-recreate:
    - shard-glk:          [PASS][25] -> [FAIL][26] ([fdo#100368])
   [25]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_5247/shard-glk7/igt@kms_flip@2x-plain-flip-fb-recreate.html
   [26]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/shard-glk2/igt@kms_flip@2x-plain-flip-fb-recreate.html

  * igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-cur-indfb-draw-render:
    - shard-iclb:         [PASS][27] -> [FAIL][28] ([fdo#103167]) +5 similar issues
   [27]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_5247/shard-iclb3/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-cur-indfb-draw-render.html
   [28]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/shard-iclb1/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-cur-indfb-draw-render.html

  * igt@kms_pipe_crc_basic@suspend-read-crc-pipe-b:
    - shard-iclb:         [PASS][29] -> [DMESG-WARN][30] ([fdo#111764])
   [29]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_5247/shard-iclb5/igt@kms_pipe_crc_basic@suspend-read-crc-pipe-b.html
   [30]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/shard-iclb5/igt@kms_pipe_crc_basic@suspend-read-crc-pipe-b.html

  * igt@kms_plane@plane-panning-bottom-right-suspend-pipe-a-planes:
    - shard-kbl:          [PASS][31] -> [DMESG-WARN][32] ([fdo#108566]) +1 similar issue
   [31]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_5247/shard-kbl6/igt@kms_plane@plane-panning-bottom-right-suspend-pipe-a-planes.html
   [32]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/shard-kbl3/igt@kms_plane@plane-panning-bottom-right-suspend-pipe-a-planes.html

  * igt@kms_plane@plane-panning-bottom-right-suspend-pipe-b-planes:
    - shard-apl:          [PASS][33] -> [DMESG-WARN][34] ([fdo#108566]) +3 similar issues
   [33]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_5247/shard-apl8/igt@kms_plane@plane-panning-bottom-right-suspend-pipe-b-planes.html
   [34]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/shard-apl6/igt@kms_plane@plane-panning-bottom-right-suspend-pipe-b-planes.html

  * igt@kms_psr2_su@page_flip:
    - shard-iclb:         [PASS][35] -> [SKIP][36] ([fdo#109642] / [fdo#111068])
   [35]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_5247/shard-iclb2/igt@kms_psr2_su@page_flip.html
   [36]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/shard-iclb7/igt@kms_psr2_su@page_flip.html

  * igt@kms_psr@psr2_sprite_plane_move:
    - shard-iclb:         [PASS][37] -> [SKIP][38] ([fdo#109441])
   [37]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_5247/shard-iclb2/igt@kms_psr@psr2_sprite_plane_move.html
   [38]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/shard-iclb6/igt@kms_psr@psr2_sprite_plane_move.html

  * igt@perf_pmu@busy-no-semaphores-vcs1:
    - shard-iclb:         [PASS][39] -> [SKIP][40] ([fdo#112080]) +13 similar issues
   [39]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_5247/shard-iclb2/igt@perf_pmu@busy-no-semaphores-vcs1.html
   [40]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/shard-iclb3/igt@perf_pmu@busy-no-semaphores-vcs1.html

  * igt@prime_busy@hang-bsd2:
    - shard-iclb:         [PASS][41] -> [SKIP][42] ([fdo#109276]) +13 similar issues
   [41]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_5247/shard-iclb1/igt@prime_busy@hang-bsd2.html
   [42]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/shard-iclb6/igt@prime_busy@hang-bsd2.html

  
#### Possible fixes ####

  * igt@gem_ctx_isolation@vcs1-dirty-create:
    - shard-iclb:         [SKIP][43] ([fdo#109276] / [fdo#112080]) -> [PASS][44]
   [43]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_5247/shard-iclb7/igt@gem_ctx_isolation@vcs1-dirty-create.html
   [44]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/shard-iclb1/igt@gem_ctx_isolation@vcs1-dirty-create.html

  * igt@gem_ctx_shared@q-smoketest-all:
    - {shard-tglb}:       [INCOMPLETE][45] ([fdo#111735]) -> [PASS][46]
   [45]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_5247/shard-tglb6/igt@gem_ctx_shared@q-smoketest-all.html
   [46]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/shard-tglb5/igt@gem_ctx_shared@q-smoketest-all.html

  * igt@gem_exec_balancer@smoke:
    - {shard-tglb}:       [INCOMPLETE][47] ([fdo#111593]) -> [PASS][48]
   [47]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_5247/shard-tglb7/igt@gem_exec_balancer@smoke.html
   [48]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/shard-tglb7/igt@gem_exec_balancer@smoke.html

  * igt@gem_exec_parallel@vcs1-fds:
    - shard-iclb:         [SKIP][49] ([fdo#112080]) -> [PASS][50] +9 similar issues
   [49]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_5247/shard-iclb8/igt@gem_exec_parallel@vcs1-fds.html
   [50]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/shard-iclb2/igt@gem_exec_parallel@vcs1-fds.html

  * igt@gem_exec_schedule@preempt-queue-contexts-chain-render:
    - {shard-tglb}:       [INCOMPLETE][51] ([fdo#111677]) -> [PASS][52]
   [51]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_5247/shard-tglb6/igt@gem_exec_schedule@preempt-queue-contexts-chain-render.html
   [52]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/shard-tglb5/igt@gem_exec_schedule@preempt-queue-contexts-chain-render.html

  * igt@gem_exec_schedule@promotion-bsd1:
    - shard-iclb:         [SKIP][53] ([fdo#109276]) -> [PASS][54] +8 similar issues
   [53]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_5247/shard-iclb6/igt@gem_exec_schedule@promotion-bsd1.html
   [54]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/shard-iclb1/igt@gem_exec_schedule@promotion-bsd1.html

  * igt@gem_exec_schedule@reorder-wide-bsd:
    - shard-iclb:         [SKIP][55] ([fdo#112146]) -> [PASS][56] +7 similar issues
   [55]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_5247/shard-iclb1/igt@gem_exec_schedule@reorder-wide-bsd.html
   [56]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/shard-iclb5/igt@gem_exec_schedule@reorder-wide-bsd.html

  * igt@gem_pipe_control_store_loop@reused-buffer:
    - {shard-tglb}:       [INCOMPLETE][57] -> [PASS][58]
   [57]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_5247/shard-tglb6/igt@gem_pipe_control_store_loop@reused-buffer.html
   [58]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/shard-tglb8/igt@gem_pipe_control_store_loop@reused-buffer.html

  * igt@gem_tiled_swapping@non-threaded:
    - shard-apl:          [DMESG-WARN][59] ([fdo#108686]) -> [PASS][60]
   [59]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_5247/shard-apl1/igt@gem_tiled_swapping@non-threaded.html
   [60]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/shard-apl6/igt@gem_tiled_swapping@non-threaded.html

  * igt@gem_userptr_blits@sync-unmap-cycles:
    - shard-snb:          [DMESG-WARN][61] ([fdo#111870]) -> [PASS][62] +1 similar issue
   [61]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_5247/shard-snb4/igt@gem_userptr_blits@sync-unmap-cycles.html
   [62]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/shard-snb2/igt@gem_userptr_blits@sync-unmap-cycles.html

  * igt@i915_pm_backlight@fade_with_suspend:
    - {shard-tglb}:       [INCOMPLETE][63] ([fdo#111832] / [fdo#111850]) -> [PASS][64] +1 similar issue
   [63]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_5247/shard-tglb5/igt@i915_pm_backlight@fade_with_suspend.html
   [64]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/shard-tglb1/igt@i915_pm_backlight@fade_with_suspend.html

  * igt@i915_selftest@mock_fence:
    - shard-iclb:         [INCOMPLETE][65] ([fdo#107713]) -> [PASS][66]
   [65]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_5247/shard-iclb7/igt@i915_selftest@mock_fence.html
   [66]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/shard-iclb2/igt@i915_selftest@mock_fence.html

  * igt@kms_flip@flip-vs-suspend-interruptible:
    - shard-hsw:          [INCOMPLETE][67] ([fdo#103540]) -> [PASS][68]
   [67]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_5247/shard-hsw2/igt@kms_flip@flip-vs-suspend-interruptible.html
   [68]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/shard-hsw6/igt@kms_flip@flip-vs-suspend-interruptible.html

  * igt@kms_frontbuffer_tracking@fbc-1p-primscrn-cur-indfb-move:
    - {shard-tglb}:       [FAIL][69] ([fdo#103167]) -> [PASS][70] +1 similar issue
   [69]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_5247/shard-tglb4/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-cur-indfb-move.html
   [70]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/shard-tglb1/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-cur-indfb-move.html

  * igt@kms_frontbuffer_tracking@fbc-2p-primscrn-spr-indfb-draw-pwrite:
    - shard-glk:          [FAIL][71] ([fdo#103167]) -> [PASS][72]
   [71]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_5247/shard-glk2/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-spr-indfb-draw-pwrite.html
   [72]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/shard-glk9/igt@kms_frontbuffer_tracking@fbc-2p-primscrn-spr-indfb-draw-pwrite.html

  * igt@kms_frontbuffer_tracking@fbc-rgb565-draw-pwrite:
    - shard-iclb:         [FAIL][73] ([fdo#103167]) -> [PASS][74] +6 similar issues
   [73]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_5247/shard-iclb2/igt@kms_frontbuffer_tracking@fbc-rgb565-draw-pwrite.html
   [74]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/shard-iclb7/igt@kms_frontbuffer_tracking@fbc-rgb565-draw-pwrite.html

  * igt@kms_psr@psr2_cursor_plane_onoff:
    - shard-iclb:         [SKIP][75] ([fdo#109441]) -> [PASS][76]
   [75]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_5247/shard-iclb3/igt@kms_psr@psr2_cursor_plane_onoff.html
   [76]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/shard-iclb2/igt@kms_psr@psr2_cursor_plane_onoff.html

  * igt@kms_setmode@basic:
    - shard-kbl:          [FAIL][77] ([fdo#99912]) -> [PASS][78]
   [77]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_5247/shard-kbl2/igt@kms_setmode@basic.html
   [78]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/shard-kbl7/igt@kms_setmode@basic.html

  * igt@kms_vblank@pipe-a-query-idle-hang:
    - shard-hsw:          [DMESG-WARN][79] ([fdo#102614]) -> [PASS][80] +1 similar issue
   [79]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_5247/shard-hsw5/igt@kms_vblank@pipe-a-query-idle-hang.html
   [80]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/shard-hsw2/igt@kms_vblank@pipe-a-query-idle-hang.html

  
#### Warnings ####

  * igt@gem_ctx_isolation@vcs1-nonpriv:
    - shard-iclb:         [FAIL][81] ([fdo#111329]) -> [SKIP][82] ([fdo#109276] / [fdo#112080])
   [81]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_5247/shard-iclb4/igt@gem_ctx_isolation@vcs1-nonpriv.html
   [82]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/shard-iclb3/igt@gem_ctx_isolation@vcs1-nonpriv.html

  * igt@gem_mocs_settings@mocs-rc6-bsd2:
    - shard-iclb:         [SKIP][83] ([fdo#109276]) -> [FAIL][84] ([fdo#111330])
   [83]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_5247/shard-iclb8/igt@gem_mocs_settings@mocs-rc6-bsd2.html
   [84]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/shard-iclb4/igt@gem_mocs_settings@mocs-rc6-bsd2.html

  * igt@kms_cursor_crc@pipe-c-cursor-suspend:
    - shard-kbl:          [INCOMPLETE][85] ([fdo#103665]) -> [DMESG-WARN][86] ([fdo#108566])
   [85]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_5247/shard-kbl4/igt@kms_cursor_crc@pipe-c-cursor-suspend.html
   [86]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/shard-kbl1/igt@kms_cursor_crc@pipe-c-cursor-suspend.html

  
  {name}: This element is suppressed. This means it is ignored when computing
          the status of the difference (SUCCESS, WARNING, or FAILURE).

  [fdo#100368]: https://bugs.freedesktop.org/show_bug.cgi?id=100368
  [fdo#102614]: https://bugs.freedesktop.org/show_bug.cgi?id=102614
  [fdo#103167]: https://bugs.freedesktop.org/show_bug.cgi?id=103167
  [fdo#103232]: https://bugs.freedesktop.org/show_bug.cgi?id=103232
  [fdo#103540]: https://bugs.freedesktop.org/show_bug.cgi?id=103540
  [fdo#103665]: https://bugs.freedesktop.org/show_bug.cgi?id=103665
  [fdo#103927]: https://bugs.freedesktop.org/show_bug.cgi?id=103927
  [fdo#104873]: https://bugs.freedesktop.org/show_bug.cgi?id=104873
  [fdo#107713]: https://bugs.freedesktop.org/show_bug.cgi?id=107713
  [fdo#108566]: https://bugs.freedesktop.org/show_bug.cgi?id=108566
  [fdo#108686]: https://bugs.freedesktop.org/show_bug.cgi?id=108686
  [fdo#109271]: https://bugs.freedesktop.org/show_bug.cgi?id=109271
  [fdo#109276]: https://bugs.freedesktop.org/show_bug.cgi?id=109276
  [fdo#109441]: https://bugs.freedesktop.org/show_bug.cgi?id=109441
  [fdo#109642]: https://bugs.freedesktop.org/show_bug.cgi?id=109642
  [fdo#109661]: https://bugs.freedesktop.org/show_bug.cgi?id=109661
  [fdo#110548]: https://bugs.freedesktop.org/show_bug.cgi?id=110548
  [fdo#110841]: https://bugs.freedesktop.org/show_bug.cgi?id=110841
  [fdo#111068]: https://bugs.freedesktop.org/show_bug.cgi?id=111068
  [fdo#111329]: https://bugs.freedesktop.org/show_bug.cgi?id=111329
  [fdo#111330]: https://bugs.freedesktop.org/show_bug.cgi?id=111330
  [fdo#111593]: https://bugs.freedesktop.org/show_bug.cgi?id=111593
  [fdo#111606]: https://bugs.freedesktop.org/show_bug.cgi?id=111606
  [fdo#111646]: https://bugs.freedesktop.org/show_bug.cgi?id=111646
  [fdo#111671]: https://bugs.freedesktop.org/show_bug.cgi?id=111671
  [fdo#111677]: https://bugs.freedesktop.org/show_bug.cgi?id=111677
  [fdo#111703]: https://bugs.freedesktop.org/show_bug.cgi?id=111703
  [fdo#111735]: https://bugs.freedesktop.org/show_bug.cgi?id=111735
  [fdo#111764]: https://bugs.freedesktop.org/show_bug.cgi?id=111764
  [fdo#111832]: https://bugs.freedesktop.org/show_bug.cgi?id=111832
  [fdo#111850]: https://bugs.freedesktop.org/show_bug.cgi?id=111850
  [fdo#111870]: https://bugs.freedesktop.org/show_bug.cgi?id=111870
  [fdo#112037]: https://bugs.freedesktop.org/show_bug.cgi?id=112037
  [fdo#112080]: https://bugs.freedesktop.org/show_bug.cgi?id=112080
  [fdo#112146]: https://bugs.freedesktop.org/show_bug.cgi?id=112146
  [fdo#99912]: https://bugs.freedesktop.org/show_bug.cgi?id=99912


Participating hosts (8 -> 8)
------------------------------

  No changes in participating hosts


Build changes
-------------

  * CI: CI-20190529 -> None
  * IGT: IGT_5247 -> IGTPW_3622

  CI-20190529: 20190529
  CI_DRM_7196: 54520983c610850dc9034dfdfeec2a0492949d8f @ git://anongit.freedesktop.org/gfx-ci/linux
  IGTPW_3622: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/index.html
  IGT_5247: 4d1f6036dfceeee64f92c02475f9ae2cc8ffcc1b @ git://anongit.freedesktop.org/xorg/app/intel-gpu-tools

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3622/index.html
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev

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

* [igt-dev] [PATCH i-g-t] lib/igt_list: Update, clean-up and document igt_list
@ 2019-09-17  9:54 Arkadiusz Hiler
  0 siblings, 0 replies; 9+ messages in thread
From: Arkadiusz Hiler @ 2019-09-17  9:54 UTC (permalink / raw)
  To: igt-dev; +Cc: Petri Latvala

We have diverged from how Wayland implements list both in parameter
ordering and function naming.

Let's make our side consistent to ease the cognitive dissonance for
developers working on both projects.

This patch:
 * mimics the current Wayland implementation
 * separates IGT helpers in the source files
 * adds brief explanation and code example for igt-doc
 * introduces igt_list.c as static inlines are not visible in the docs

Cc: Petri Latvala <petri.latvala@intel.com>
Signed-off-by: Arkadiusz Hiler <arkadiusz.hiler@intel.com>
---
 benchmarks/gem_wsim.c                         |   6 +-
 .../igt-gpu-tools/igt-gpu-tools-docs.xml      |   1 +
 lib/Makefile.sources                          |   2 +
 lib/igt_chamelium.c                           |   2 +-
 lib/igt_core.c                                |   4 +-
 lib/igt_dummyload.c                           |   4 +-
 lib/igt_kmod.c                                |   2 +-
 lib/igt_list.c                                |  66 +++++++
 lib/igt_list.h                                | 165 +++++++++---------
 lib/meson.build                               |   1 +
 tests/vc4_purgeable_bo.c                      |   6 +-
 11 files changed, 163 insertions(+), 96 deletions(-)
 create mode 100644 lib/igt_list.c

diff --git a/benchmarks/gem_wsim.c b/benchmarks/gem_wsim.c
index 87f873b0..44745d06 100644
--- a/benchmarks/gem_wsim.c
+++ b/benchmarks/gem_wsim.c
@@ -2814,11 +2814,11 @@ static void *run_workload(void *data)
 			do_eb(wrk, w, engine, wrk->flags);
 
 			if (w->request != -1) {
-				igt_list_del(&w->rq_link);
+				igt_list_remove(&w->rq_link);
 				wrk->nrequest[w->request]--;
 			}
 			w->request = engine;
-			igt_list_add_tail(&w->rq_link, &wrk->requests[engine]);
+			igt_list_insert_tail(&wrk->requests[engine], &w->rq_link);
 			wrk->nrequest[engine]++;
 
 			if (!wrk->run)
@@ -2840,7 +2840,7 @@ static void *run_workload(void *data)
 					last_sync = true;
 
 					s->request = -1;
-					igt_list_del(&s->rq_link);
+					igt_list_remove(&s->rq_link);
 					wrk->nrequest[engine]--;
 				}
 			}
diff --git a/docs/reference/igt-gpu-tools/igt-gpu-tools-docs.xml b/docs/reference/igt-gpu-tools/igt-gpu-tools-docs.xml
index ac83272f..3f14d7be 100644
--- a/docs/reference/igt-gpu-tools/igt-gpu-tools-docs.xml
+++ b/docs/reference/igt-gpu-tools/igt-gpu-tools-docs.xml
@@ -31,6 +31,7 @@
     <xi:include href="xml/igt_gvt.xml"/>
     <xi:include href="xml/igt_kmod.xml"/>
     <xi:include href="xml/igt_kms.xml"/>
+    <xi:include href="xml/igt_list.xml"/>
     <xi:include href="xml/igt_pm.xml"/>
     <xi:include href="xml/igt_primes.xml"/>
     <xi:include href="xml/igt_rand.xml"/>
diff --git a/lib/Makefile.sources b/lib/Makefile.sources
index cf094ab8..4a7c54cd 100644
--- a/lib/Makefile.sources
+++ b/lib/Makefile.sources
@@ -43,6 +43,8 @@ lib_source_list =	 	\
 	igt_halffloat.h		\
 	igt_infoframe.c		\
 	igt_infoframe.h		\
+	igt_list.c		\
+	igt_list.h		\
 	igt_matrix.c		\
 	igt_matrix.h		\
 	igt_primes.c		\
diff --git a/lib/igt_chamelium.c b/lib/igt_chamelium.c
index 1b03a103..7de8ab07 100644
--- a/lib/igt_chamelium.c
+++ b/lib/igt_chamelium.c
@@ -597,7 +597,7 @@ struct chamelium_edid *chamelium_new_edid(struct chamelium *chamelium,
 	chamelium_edid->chamelium = chamelium;
 	chamelium_edid->base = malloc(edid_size);
 	memcpy(chamelium_edid->base, edid, edid_size);
-	igt_list_add(&chamelium_edid->link, &chamelium->edids);
+	igt_list_insert(&chamelium->edids, &chamelium_edid->link);
 
 	return chamelium_edid;
 }
diff --git a/lib/igt_core.c b/lib/igt_core.c
index 1cbb09f9..d5dca618 100644
--- a/lib/igt_core.c
+++ b/lib/igt_core.c
@@ -1138,7 +1138,7 @@ void __igt_subtest_group_save(int *save, int *desc)
 	if (__current_description[0] != '\0') {
 		struct description_node *new = calloc(1, sizeof(*new));
 		memcpy(new->desc, __current_description, sizeof(__current_description));
-		igt_list_add_tail(&new->link, &subgroup_descriptions);
+		igt_list_insert_tail(&subgroup_descriptions, &new->link);
 		_clear_current_description();
 		*desc = true;
 	}
@@ -1151,7 +1151,7 @@ void __igt_subtest_group_restore(int save, int desc)
 	if (desc) {
 		struct description_node *last =
 			igt_list_last_entry(&subgroup_descriptions, last, link);
-		igt_list_del(&last->link);
+		igt_list_remove(&last->link);
 		free(last);
 	}
 
diff --git a/lib/igt_dummyload.c b/lib/igt_dummyload.c
index 0e06276a..ec0ab969 100644
--- a/lib/igt_dummyload.c
+++ b/lib/igt_dummyload.c
@@ -284,7 +284,7 @@ spin_create(int fd, const struct igt_spin_factory *opts)
 	spin->out_fence = emit_recursive_batch(spin, fd, opts);
 
 	pthread_mutex_lock(&list_lock);
-	igt_list_add(&spin->link, &spin_list);
+	igt_list_insert(&spin_list, &spin->link);
 	pthread_mutex_unlock(&list_lock);
 
 	return spin;
@@ -430,7 +430,7 @@ void igt_spin_free(int fd, igt_spin_t *spin)
 		return;
 
 	pthread_mutex_lock(&list_lock);
-	igt_list_del(&spin->link);
+	igt_list_remove(&spin->link);
 	pthread_mutex_unlock(&list_lock);
 
 	if (spin->timer)
diff --git a/lib/igt_kmod.c b/lib/igt_kmod.c
index 91662eb3..8f66d1dd 100644
--- a/lib/igt_kmod.c
+++ b/lib/igt_kmod.c
@@ -404,7 +404,7 @@ static void tests_add(struct igt_kselftest_list *tl, struct igt_list *list)
 		if (pos->number > tl->number)
 			break;
 
-	igt_list_add_tail(&tl->link, &pos->link);
+	igt_list_insert_tail(&pos->link, &tl->link);
 }
 
 void igt_kselftest_get_tests(struct kmod_module *kmod,
diff --git a/lib/igt_list.c b/lib/igt_list.c
new file mode 100644
index 00000000..af615124
--- /dev/null
+++ b/lib/igt_list.c
@@ -0,0 +1,66 @@
+/*
+ * Copyright © 2019 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.
+ *
+ */
+
+#include "igt_list.h"
+
+void igt_list_init(struct igt_list *list)
+{
+	list->prev = list;
+	list->next = list;
+}
+
+void igt_list_insert(struct igt_list *list, struct igt_list *elm)
+{
+	elm->prev = list;
+	elm->next = list->next;
+	list->next = elm;
+	elm->next->prev = elm;
+}
+
+
+void igt_list_remove(struct igt_list *elm)
+{
+	elm->prev->next = elm->next;
+	elm->next->prev = elm->prev;
+	elm->next = NULL;
+	elm->prev = NULL;
+}
+
+int igt_list_length(const struct igt_list *list)
+{
+	struct  igt_list *e = list->next;
+	int count = 0;
+
+	while (e != list) {
+		e = e->next;
+		count++;
+	}
+
+	return count;
+}
+
+bool igt_list_empty(const struct igt_list *list)
+{
+	return list->next == list;
+}
diff --git a/lib/igt_list.h b/lib/igt_list.h
index cadf9dd3..c73a98f1 100644
--- a/lib/igt_list.h
+++ b/lib/igt_list.h
@@ -28,9 +28,42 @@
 #include <stdbool.h>
 #include <stddef.h>
 
-/*
- * This list data structure is a verbatim copy from wayland-util.h from the
- * Wayland project; except that wl_ prefix has been removed.
+/**
+ * SECTION:igt_list
+ * @short_description: a list implementation borrowed from the Wayland project
+ * @title: IGT List
+ * @include: igt_list.h
+ *
+ * This list data structure mimics the one from wayland-util.h from the Wayland
+ * project. A few bonus helpers are provided.
+ *
+ * igt_list is a doubly-linked list where an instance of igt_list is a head
+ * sentinel and has to be initalized. See Wayland documentation for more
+ * details.
+ *
+ * Example usage:
+ *
+ * |[<!-- language="C" -->
+ * struct igt_list foo_list;
+ *
+ * struct element {
+ *         int foo;
+ *         struct igt_list link;
+ * };
+ *
+ * struct element e1, e2, e3;
+ *
+ * igt_list_init(&foo_list);
+ * igt_list_insert(&foo_list, &e1.link);   // e1 is the first element
+ * igt_list_insert(&foo_list, &e2.link);   // e2 is now the first element
+ * igt_list_insert(&e2.link, &e3.link);    // insert e3 after e2
+ *
+ * struct igt_spin *iter;
+ * igt_list_for_each(iter, &foo_list, link) {
+ * 	printf("%d\n", iter->foo);
+ * }
+ * ]|
+ *
  */
 
 struct igt_list {
@@ -38,92 +71,56 @@ struct igt_list {
 	struct igt_list *next;
 };
 
-#define __IGT_INIT_LIST(name) { &(name), &(name) }
-#define IGT_LIST(name) struct igt_list name = __IGT_INIT_LIST(name)
-
-static inline void igt_list_init(struct igt_list *list)
-{
-	list->prev = list;
-	list->next = list;
-}
-
-static inline void __igt_list_add(struct igt_list *list,
-				  struct igt_list *prev,
-				  struct igt_list *next)
-{
-	next->prev = list;
-	list->next = next;
-	list->prev = prev;
-	prev->next = list;
-}
-
-static inline void igt_list_add(struct igt_list *elm, struct igt_list *list)
-{
-	__igt_list_add(elm, list, list->next);
-}
-
-static inline void igt_list_add_tail(struct igt_list *elm,
-				     struct igt_list *list)
-{
-	__igt_list_add(elm, list->prev, list);
-}
-
-static inline void __igt_list_del(struct igt_list *prev, struct igt_list *next)
-{
-	next->prev = prev;
-	prev->next = next;
-}
-
-static inline void igt_list_del(struct igt_list *elm)
-{
-	__igt_list_del(elm->prev, elm->next);
-}
-
-static inline void igt_list_move(struct igt_list *elm, struct igt_list *list)
-{
-	igt_list_del(elm);
-	igt_list_add(elm, list);
-}
-
-static inline void igt_list_move_tail(struct igt_list *elm,
-				      struct igt_list *list)
-{
-	igt_list_del(elm);
-	igt_list_add_tail(elm, list);
-}
-
-static inline bool igt_list_empty(const struct igt_list *list)
-{
-	return list->next == list;
-}
-
-#define container_of(ptr, sample, member)				\
-	(typeof(sample))((char *)(ptr) - offsetof(typeof(*sample), member))
-
-#define igt_list_first_entry(head, pos, member) \
-	container_of((head)->next, (pos), member)
-#define igt_list_last_entry(head, pos, member) \
-	container_of((head)->prev, (pos), member)
-
-#define igt_list_next_entry(pos, member) \
-	container_of((pos)->member.next, (pos), member)
-#define igt_list_prev_entry(pos, member) \
-	container_of((pos)->member.prev, (pos), member)
+void igt_list_init(struct igt_list *list);
+void igt_list_insert(struct igt_list *list, struct igt_list *elm);
+void igt_list_remove(struct igt_list *elm);
+int igt_list_length(const struct igt_list *list);
+bool igt_list_empty(const struct igt_list *list);
+
+#define igt_container_of(ptr, sample, member)				\
+	(__typeof__(sample))((char *)(ptr) -				\
+				offsetof(__typeof__(*sample), member))
 
 #define igt_list_for_each(pos, head, member)				\
-	for (pos = igt_list_first_entry(head, pos, member);		\
+	for (pos = igt_container_of((head)->next, pos, member);		\
 	     &pos->member != (head);					\
-	     pos = igt_list_next_entry(pos, member))
-
-#define igt_list_for_each_reverse(pos, head, member)			\
-	for (pos = igt_list_last_entry(head, pos, member);		\
-	     &pos->member != (head);					\
-	     pos = igt_list_prev_entry(pos, member))
+	     pos = igt_container_of((pos)->member.next, pos, member))
 
+/**
+ * igt_list_for_each_safe
+ *
+ * Safe against removel of the *current* list element. To achive this it
+ * requires an extra helper variable `tmp` with the same type as `pos`.
+ */
 #define igt_list_for_each_safe(pos, tmp, head, member)			\
-	for (pos = igt_list_first_entry(head, pos, member),		\
-	     tmp = igt_list_next_entry(pos, member);			\
+	for (pos = igt_container_of((head)->next, pos, member),		\
+	     tmp = igt_container_of((pos)->member.next, tmp, member); 	\
 	     &pos->member != (head);					\
-	     pos = tmp, tmp = igt_list_next_entry(pos, member))
+	     pos = tmp,							\
+	     tmp = igt_container_of((pos)->member.next, tmp, member))
+
+#define igt_list_for_each_reverse(pos, head, member)			\
+	for (pos = igt_container_of((head)->prev, pos, member);		\
+	     &pos->member != (head);					\
+	     pos = igt_container_of((pos)->member.prev, pos, member))
+
+
+/* IGT custom helpers */
+
+/**
+ * IGT_LIST
+ *
+ * Instead of having to use `igt_list_init()` list can be defined using
+ * this helper, e.g. `static IGT_LIST(list);`
+ */
+#define IGT_LIST(name) struct igt_list name = { &(name), &(name) }
+
+#define igt_list_insert_tail(list, elem) igt_list_insert((list)->prev, elem)
+
+#define igt_list_first_entry(head, pos, member) \
+	igt_container_of((head)->next, (pos), member)
+
+#define igt_list_last_entry(head, pos, member) \
+	igt_container_of((head)->prev, (pos), member)
 
 #endif /* IGT_LIST_H */
diff --git a/lib/meson.build b/lib/meson.build
index 221ae28c..26d5db6f 100644
--- a/lib/meson.build
+++ b/lib/meson.build
@@ -50,6 +50,7 @@ lib_sources = [
 	'igt_fb.c',
 	'igt_core.c',
 	'igt_draw.c',
+	'igt_list.c',
 	'igt_pm.c',
 	'igt_dummyload.c',
 	'uwildmat/uwildmat.c',
diff --git a/tests/vc4_purgeable_bo.c b/tests/vc4_purgeable_bo.c
index cfe14e70..030b1d1b 100644
--- a/tests/vc4_purgeable_bo.c
+++ b/tests/vc4_purgeable_bo.c
@@ -67,7 +67,7 @@ static void igt_vc4_alloc_mmap_max_bo(int fd, struct igt_list *list,
 		bo->size = create.size;
 		bo->map = igt_vc4_mmap_bo(fd, bo->handle, bo->size,
 					  PROT_READ | PROT_WRITE);
-		igt_list_add_tail(&bo->node, list);
+		igt_list_insert_tail(list, &bo->node);
 	}
 }
 
@@ -78,7 +78,7 @@ static void igt_vc4_unmap_free_bo_pool(int fd, struct igt_list *list)
 	while (!igt_list_empty(list)) {
 		bo = igt_list_first_entry(list, bo, node);
 		igt_assert(bo);
-		igt_list_del(&bo->node);
+		igt_list_remove(&bo->node);
 		munmap(bo->map, bo->size);
 		gem_close(fd, bo->handle);
 		free(bo);
@@ -253,7 +253,7 @@ igt_main
 		/* Trigger a purge. */
 		igt_vc4_trigger_purge(fd);
 
-		igt_list_del(&bo->node);
+		igt_list_remove(&bo->node);
 		munmap(bo->map, bo->size);
 		gem_close(fd, bo->handle);
 		free(bo);
-- 
2.21.0

_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev

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

end of thread, other threads:[~2019-10-29  4:05 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-10-24 12:31 [igt-dev] [PATCH i-g-t] lib/igt_list: Update, clean-up and document igt_list Arkadiusz Hiler
2019-10-24 14:47 ` [igt-dev] ✓ Fi.CI.BAT: success for lib/igt_list: Update, clean-up and document igt_list (rev2) Patchwork
2019-10-25  8:27 ` [igt-dev] [PATCH i-g-t] lib/igt_list: Update, clean-up and document igt_list Chris Wilson
2019-10-25 11:22 ` Petri Latvala
2019-10-25 20:10 ` [igt-dev] ✗ Fi.CI.IGT: failure for lib/igt_list: Update, clean-up and document igt_list (rev2) Patchwork
2019-10-28  9:12 ` [igt-dev] ✗ Fi.CI.BAT: failure for lib/igt_list: Update, clean-up and document igt_list (rev3) Patchwork
2019-10-28 10:25 ` [igt-dev] ✓ Fi.CI.BAT: success " Patchwork
2019-10-29  4:05 ` [igt-dev] ✓ Fi.CI.IGT: " Patchwork
  -- strict thread matches above, loose matches on Subject: below --
2019-09-17  9:54 [igt-dev] [PATCH i-g-t] lib/igt_list: Update, clean-up and document igt_list Arkadiusz Hiler

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.