On 2017/05/17 11:39:41 +0800, Junchang Wang wrote: > On Wed, May 17, 2017 at 1:33 AM, Paul E. McKenney > <paulmck@xxxxxxxxxxxxxxxxxx> wrote: >> On Tue, May 16, 2017 at 11:44:12PM +0800, Junchang Wang wrote: >>> 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(). >>> >>> Suggested-by: Akira Yokosawa <akiyks@xxxxxxxxx> >>> Signed-off-by: Junchang Wang <junchangwang@xxxxxxxxx> >> >> Removing the memory barrier is good. Removing the stopflag_l local >> variable is presumably intended to remove one load instruction per pass >> through the outer loop, assuming that the stopflag_l variable is kept >> in a register. >> >> Is the performance benefit actually visible? My guess is "no". >> If the performance is not substantial, my thought would be to keep >> the code simpler, given that this is a textbook. >> > > Hi Paul, > > Agree. Thanks for the note. Anyway, let's submit a new patch on > smp_mb(), which makes the code correct. For simplifying stopflag, we > can consider submitting a new patch later. How does that sound like? Hi Jason & Paul, For a material in Chapter 5, I agree that removing excess READ_ONCE() is not necessary. Such optimizations could be discussed somewhere (maybe a Quick Quiz) in Chapter 14, but I'm not sure. So, the revised patch just removing a smp_mb() looks good to me. Thanks, Akira. > > > Thanks, > --Jason > > >> And yes, there might be other performance-neutral simplifications possible, >> and I would welcome patches to that effect. >> >> Thanx, Paul >> >>> --- >>> 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