[igt-dev] [PATCH i-g-t v2] lib/igt_core: Reinitialize print mutex in child process

Zbigniew Kempczyński zbigniew.kempczynski at intel.com
Tue Sep 29 13:38:33 UTC 2020


IGT are prone to deadlock in igt_log() in following scenario:

1. Parent process creates additional thread which for example
   is doing endless loop.
2. Thread sometimes is logging to console using igt_info().
   This locks and unlocks print_mutex.
3. If in the meantime parent process will spawn child process
   it can be created having print_mutex locked (thread entered
   igt_vlog() function and entered critical section). When child
   will try to log it will deadlock.

We should reinitialize print_mutex in child process to avoid
use inherited value.

Signed-off-by: Zbigniew Kempczyński <zbigniew.kempczynski at intel.com>
Cc: Petri Latvala <petri.latvala at intel.com>
---
 lib/igt_core.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/lib/igt_core.c b/lib/igt_core.c
index cedd8168..b358173f 100644
--- a/lib/igt_core.c
+++ b/lib/igt_core.c
@@ -2271,6 +2271,8 @@ static void children_exit_handler(int sig)
 		;
 }
 
+static pthread_mutex_t print_mutex = PTHREAD_MUTEX_INITIALIZER;
+
 bool __igt_fork(void)
 {
 	internal_assert(!test_with_subtests || in_subtest,
@@ -2300,6 +2302,7 @@ bool __igt_fork(void)
 		igt_assert(0);
 	case 0:
 		test_child = true;
+		pthread_mutex_init(&print_mutex, NULL);
 		exit_handler_count = 0;
 		reset_helper_process_list();
 		oom_adjust_for_doom();
@@ -2737,8 +2740,6 @@ void igt_vlog(const char *domain, enum igt_log_level level, const char *format,
 		"NONE"
 	};
 
-	static pthread_mutex_t print_mutex = PTHREAD_MUTEX_INITIALIZER;
-
 	assert(format);
 
 #ifdef __GLIBC__
-- 
2.26.0



More information about the igt-dev mailing list