Re: [PATCH v2] count_stat_eventual: Remove unnecessary READ_ONCE() and smp_mb()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, May 18, 2017 at 07:44:10AM +0900, Akira Yokosawa wrote:
> 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.

Very good, queued and pushed.  Thank you both!

							Thanx, Paul

>                 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



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux