[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v2 04/19] tests/rcutorture: mild documenting refactor of update t
From: |
Alex Bennée |
Subject: |
[PATCH v2 04/19] tests/rcutorture: mild documenting refactor of update thread |
Date: |
Thu, 13 Feb 2020 22:50:54 +0000 |
This is mainly to help with reasoning what the test is trying to do.
We can move rcu_stress_idx to a local variable as there is only ever
one updater thread. I've also added an assert to catch the case where
we end up updating the current structure to itself which is the only
way I can see the mberror cases we are seeing on Travis.
We shall see if the rcutorture test failures go away now.
Signed-off-by: Alex Bennée <address@hidden>
---
tests/rcutorture.c | 36 +++++++++++++++++++++++++++---------
1 file changed, 27 insertions(+), 9 deletions(-)
diff --git a/tests/rcutorture.c b/tests/rcutorture.c
index 256d24ed5ba..9559f13cd1f 100644
--- a/tests/rcutorture.c
+++ b/tests/rcutorture.c
@@ -236,7 +236,6 @@ struct rcu_stress {
struct rcu_stress rcu_stress_array[RCU_STRESS_PIPE_LEN] = { { 0 } };
struct rcu_stress *rcu_stress_current;
-int rcu_stress_idx;
int n_mberror;
/* Updates protected by counts_mutex */
@@ -288,29 +287,48 @@ static void *rcu_read_stress_test(void *arg)
return NULL;
}
+/*
+ * Stress Test Updater
+ *
+ * The updater cycles around updating rcu_stress_current to point at
+ * one of the rcu_stress_array_entries and resets it's pipe_count. It
+ * then increments pipe_count of all the other entries. The pipe_count
+ * will be read under an rcu_read_lock() and distribution of values
+ * calculated. The final result gives an indication of how many
+ * previously current rcu_stress entries are in flight until the RCU
+ * cycle complete.
+ */
static void *rcu_update_stress_test(void *arg)
{
- int i;
- struct rcu_stress *p;
+ int i, rcu_stress_idx = 0;
+ struct rcu_stress *cp = atomic_read(&rcu_stress_current);
rcu_register_thread();
-
*(struct rcu_reader_data **)arg = &rcu_reader;
+
while (goflag == GOFLAG_INIT) {
g_usleep(1000);
}
+
while (goflag == GOFLAG_RUN) {
- i = rcu_stress_idx + 1;
- if (i >= RCU_STRESS_PIPE_LEN) {
- i = 0;
+ struct rcu_stress *p;
+ rcu_stress_idx++;
+ if (rcu_stress_idx >= RCU_STRESS_PIPE_LEN) {
+ rcu_stress_idx = 0;
}
- p = &rcu_stress_array[i];
+ p = &rcu_stress_array[rcu_stress_idx];
+ /* catching up with ourselves would be a bug */
+ assert(p != cp);
p->mbtest = 0;
smp_mb();
p->pipe_count = 0;
p->mbtest = 1;
atomic_rcu_set(&rcu_stress_current, p);
- rcu_stress_idx = i;
+ cp = p;
+ /*
+ * New RCU structure is now live, update pipe counts on old
+ * ones.
+ */
for (i = 0; i < RCU_STRESS_PIPE_LEN; i++) {
if (i != rcu_stress_idx) {
rcu_stress_array[i].pipe_count++;
--
2.20.1
- [PATCH v2 00/19] testing and plugin updates, Alex Bennée, 2020/02/13
- [PATCH v2 01/19] tests/tcg: include a skip runner for pauth3 with plugins, Alex Bennée, 2020/02/13
- [PATCH v2 02/19] tests/rcutorture: update usage hint, Alex Bennée, 2020/02/13
- [PATCH v2 03/19] tests/rcutorture: better document locking of stats, Alex Bennée, 2020/02/13
- [PATCH v2 05/19] travis.yml: Test the s390-ccw build, too, Alex Bennée, 2020/02/13
- [PATCH v2 06/19] travis.yml: Fix Travis YAML configuration warnings, Alex Bennée, 2020/02/13
- [PATCH v2 04/19] tests/rcutorture: mild documenting refactor of update thread,
Alex Bennée <=
- [PATCH v2 07/19] travis.yml: single-thread build-tcg stages, Alex Bennée, 2020/02/13
- [PATCH v2 08/19] tests/iotests: be a little more forgiving on the size test, Alex Bennée, 2020/02/13
- [PATCH v2 13/19] qemu/bitops.h: Add extract8 and extract16, Alex Bennée, 2020/02/13
- [PATCH v2 10/19] docs/devel: document query handle lifetimes, Alex Bennée, 2020/02/13
- [PATCH v2 11/19] plugins/core: add missing break in cb_to_tcg_flags, Alex Bennée, 2020/02/13
- [PATCH v2 09/19] tracing: only allow -trace to override -D if set, Alex Bennée, 2020/02/13