Hi Paul and Akira, This is the updated patch according to the discussion with Akira and following is the summary. Please take a look. Comments are welcome! In function eventual( ), if the value of stopflag become larger than zero (the ''if'' branch is taken), then only the "eventual()" thread updates stopflag. So, the READ_ONCE() within the WRITE_ONCE() is not necessary. Remove it. In function count_cleanup( ), there is no need to run smp_mb( ) in between statement writing to and statement reading from the same variable, stopflag. Remove smp_mb(). Thanks, --Jason On Tue, May 16, 2017 at 9:40 PM, Junchang Wang <junchangwang@xxxxxxxxx> wrote: > Signed-off-by: Junchang Wang <junchangwang@xxxxxxxxx> > Signed-off-by: Akira Yokosawa <akiyks@xxxxxxxxx> > --- > CodeSamples/count/count_stat_eventual.c | 8 ++++---- > 1 file changed, 4 insertions(+), 4 deletions(-) > > diff --git a/CodeSamples/count/count_stat_eventual.c b/CodeSamples/count/count_stat_eventual.c > index 464de30..1365168 100644 > --- a/CodeSamples/count/count_stat_eventual.c > +++ b/CodeSamples/count/count_stat_eventual.c > @@ -40,16 +40,17 @@ void *eventual(void *arg) > { > int t; > unsigned long sum; > + int stopflag_l = 0; > > - while (READ_ONCE(stopflag) < 3) { > + while (stopflag_l < 3) { > sum = 0; > for_each_thread(t) > sum += READ_ONCE(per_thread(counter, t)); > WRITE_ONCE(global_count, sum); > poll(NULL, 0, 1); > - if (READ_ONCE(stopflag)) { > + if ((stopflag_l = READ_ONCE(stopflag)) != 0) { > smp_mb(); > - WRITE_ONCE(stopflag, READ_ONCE(stopflag) + 1); > + WRITE_ONCE(stopflag, ++stopflag_l); > } > } > return NULL; > @@ -68,7 +69,6 @@ void count_init(void) > void count_cleanup(void) > { > WRITE_ONCE(stopflag, 1); > - smp_mb(); > while (READ_ONCE(stopflag) < 3) > poll(NULL, 0, 1); > smp_mb(); > -- > 2.7.4 > -- To unsubscribe from this list: send the line "unsubscribe perfbook" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html