From: "Alex Bennée" <alex.bennee@linaro.org>
To: qemu-devel@nongnu.org
Cc: fam@euphon.net, berrange@redhat.com, robert.foley@linaro.org,
pbonzini@redhat.com, stefanb@linux.vnet.ibm.com,
"Alex Bennée" <alex.bennee@linaro.org>,
richard.henderson@linaro.org, f4bug@amsat.org,
robhenry@microsoft.com, marcandre.lureau@redhat.com,
aaron@os.amperecomputing.com, cota@braap.org,
stefanha@redhat.com, kuhn.chenqun@huawei.com,
peter.puhov@linaro.org, aurelien@aurel32.net
Subject: [PATCH v3 04/19] tests/rcutorture: mild documenting refactor of update thread
Date: Tue, 25 Feb 2020 12:46:55 +0000 [thread overview]
Message-ID: <20200225124710.14152-5-alex.bennee@linaro.org> (raw)
In-Reply-To: <20200225124710.14152-1-alex.bennee@linaro.org>
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 <alex.bennee@linaro.org>
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
---
v3
- explicit atomic_read/set
- rename pipe_count to age
- fix whitespace
---
tests/rcutorture.c | 55 +++++++++++++++++++++++++++++++---------------
1 file changed, 37 insertions(+), 18 deletions(-)
diff --git a/tests/rcutorture.c b/tests/rcutorture.c
index 256d24ed5ba..732f03abdaa 100644
--- a/tests/rcutorture.c
+++ b/tests/rcutorture.c
@@ -230,13 +230,12 @@ static void uperftest(int nupdaters, int duration)
#define RCU_STRESS_PIPE_LEN 10
struct rcu_stress {
- int pipe_count;
+ int age; /* how many update cycles while not rcu_stress_current */
int mbtest;
};
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 */
@@ -261,7 +260,7 @@ static void *rcu_read_stress_test(void *arg)
while (goflag == GOFLAG_RUN) {
rcu_read_lock();
p = atomic_rcu_read(&rcu_stress_current);
- if (p->mbtest == 0) {
+ if (atomic_read(&p->mbtest) == 0) {
n_mberror++;
}
rcu_read_lock();
@@ -269,7 +268,7 @@ static void *rcu_read_stress_test(void *arg)
garbage++;
}
rcu_read_unlock();
- pc = p->pipe_count;
+ pc = atomic_read(&p->age);
rcu_read_unlock();
if ((pc > RCU_STRESS_PIPE_LEN) || (pc < 0)) {
pc = RCU_STRESS_PIPE_LEN;
@@ -288,32 +287,52 @@ 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 age. It
+ * then increments the age of all the other entries. The age
+ * 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->mbtest = 0;
+ p = &rcu_stress_array[rcu_stress_idx];
+ /* catching up with ourselves would be a bug */
+ assert(p != cp);
+ atomic_set(&p->mbtest, 0);
smp_mb();
- p->pipe_count = 0;
- p->mbtest = 1;
+ atomic_set(&p->age, 0);
+ atomic_set(&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++;
+ atomic_set(&rcu_stress_array[i].age,
+ rcu_stress_array[i].age + 1);
}
}
synchronize_rcu();
@@ -346,7 +365,7 @@ static void stresstest(int nreaders, int duration)
int i;
rcu_stress_current = &rcu_stress_array[0];
- rcu_stress_current->pipe_count = 0;
+ rcu_stress_current->age = 0;
rcu_stress_current->mbtest = 1;
for (i = 0; i < nreaders; i++) {
create_thread(rcu_read_stress_test);
@@ -376,7 +395,7 @@ static void gtest_stress(int nreaders, int duration)
int i;
rcu_stress_current = &rcu_stress_array[0];
- rcu_stress_current->pipe_count = 0;
+ rcu_stress_current->age = 0;
rcu_stress_current->mbtest = 1;
for (i = 0; i < nreaders; i++) {
create_thread(rcu_read_stress_test);
--
2.20.1
next prev parent reply other threads:[~2020-02-25 13:12 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-02-25 12:46 [PATCH v3 00/19] testing & plugin updates Alex Bennée
2020-02-25 12:46 ` [PATCH v3 01/19] tests/tcg: include a skip runner for pauth3 with plugins Alex Bennée
2020-02-25 12:46 ` [PATCH v3 02/19] tests/rcutorture: update usage hint Alex Bennée
2020-02-25 12:46 ` [PATCH v3 03/19] tests/rcutorture: better document locking of stats Alex Bennée
2020-02-25 12:46 ` Alex Bennée [this message]
2020-02-25 12:46 ` [PATCH v3 05/19] travis.yml: Test the s390-ccw build, too Alex Bennée
2020-02-25 12:46 ` [PATCH v3 06/19] travis.yml: Fix Travis YAML configuration warnings Alex Bennée
2020-02-25 12:46 ` [PATCH v3 07/19] travis.yml: single-thread build-tcg stages Alex Bennée
2020-02-25 12:46 ` [PATCH v3 08/19] tests/iotests: be a little more forgiving on the size test Alex Bennée
2020-02-25 14:11 ` Robert Foley
2020-02-25 18:22 ` Stefan Berger
2020-02-25 18:39 ` Philippe Mathieu-Daudé
2020-02-25 12:47 ` [PATCH v3 09/19] tracing: only allow -trace to override -D if set Alex Bennée
2020-02-25 12:47 ` [PATCH v3 10/19] docs/devel: document query handle lifetimes Alex Bennée
2020-02-25 12:47 ` [PATCH v3 11/19] plugins/core: add missing break in cb_to_tcg_flags Alex Bennée
2020-02-25 12:47 ` [PATCH v3 12/19] tests/plugin: prevent uninitialized warning Alex Bennée
2020-02-26 13:59 ` Philippe Mathieu-Daudé
2020-02-27 7:01 ` Chenqun (kuhn)
2020-02-25 12:47 ` [PATCH v3 13/19] qemu/bitops.h: Add extract8 and extract16 Alex Bennée
2020-02-25 14:04 ` Philippe Mathieu-Daudé
2020-02-25 12:47 ` [PATCH v3 14/19] target/riscv: progressively load the instruction during decode Alex Bennée
2020-02-25 12:47 ` [PATCH v3 15/19] tests/plugins: make howvec clean-up after itself Alex Bennée
2020-02-25 12:47 ` [PATCH v3 16/19] tests/tcg: give debug builds a little bit longer Alex Bennée
2020-02-25 12:47 ` [PATCH v3 17/19] tcg: save vaddr temp for plugin usage Alex Bennée
2020-02-25 12:47 ` [PATCH v3 18/19] tests/tcg: fix typo in configure.sh test for v8.3 Alex Bennée
2020-02-25 12:47 ` [PATCH v3 19/19] tests/tcg: take into account expected clashes pauth-4 Alex Bennée
2020-02-26 13:36 ` [PATCH v3 00/19] testing & plugin updates no-reply
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200225124710.14152-5-alex.bennee@linaro.org \
--to=alex.bennee@linaro.org \
--cc=aaron@os.amperecomputing.com \
--cc=aurelien@aurel32.net \
--cc=berrange@redhat.com \
--cc=cota@braap.org \
--cc=f4bug@amsat.org \
--cc=fam@euphon.net \
--cc=kuhn.chenqun@huawei.com \
--cc=marcandre.lureau@redhat.com \
--cc=pbonzini@redhat.com \
--cc=peter.puhov@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=richard.henderson@linaro.org \
--cc=robert.foley@linaro.org \
--cc=robhenry@microsoft.com \
--cc=stefanb@linux.vnet.ibm.com \
--cc=stefanha@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).