From: "Paul E. McKenney" <paulmck@us.ibm.com>
To: Andrew Morton <akpm@osdl.org>
Cc: stelian@popies.net, linux-kernel@vger.kernel.org,
paulus@au1.ibm.com, anton@au1.ibm.com,
open-iscsi@googlegroups.com, pradeep@us.ibm.com,
mashirle@us.ibm.com
Subject: Re: [PATCH] memory ordering in __kfifo primitives
Date: Wed, 9 Aug 2006 18:01:37 -0700 [thread overview]
Message-ID: <20060810010137.GD1291@us.ibm.com> (raw)
In-Reply-To: <20060809172910.614ad979.akpm@osdl.org>
On Wed, Aug 09, 2006 at 05:29:10PM -0700, Andrew Morton wrote:
> On Wed, 9 Aug 2006 17:18:23 -0700
> "Paul E. McKenney" <paulmck@us.ibm.com> wrote:
>
> > @@ -129,6 +129,8 @@ unsigned int __kfifo_put(struct kfifo *f
> > /* then put the rest (if any) at the beginning of the buffer */
> > memcpy(fifo->buffer, buffer + l, len - l);
> >
> > + smp_wmb();
> > +
> > fifo->in += len;
> >
> > return len;
> > @@ -161,6 +163,8 @@ unsigned int __kfifo_get(struct kfifo *f
> > /* then get the rest (if any) from the beginning of the buffer */
> > memcpy(buffer + l, fifo->buffer, len - l);
> >
> > + smp_mb();
> > +
> > fifo->out += len;
> >
> > return len;
>
> When adding barriers, please also add a little comment explaining what the
> barrier is protecting us from.
>
> Often it's fairly obvious, but sometimes it is not, and in both cases it is still
> useful to communicate the programmer's intent in this way.
I certainly cannot claim that it was obvious in this case, as the act
of adding the comments caused me to realize that I had added only two
of the four memory barriers that are required. :-/ Updated patch below.
Signed-off-by: Paul E. McKenney <paulmck@us.ibm.com>
---
kfifo.c | 28 ++++++++++++++++++++++++++++
1 files changed, 28 insertions(+)
diff -urpNa -X dontdiff linux-2.6.18-rc2/kernel/kfifo.c linux-2.6.18-rc2-kfifo/kernel/kfifo.c
--- linux-2.6.18-rc2/kernel/kfifo.c 2006-07-15 14:53:08.000000000 -0700
+++ linux-2.6.18-rc2-kfifo/kernel/kfifo.c 2006-08-09 17:45:41.000000000 -0700
@@ -122,6 +122,13 @@ unsigned int __kfifo_put(struct kfifo *f
len = min(len, fifo->size - fifo->in + fifo->out);
+ /*
+ * Ensure that we sample the fifo->out index -before- we
+ * start putting bytes into the kfifo.
+ */
+
+ smp_mb();
+
/* first put the data starting from fifo->in to buffer end */
l = min(len, fifo->size - (fifo->in & (fifo->size - 1)));
memcpy(fifo->buffer + (fifo->in & (fifo->size - 1)), buffer, l);
@@ -129,6 +136,13 @@ unsigned int __kfifo_put(struct kfifo *f
/* then put the rest (if any) at the beginning of the buffer */
memcpy(fifo->buffer, buffer + l, len - l);
+ /*
+ * Ensure that we add the bytes to the kfifo -before-
+ * we update the fifo->in index.
+ */
+
+ smp_wmb();
+
fifo->in += len;
return len;
@@ -154,6 +168,13 @@ unsigned int __kfifo_get(struct kfifo *f
len = min(len, fifo->in - fifo->out);
+ /*
+ * Ensure that we sample the fifo->in index -before- we
+ * start removing bytes from the kfifo.
+ */
+
+ smp_rmb();
+
/* first get the data from fifo->out until the end of the buffer */
l = min(len, fifo->size - (fifo->out & (fifo->size - 1)));
memcpy(buffer, fifo->buffer + (fifo->out & (fifo->size - 1)), l);
@@ -161,6 +182,13 @@ unsigned int __kfifo_get(struct kfifo *f
/* then get the rest (if any) from the beginning of the buffer */
memcpy(buffer + l, fifo->buffer, len - l);
+ /*
+ * Ensure that we remove the bytes from the kfifo -before-
+ * we update the fifo->out index.
+ */
+
+ smp_mb();
+
fifo->out += len;
return len;
next prev parent reply other threads:[~2006-08-10 1:00 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-08-10 0:18 [PATCH] memory ordering in __kfifo primitives Paul E. McKenney
2006-08-10 0:29 ` Andrew Morton
2006-08-10 1:01 ` Paul E. McKenney [this message]
2006-08-10 0:33 ` Paul E. McKenney
2006-08-10 5:48 ` Mike Christie
2006-08-10 13:41 ` Paul E. McKenney
2006-08-10 14:26 ` Stelian Pop
2006-08-10 15:39 ` Paul E. McKenney
2006-08-10 15:47 ` Stelian Pop
2006-08-10 16:11 ` Paul E. McKenney
2006-08-10 16:23 ` Stelian Pop
2006-08-10 16:47 ` Paul E. McKenney
2006-08-10 20:27 ` Stelian Pop
2006-08-10 20:54 ` Paul E. McKenney
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=20060810010137.GD1291@us.ibm.com \
--to=paulmck@us.ibm.com \
--cc=akpm@osdl.org \
--cc=anton@au1.ibm.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mashirle@us.ibm.com \
--cc=open-iscsi@googlegroups.com \
--cc=paulus@au1.ibm.com \
--cc=pradeep@us.ibm.com \
--cc=stelian@popies.net \
/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.