[PATCH i-g-t 3/3] tests/xe_intel_bb: check multithreading rescans won't segfault

Lucas De Marchi lucas.demarchi at intel.com
Thu Jan 23 17:34:36 UTC 2025


On Thu, Jan 23, 2025 at 10:22:10AM +0100, Zbigniew Kempczyński wrote:
>This test is likely only for checking purposes, it doesn't makes
>sense to merge it after series review.
>
>Signed-off-by: Zbigniew Kempczyński <zbigniew.kempczynski at intel.com>
>Cc: Lucas De Marchi <lucas.demarchi at intel.com>
>Cc: Kamil Konieczny <kamil.konieczny at linux.intel.com>
>---
> tests/intel-ci/xe-fast-feedback.testlist |  1 +
> tests/intel/xe_intel_bb.c                | 47 ++++++++++++++++++++++++
> 2 files changed, 48 insertions(+)
>
>diff --git a/tests/intel-ci/xe-fast-feedback.testlist b/tests/intel-ci/xe-fast-feedback.testlist
>index 0234d3e72d..7adb9a3436 100644
>--- a/tests/intel-ci/xe-fast-feedback.testlist
>+++ b/tests/intel-ci/xe-fast-feedback.testlist
>@@ -7,6 +7,7 @@ igt at fbdev@nullptr
> igt at fbdev@read
> igt at fbdev@write
>
>+igt at xe_intel_bb@multithread-open
> igt at kms_addfb_basic@addfb25-4-tiled
> igt at kms_addfb_basic@addfb25-bad-modifier
> igt at kms_addfb_basic@addfb25-modifier-no-flag
>diff --git a/tests/intel/xe_intel_bb.c b/tests/intel/xe_intel_bb.c
>index 845052bf26..5df009f9ed 100644
>--- a/tests/intel/xe_intel_bb.c
>+++ b/tests/intel/xe_intel_bb.c
>@@ -18,6 +18,7 @@
>
> #include "igt.h"
> #include "igt_crc.h"
>+#include "igt_device_scan.h"
> #include "intel_blt.h"
> #include "intel_bufops.h"
> #include "intel_mocs.h"
>@@ -950,6 +951,49 @@ static int render(struct buf_ops *bops, uint32_t tiling,
> 	return fails;
> }
>
>+/**
>+ * SUBTEST: multithread-open
>+ * Description: check device scanning when multiple threads are involved
>+ */
>+static void *__single_open(void *data)
>+{
>+	struct igt_device_card card;
>+	int fd;
>+
>+	igt_info("Thread: %d\n", (int)to_user_pointer(data));
>+
>+	for (int i = 0; i < 5; i++)
>+		igt_devices_scan();
>+
>+	igt_assert_eq(igt_device_card_match("pci:vendor=intel", &card), true);
>+	igt_info("Device detail: %s, %s, %s\n", card.subsystem, card.card, card.render);
>+
>+	fd = igt_open_card(&card);

can you point what test needs this? In this scenario, don't we usually
use igt_fork() for the tests?

Lucas De Marchi

>+	igt_info("Fd: %d\n", fd);
>+	igt_assert(fd >= 0);
>+	close(fd);
>+
>+	return NULL;
>+}
>+
>+#define NUM_THREADS 100
>+static void multithread_open(void)
>+{
>+	pthread_t pth[NUM_THREADS];
>+	int i, ret;
>+
>+	for (i = 0; i < NUM_THREADS; i++) {
>+		ret = pthread_create(&pth[i], NULL, __single_open,
>+				     from_user_pointer(i));
>+		igt_assert_eq(ret, 0);
>+	}
>+
>+	for (i = 0; i < NUM_THREADS; i++) {
>+		ret = pthread_join(pth[i], NULL);
>+		igt_assert_eq(ret, 0);
>+	}
>+}
>+
> static int opt_handler(int opt, int opt_index, void *data)
> {
> 	switch (opt) {
>@@ -1063,6 +1107,9 @@ igt_main_args("dpib", NULL, help_str, opt_handler, NULL)
> 		}
> 	}
>
>+	igt_subtest("multithread-open")
>+		multithread_open();
>+
> 	igt_fixture {
> 		buf_ops_destroy(bops);
> 		drm_close_driver(xe);
>-- 
>2.34.1
>


More information about the igt-dev mailing list