All of lore.kernel.org
 help / color / mirror / Atom feed
From: andrea.parri@amarulasolutions.com (Andrea Parri)
Subject: [PATCH 05/10] staging: erofs: add a full barrier in erofs_workgroup_unfreeze
Date: Fri, 23 Nov 2018 10:51:28 +0100	[thread overview]
Message-ID: <20181123094739.GA3487@andrea> (raw)
In-Reply-To: <b2f367c5-a54c-9edf-42ad-d256bc725cf7@huawei.com>

On Fri, Nov 23, 2018@10:51:33AM +0800, Gao Xiang wrote:
> Hi Andrea,
> 
> On 2018/11/23 2:50, Andrea Parri wrote:
> > On Thu, Nov 22, 2018@06:56:32PM +0800, Gao Xiang wrote:
> >> Hi Greg,
> >>
> >> On 2018/11/22 18:22, Greg Kroah-Hartman wrote:
> >>> Please document this memory barrier.  It does not make much sense to
> >>> me...
> >>
> >> Because we need to make the other observers noticing the latest values modified
> >> in this locking period before unfreezing the whole workgroup, one way is to use
> >> a memory barrier and the other way is to use ACQUIRE and RELEASE. we selected
> >> the first one.
> >>
> >> Hmmm...ok, I will add a simple message to explain this, but I think that is
> >> plain enough for a lock...
> > 
> > Sympathizing with Greg's request, let me add some specific suggestions:
> > 
> >   1. It wouldn't hurt to indicate a pair of memory accesses which are
> >      intended to be "ordered" by the memory barrier in question (yes,
> >      this pair might not be unique, but you should be able to provide
> >      an example).
> > 
> >   2. Memory barriers always come matched by other memory barriers, or
> >      dependencies (it really does not make sense to talk about a full
> >      barrier "in isolation"): please also indicate (an instance of) a
> >      matching barrier or the matching barriers.
> > 
> >   3. How do the hardware threads communicate?  In the acquire/release
> >      pattern you mentioned above, the load-acquire *reads from* a/the
> >      previous store-release, a memory access that follows the acquire
> >      somehow communicate with a memory access preceding the release...
> > 
> >   4. It is a good practice to include the above information within an
> >      (inline) comment accompanying the added memory barrier (in fact,
> >      IIRC, checkpatch.pl gives you a "memory barrier without comment"
> >      warning when you omit to do so); not just in the commit message.
> > 
> > Hope this helps.  Please let me know if something I wrote is unclear,
> 
> Thanks for taking time on the detailed explanation. I think it is helpful for me. :)
> And you are right, barriers should be in pairs, and I think I need to explain more:
> 
> 255 static inline bool erofs_workgroup_get(struct erofs_workgroup *grp, int *ocnt)
> 256 {
> 257         int o;
> 258
> 259 repeat:
> 260         o = erofs_wait_on_workgroup_freezed(grp);
> 261
> 262         if (unlikely(o <= 0))
> 263                 return -1;
> 264
> 265         if (unlikely(atomic_cmpxchg(&grp->refcount, o, o + 1) != o)) <- *
> 266                 goto repeat;
>             imply a memory barrier here
> 267
> 268         *ocnt = o;
> 269         return 0;
> 270 }
> 
> I think atomic_cmpxchg implies a memory barrier semantics when the value comparison (*) succeeds...

Correct.  This is informally documented in Documentation/atomic_t.txt
and formalized within tools/memory-model/.


> 
> I don't know whether my understanding is correct, If I am wrong..please correct me, or
> I need to add more detailed code comments to explain in the code?

Yes, please; please review the above points (including 1. and 3.) and
try to address them with inline comments.  Maybe (if that matches the
*behavior*/guarantee you have in mind...) something like:

[in erofs_workgroup_unfreeze()]

	/*
	 * Orders the store/load to/from [???] and the store to
	 * ->refcount performed by the atomic_set() below.
	 *
	 * Matches the atomic_cmpxchg() in erofs_workgroup_get().
	 *
	 * Guarantees that if a successful atomic_cmpxchg() reads
	 * the value stored by the atomic_set() then [???].
	 */
	smp_mb();
	atomic_set(&grp->refcount, v);


[in erofs_workgroup_get()]

	/*
	 * Orders the load from ->refcount performed by the
	 * atomic_cmpxchg() below and the store/load [???].
	 *
	 * See the comment for the smp_mb() in
	 * erofs_workgroup_unfreeze().
	 */
	if (unlikely(atomic_cmpxchg(&grp->refcount, o, o + 1) != o))
		goto repeat;

Thanks,
  Andrea


> 
> Thanks,
> Gao Xiang
> 
> 
> > 
> >   Andrea
> > 
> > 
> >>
> >> Thanks,
> >> Gao Xiang
> >>
> >>>
> >>> thanks,
> >>>
> >>> greg k-h

WARNING: multiple messages have this Message-ID (diff)
From: Andrea Parri <andrea.parri@amarulasolutions.com>
To: Gao Xiang <gaoxiang25@huawei.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	devel@driverdev.osuosl.org, linux-erofs@lists.ozlabs.org,
	Chao Yu <yuchao0@huawei.com>, LKML <linux-kernel@vger.kernel.org>,
	weidu.du@huawei.com, Miao Xie <miaoxie@huawei.com>
Subject: Re: [PATCH 05/10] staging: erofs: add a full barrier in erofs_workgroup_unfreeze
Date: Fri, 23 Nov 2018 10:51:28 +0100	[thread overview]
Message-ID: <20181123094739.GA3487@andrea> (raw)
In-Reply-To: <b2f367c5-a54c-9edf-42ad-d256bc725cf7@huawei.com>

On Fri, Nov 23, 2018 at 10:51:33AM +0800, Gao Xiang wrote:
> Hi Andrea,
> 
> On 2018/11/23 2:50, Andrea Parri wrote:
> > On Thu, Nov 22, 2018 at 06:56:32PM +0800, Gao Xiang wrote:
> >> Hi Greg,
> >>
> >> On 2018/11/22 18:22, Greg Kroah-Hartman wrote:
> >>> Please document this memory barrier.  It does not make much sense to
> >>> me...
> >>
> >> Because we need to make the other observers noticing the latest values modified
> >> in this locking period before unfreezing the whole workgroup, one way is to use
> >> a memory barrier and the other way is to use ACQUIRE and RELEASE. we selected
> >> the first one.
> >>
> >> Hmmm...ok, I will add a simple message to explain this, but I think that is
> >> plain enough for a lock...
> > 
> > Sympathizing with Greg's request, let me add some specific suggestions:
> > 
> >   1. It wouldn't hurt to indicate a pair of memory accesses which are
> >      intended to be "ordered" by the memory barrier in question (yes,
> >      this pair might not be unique, but you should be able to provide
> >      an example).
> > 
> >   2. Memory barriers always come matched by other memory barriers, or
> >      dependencies (it really does not make sense to talk about a full
> >      barrier "in isolation"): please also indicate (an instance of) a
> >      matching barrier or the matching barriers.
> > 
> >   3. How do the hardware threads communicate?  In the acquire/release
> >      pattern you mentioned above, the load-acquire *reads from* a/the
> >      previous store-release, a memory access that follows the acquire
> >      somehow communicate with a memory access preceding the release...
> > 
> >   4. It is a good practice to include the above information within an
> >      (inline) comment accompanying the added memory barrier (in fact,
> >      IIRC, checkpatch.pl gives you a "memory barrier without comment"
> >      warning when you omit to do so); not just in the commit message.
> > 
> > Hope this helps.  Please let me know if something I wrote is unclear,
> 
> Thanks for taking time on the detailed explanation. I think it is helpful for me. :)
> And you are right, barriers should be in pairs, and I think I need to explain more:
> 
> 255 static inline bool erofs_workgroup_get(struct erofs_workgroup *grp, int *ocnt)
> 256 {
> 257         int o;
> 258
> 259 repeat:
> 260         o = erofs_wait_on_workgroup_freezed(grp);
> 261
> 262         if (unlikely(o <= 0))
> 263                 return -1;
> 264
> 265         if (unlikely(atomic_cmpxchg(&grp->refcount, o, o + 1) != o)) <- *
> 266                 goto repeat;
>             imply a memory barrier here
> 267
> 268         *ocnt = o;
> 269         return 0;
> 270 }
> 
> I think atomic_cmpxchg implies a memory barrier semantics when the value comparison (*) succeeds...

Correct.  This is informally documented in Documentation/atomic_t.txt
and formalized within tools/memory-model/.


> 
> I don't know whether my understanding is correct, If I am wrong..please correct me, or
> I need to add more detailed code comments to explain in the code?

Yes, please; please review the above points (including 1. and 3.) and
try to address them with inline comments.  Maybe (if that matches the
*behavior*/guarantee you have in mind...) something like:

[in erofs_workgroup_unfreeze()]

	/*
	 * Orders the store/load to/from [???] and the store to
	 * ->refcount performed by the atomic_set() below.
	 *
	 * Matches the atomic_cmpxchg() in erofs_workgroup_get().
	 *
	 * Guarantees that if a successful atomic_cmpxchg() reads
	 * the value stored by the atomic_set() then [???].
	 */
	smp_mb();
	atomic_set(&grp->refcount, v);


[in erofs_workgroup_get()]

	/*
	 * Orders the load from ->refcount performed by the
	 * atomic_cmpxchg() below and the store/load [???].
	 *
	 * See the comment for the smp_mb() in
	 * erofs_workgroup_unfreeze().
	 */
	if (unlikely(atomic_cmpxchg(&grp->refcount, o, o + 1) != o))
		goto repeat;

Thanks,
  Andrea


> 
> Thanks,
> Gao Xiang
> 
> 
> > 
> >   Andrea
> > 
> > 
> >>
> >> Thanks,
> >> Gao Xiang
> >>
> >>>
> >>> thanks,
> >>>
> >>> greg k-h

  reply	other threads:[~2018-11-23  9:51 UTC|newest]

Thread overview: 92+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-11-20 14:34 [PATCH 00/10] staging: erofs: decompression stability enhancement Gao Xiang
2018-11-20 14:34 ` Gao Xiang
2018-11-20 14:34 ` [PATCH 01/10] staging: erofs: fix `trace_erofs_readpage' position Gao Xiang
2018-11-20 14:34   ` Gao Xiang
2018-11-22 10:19   ` Greg Kroah-Hartman
2018-11-22 10:19     ` Greg Kroah-Hartman
2018-11-22 10:49     ` Gao Xiang
2018-11-22 10:49       ` Gao Xiang
2018-11-22 11:00       ` Greg Kroah-Hartman
2018-11-22 11:00         ` Greg Kroah-Hartman
2018-11-20 14:34 ` [PATCH 02/10] staging: erofs: fix race when the managed cache is enabled Gao Xiang
2018-11-20 14:34   ` Gao Xiang
2018-11-22 10:17   ` Greg Kroah-Hartman
2018-11-22 10:17     ` Greg Kroah-Hartman
2018-11-22 10:42     ` Gao Xiang
2018-11-22 10:42       ` Gao Xiang
2018-11-22 11:06       ` Greg Kroah-Hartman
2018-11-22 11:06         ` Greg Kroah-Hartman
2018-11-22 11:43         ` Gao Xiang
2018-11-22 11:43           ` Gao Xiang
2018-11-22 12:26           ` Greg Kroah-Hartman
2018-11-22 12:26             ` Greg Kroah-Hartman
2018-11-22 12:41             ` Gao Xiang
2018-11-22 12:41               ` Gao Xiang
2018-11-22 13:20               ` Greg Kroah-Hartman
2018-11-22 13:20                 ` Greg Kroah-Hartman
2018-11-22 10:19   ` Greg Kroah-Hartman
2018-11-22 10:19     ` Greg Kroah-Hartman
2018-11-20 14:34 ` [PATCH 03/10] staging: erofs: atomic_cond_read_relaxed on ref-locked workgroup Gao Xiang
2018-11-20 14:34   ` Gao Xiang
2018-11-22 10:20   ` Greg Kroah-Hartman
2018-11-22 10:20     ` Greg Kroah-Hartman
2018-11-20 14:34 ` [PATCH 04/10] staging: erofs: fix `erofs_workgroup_{try_to_freeze, unfreeze}' Gao Xiang
2018-11-20 14:34   ` Gao Xiang
2018-11-22 10:21   ` Greg Kroah-Hartman
2018-11-22 10:21     ` Greg Kroah-Hartman
2018-11-22 10:29     ` Gao Xiang
2018-11-22 10:29       ` Gao Xiang
2018-11-22 11:03       ` Greg Kroah-Hartman
2018-11-22 11:03         ` Greg Kroah-Hartman
2018-11-22 11:05       ` Greg Kroah-Hartman
2018-11-22 11:05         ` Greg Kroah-Hartman
2018-11-22 11:22         ` Gao Xiang
2018-11-22 11:22           ` Gao Xiang
2018-11-20 14:34 ` [PATCH 05/10] staging: erofs: add a full barrier in erofs_workgroup_unfreeze Gao Xiang
2018-11-20 14:34   ` Gao Xiang
2018-11-22 10:22   ` Greg Kroah-Hartman
2018-11-22 10:22     ` Greg Kroah-Hartman
2018-11-22 10:56     ` Gao Xiang
2018-11-22 10:56       ` Gao Xiang
2018-11-22 18:50       ` Andrea Parri
2018-11-22 18:50         ` Andrea Parri
2018-11-23  2:51         ` Gao Xiang
2018-11-23  2:51           ` Gao Xiang
2018-11-23  9:51           ` Andrea Parri [this message]
2018-11-23  9:51             ` Andrea Parri
2018-11-23 10:00             ` Gao Xiang
2018-11-23 10:00               ` Gao Xiang
2018-11-20 14:34 ` [PATCH 06/10] staging: erofs: fix the definition of DBG_BUGON Gao Xiang
2018-11-20 14:34   ` Gao Xiang
2018-11-20 14:34 ` [PATCH 07/10] staging: erofs: separate into init_once / always Gao Xiang
2018-11-20 14:34   ` Gao Xiang
2018-11-22 10:23   ` Greg Kroah-Hartman
2018-11-22 10:23     ` Greg Kroah-Hartman
2018-11-22 10:34     ` Gao Xiang
2018-11-22 10:34       ` Gao Xiang
2018-11-22 11:05       ` Greg Kroah-Hartman
2018-11-22 11:05         ` Greg Kroah-Hartman
2018-11-22 11:11         ` Gao Xiang
2018-11-22 11:11           ` Gao Xiang
2018-11-22 11:26           ` Greg Kroah-Hartman
2018-11-22 11:26             ` Greg Kroah-Hartman
2018-11-22 11:37             ` Gao Xiang
2018-11-22 11:37               ` Gao Xiang
2018-11-22 12:00             ` Gao Xiang
2018-11-22 12:00               ` Gao Xiang
2018-11-22 13:01               ` Gao Xiang
2018-11-22 13:01                 ` Gao Xiang
2018-11-22 13:23                 ` Greg Kroah-Hartman
2018-11-22 13:23                   ` Greg Kroah-Hartman
2018-11-22 13:59                   ` Gao Xiang
2018-11-22 13:59                     ` Gao Xiang
2018-11-20 14:34 ` [PATCH 08/10] staging: erofs: locked before registering for all new workgroups Gao Xiang
2018-11-20 14:34   ` Gao Xiang
2018-11-22 10:24   ` Greg Kroah-Hartman
2018-11-22 10:24     ` Greg Kroah-Hartman
2018-11-22 10:35     ` Gao Xiang
2018-11-22 10:35       ` Gao Xiang
2018-11-20 14:34 ` [PATCH 09/10] staging: erofs: decompress asynchronously if PG_readahead page at first Gao Xiang
2018-11-20 14:34   ` Gao Xiang
2018-11-20 14:34 ` [PATCH 10/10] staging: erofs: rename strange variable names in z_erofs_vle_frontend Gao Xiang
2018-11-20 14:34   ` Gao Xiang

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=20181123094739.GA3487@andrea \
    --to=andrea.parri@amarulasolutions.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.