From b21d2eb5c48761a54e6868ed114aa256aee1c2cd Mon Sep 17 00:00:00 2001 From: Olivier Dion Date: Fri, 14 Jul 2023 13:25:56 -0400 Subject: [PATCH] tests/rcutorture: Factor out thread registration Register the thread once at the begining of the update routine. Put the thread offline when doing anything that can block. Change-Id: I345e04ee2ef0b5ba2f065b8a3029dd0e6130037b Signed-off-by: Olivier Dion Signed-off-by: Mathieu Desnoyers --- tests/regression/rcutorture.h | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/tests/regression/rcutorture.h b/tests/regression/rcutorture.h index b3a300c..e20d82e 100644 --- a/tests/regression/rcutorture.h +++ b/tests/regression/rcutorture.h @@ -391,8 +391,14 @@ void *rcu_update_stress_test(void *arg __attribute__((unused))) struct rcu_head rh; enum writer_state writer_state = WRITER_STATE_SYNC_RCU; + rcu_register_thread(); + + /* Offline for poll. */ + put_thread_offline(); while (goflag == GOFLAG_INIT) (void) poll(NULL, 0, 1); + put_thread_online(); + while (goflag == GOFLAG_RUN) { i = rcu_stress_idx + 1; if (i >= RCU_STRESS_PIPE_LEN) @@ -422,9 +428,8 @@ void *rcu_update_stress_test(void *arg __attribute__((unused))) strerror(errno)); abort(); } - rcu_register_thread(); call_rcu(&rh, rcu_update_stress_test_rcu); - rcu_unregister_thread(); + /* * Our MacOS X test machine with the following * config: @@ -440,10 +445,13 @@ void *rcu_update_stress_test(void *arg __attribute__((unused))) * us to be registered RCU readers). */ call_rcu_wait = true; + /* Offline for pthread_cond_wait. */ + put_thread_offline(); do { ret = pthread_cond_wait(&call_rcu_test_cond, &call_rcu_test_mutex); } while (call_rcu_wait); + put_thread_online(); if (ret) { errno = ret; diag("pthread_cond_signal: %s", @@ -463,11 +471,13 @@ void *rcu_update_stress_test(void *arg __attribute__((unused))) { struct urcu_gp_poll_state poll_state; - rcu_register_thread(); poll_state = start_poll_synchronize_rcu(); - rcu_unregister_thread(); + + /* Offline for poll. */ + put_thread_offline(); while (!poll_state_synchronize_rcu(poll_state)) (void) poll(NULL, 0, 1); /* Wait for 1ms */ + put_thread_online(); break; } } @@ -475,6 +485,8 @@ void *rcu_update_stress_test(void *arg __attribute__((unused))) advance_writer_state(&writer_state); } + rcu_unregister_thread(); + return NULL; } -- 2.34.1