From: "Matias Bjørling" <mb@lightnvm.io>
To: hlitz@ucsc.edu
Cc: linux-block@vger.kernel.org, javier@cnexlabs.com,
marcin.dziegielewski@intel.com, igor.j.konopko@intel.com
Subject: Re: [PATCH] lightnvm: pblk: Add read memory barrier when reading from rb
Date: Thu, 28 Jun 2018 09:59:37 +0200 [thread overview]
Message-ID: <3f640809-3093-55da-6014-91b98d7ae642@lightnvm.io> (raw)
In-Reply-To: <CAJbgVnUmP6UgA1Mu_do0OLVg2gXrbp7opCVhA6aRD07fxjjk1g@mail.gmail.com>
On 06/28/2018 01:31 AM, Heiner Litz wrote:
> There is a control dependency between two disjoint variables (only read
> data if flags == WRITTEN). Because x86-TSO allows re-ordering of loads
> the control dependency can be violated.
I'm sorry, I do not see it :)
Here is my understanding:
entry->w_ctx.flags is used as a flagging mechanism to wait for data to
become available when "flags" has PBLK_WRITTEN_DATA.
The later access to entry->data is independent of this. It is assumed
that entry->w_ctx.flags is the guarding barrier.
Here is the titbit from the control dependency section that makes me say
that the entry->data loads is not possible to be done before
entry->w_ctx.flags:
" (*) Control dependencies apply only to the then-clause and else-clause
of the if-statement containing the control dependency, including
any functions that these two clauses call. Control dependencies
do -not- apply to code following the if-statement containing the
control dependency."
The read of entry->data must come after the READ_ONCE of
entry->w_ctx.flags.
>
> https://www.kernel.org/doc/Documentation/memory-barriers.txt refers to
> the above scenario as control dependency but your description is of
> course also correct. Let me know if we should clarify the comment.
>
> BTW: ARM has an even more relaxed memory model and also allows to
> re-order writes. If we want to support ARM correctly, I think we also
> need to insert a memory barrier between writing data and writing flags
> (and there might be a couple other places where we need to check).
>
> On Fri, Jun 22, 2018, 11:02 AM Matias Bjørling <mb@lightnvm.io
> <mailto:mb@lightnvm.io>> wrote:
>
> On 06/21/2018 12:54 AM, Heiner Litz wrote:
> > READ_ONCE does not imply a read memory barrier in the presence of
> control
> > dependencies between two separate memory locations (flags and
> data). On x86
> > TSO, reading from the data page might be reordered before the
> flags read.
> > See chapter CONTROL DEPENDENCIES in
> > https://www.kernel.org/doc/Documentation/memory-barriers.txt
> >
> > Signed-off-by: Heiner Litz <hlitz@ucsc.edu <mailto:hlitz@ucsc.edu>>
> > ---
> > drivers/lightnvm/pblk-rb.c | 3 +++
> > 1 file changed, 3 insertions(+)
> >
> > diff --git a/drivers/lightnvm/pblk-rb.c b/drivers/lightnvm/pblk-rb.c
> > index a81a97e..5f09983 100644
> > --- a/drivers/lightnvm/pblk-rb.c
> > +++ b/drivers/lightnvm/pblk-rb.c
> > @@ -545,6 +545,9 @@ unsigned int pblk_rb_read_to_bio(struct
> pblk_rb *rb, struct nvm_rq *rqd,
> > goto try;
> > }
> >
> > + /* Observe control dependency between flags and
> data read */
> > + smp_rmb();
> > +
> > page = virt_to_page(entry->data);
> > if (!page) {
> > pr_err("pblk: could not allocate write bio
> page\n");
> >
>
> Hi Heiner,
>
> Can you help explain how it is a control dependency? What case am I
> missing?
>
> The way I read the code, there is the case where a read of entry->data
> happens before entry->w_ctx.flags, but I see that as a memory
> reordering, which the smp_rmb() fixes. Would that be more accurate?
>
> Thank you,
> Matias
>
next parent reply other threads:[~2018-06-28 7:59 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <1529535298-15465-1-git-send-email-hlitz@ucsc.edu>
[not found] ` <4ef758b3-f9f0-42b5-c202-6f1491f027aa@lightnvm.io>
[not found] ` <CAJbgVnUmP6UgA1Mu_do0OLVg2gXrbp7opCVhA6aRD07fxjjk1g@mail.gmail.com>
2018-06-28 7:59 ` Matias Bjørling [this message]
2018-06-28 8:15 ` [PATCH] lightnvm: pblk: Add read memory barrier when reading from rb Javier Gonzalez
2018-07-03 10:14 ` Heiner Litz
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=3f640809-3093-55da-6014-91b98d7ae642@lightnvm.io \
--to=mb@lightnvm.io \
--cc=hlitz@ucsc.edu \
--cc=igor.j.konopko@intel.com \
--cc=javier@cnexlabs.com \
--cc=linux-block@vger.kernel.org \
--cc=marcin.dziegielewski@intel.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