From: Paolo Bonzini <pbonzini@redhat.com>
To: "Alex Bennée" <alex.bennee@linaro.org>, qemu-devel@nongnu.org
Cc: fam@euphon.net, berrange@redhat.com, robert.foley@linaro.org,
stefanb@linux.vnet.ibm.com, 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: Re: [PATCH v2 04/19] tests/rcutorture: mild documenting refactor of update thread
Date: Fri, 14 Feb 2020 10:18:11 +0100 [thread overview]
Message-ID: <f2033617-a747-531c-66a6-a33c1b9d6aa8@redhat.com> (raw)
In-Reply-To: <20200213225109.13120-5-alex.bennee@linaro.org>
On 13/02/20 23:50, Alex Bennée wrote:
> 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>
Yes, the failures are quire mysterious and I agree that they can only happen if:
1) p == cp in your patch below
2) the memory barrier can be overtaken by the store above it.
Even then, (2) would be unlikely because then the compiler would
coalesce the two stores to p->mbtest. However we could add a patch such
as this to rule it out:
diff --git a/tests/rcutorture.c b/tests/rcutorture.c
index 9559f13..969a19a 100644
--- a/tests/rcutorture.c
+++ b/tests/rcutorture.c
@@ -260,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();
@@ -268,7 +268,7 @@ static void *rcu_read_stress_test(void *arg)
garbage++;
}
rcu_read_unlock();
- pc = p->pipe_count;
+ pc = atomic_read(&p->pipe_count);
rcu_read_unlock();
if ((pc > RCU_STRESS_PIPE_LEN) || (pc < 0)) {
pc = RCU_STRESS_PIPE_LEN;
@@ -319,10 +319,10 @@ static void *rcu_update_stress_test(void *arg)
p = &rcu_stress_array[rcu_stress_idx];
/* catching up with ourselves would be a bug */
assert(p != cp);
- p->mbtest = 0;
+ atomic_set(&p->mbtest, 0);
smp_mb();
- p->pipe_count = 0;
- p->mbtest = 1;
+ atomic_set(&p->pipe_count, 0);
+ atomic_set(&p->mbtest, 1);
atomic_rcu_set(&rcu_stress_current, p);
cp = p;
/*
@@ -331,7 +331,8 @@ static void *rcu_update_stress_test(void *arg)
*/
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].pipe_count,
+ rcu_stress_array[i].pipe_count + 1);
}
}
synchronize_rcu();
Finally, the "pipe_count" naming is a bit mysterious. The idea behind the test
is that RCU can only ever see the current or the previous version of a
struct (in this case, the current or the previous index) and a "pipe_count"
of 3 means for example that the index is 3 updates behind the current
index. To check that the RCU invariant is preserved, the test checks that
the reader does not observe an index that is 2 updates or more behind the
current index.
I have never changed it because I took it directly from Paul McKenney's
rcutorture and I didn't want to deviate too much in order to keep Paul's
code as a reference. But perhaps we should rename it to something more
intuitive like "age" (which is short enough that "pc" could also be
renamed to "age").
Paolo
next prev parent reply other threads:[~2020-02-14 9:19 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-02-13 22:50 [PATCH v2 00/19] testing and plugin updates Alex Bennée
2020-02-13 22:50 ` [PATCH v2 01/19] tests/tcg: include a skip runner for pauth3 with plugins Alex Bennée
2020-02-14 19:41 ` Robert Foley
2020-02-13 22:50 ` [PATCH v2 02/19] tests/rcutorture: update usage hint Alex Bennée
2020-02-13 22:50 ` [PATCH v2 03/19] tests/rcutorture: better document locking of stats Alex Bennée
2020-02-13 22:50 ` [PATCH v2 04/19] tests/rcutorture: mild documenting refactor of update thread Alex Bennée
2020-02-14 9:18 ` Paolo Bonzini [this message]
2020-02-13 22:50 ` [PATCH v2 05/19] travis.yml: Test the s390-ccw build, too Alex Bennée
2020-02-13 22:50 ` [PATCH v2 06/19] travis.yml: Fix Travis YAML configuration warnings Alex Bennée
2020-02-13 22:50 ` [PATCH v2 07/19] travis.yml: single-thread build-tcg stages Alex Bennée
2020-02-14 12:15 ` Philippe Mathieu-Daudé
2020-02-13 22:50 ` [PATCH v2 08/19] tests/iotests: be a little more forgiving on the size test Alex Bennée
2020-02-13 22:50 ` [PATCH v2 09/19] tracing: only allow -trace to override -D if set Alex Bennée
2020-02-14 18:19 ` Robert Foley
2020-02-13 22:51 ` [PATCH v2 10/19] docs/devel: document query handle lifetimes Alex Bennée
2020-02-13 22:51 ` [PATCH v2 11/19] plugins/core: add missing break in cb_to_tcg_flags Alex Bennée
2020-02-14 0:52 ` Philippe Mathieu-Daudé
2020-02-13 22:51 ` [PATCH v2 12/19] tests/plugin: prevent uninitialized warning Alex Bennée
2020-02-13 22:51 ` [PATCH v2 13/19] qemu/bitops.h: Add extract8 and extract16 Alex Bennée
2020-02-13 22:51 ` [PATCH v2 14/19] target/riscv: progressively load the instruction during decode Alex Bennée
2020-02-14 1:23 ` Alistair Francis
2020-02-14 19:34 ` Robert Foley
2020-02-13 22:51 ` [PATCH v2 15/19] tests/plugins: make howvec clean-up after itself Alex Bennée
2020-02-13 22:51 ` [PATCH v2 16/19] tests/tcg: give debug builds a little bit longer Alex Bennée
2020-02-14 0:50 ` Philippe Mathieu-Daudé
2020-02-13 22:51 ` [PATCH v2 17/19] tcg: save vaddr temp for plugin usage Alex Bennée
2020-02-16 9:23 ` Richard Henderson
2020-02-23 3:06 ` Emilio G. Cota
2020-02-13 22:51 ` [PATCH v2 18/19] tests/tcg: fix typo in configure.sh test for v8.3 Alex Bennée
2020-02-14 0:50 ` Philippe Mathieu-Daudé
2020-02-16 9:24 ` Richard Henderson
2020-02-13 22:51 ` [PATCH v2 19/19] tests/tcg: take into account expected clashes pauth-4 Alex Bennée
2020-02-14 19:12 ` Robert Foley
2020-02-16 9:30 ` Richard Henderson
2020-02-13 23:16 ` [PATCH v2 00/19] testing and 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=f2033617-a747-531c-66a6-a33c1b9d6aa8@redhat.com \
--to=pbonzini@redhat.com \
--cc=aaron@os.amperecomputing.com \
--cc=alex.bennee@linaro.org \
--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=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).