All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
To: Herbert Xu <herbert@gondor.apana.org.au>
Cc: Linus Torvalds <torvalds@linux-foundation.org>,
	"Rafael J. Wysocki" <rjw@sisk.pl>,
	LKML <linux-kernel@vger.kernel.org>, Ingo Molnar <mingo@elte.hu>,
	Andrew Morton <akpm@linux-foundation.org>,
	linux-ext4@vger.kernel.org
Subject: Re: 2.6.25-git2: BUG: unable to handle kernel paging request at ffffffffffffffff
Date: Sun, 20 Apr 2008 19:08:07 -0700	[thread overview]
Message-ID: <20080421020806.GL20138@linux.vnet.ibm.com> (raw)
In-Reply-To: <20080421011855.GA6243@gondor.apana.org.au>

On Mon, Apr 21, 2008 at 09:18:55AM +0800, Herbert Xu wrote:
> Hi Linus:
> 
> On Sun, Apr 20, 2008 at 02:31:48PM -0700, Linus Torvalds wrote:
> >
> > Talking about RCU I also think that whoever did those "rcu_dereference()" 
> > macros in <linux/list.h> was insane. It's totally pointless to do 
> > "rcu_dereference()" on a local variable. It simply *cannot* make sense. 
> > Herbert, Paul, you guys should look at it.
> 
> Since I made the macros look this way I'm obliged to defend it :)
> 
> >  #define list_for_each_rcu(pos, head) \
> > -	for (pos = (head)->next; \
> > -		prefetch(rcu_dereference(pos)->next), pos != (head); \
> > -        	pos = pos->next)
> > +	for (pos = rcu_dereference((head)->next); \
> > +		prefetch(pos->next), pos != (head); \
> > +        	pos = rcu_dereference(pos->next))
> 
> Semantically there should be no difference between the two versions.
> The purpose of rcu_dereference is really similar to smp_rmb, i.e.,
> it adds a (conditional) read barrier between what has been read so
> far (including its argument), and what will be read subsequently.
> 
> So if we expand out the current code it would look like
> 
> 	fetch (head)->next
> 	store into pos
> again:
> 	smp_read_barrier_depends()
> 	prefetch(pos->next)
> 	pos != (head)
> 
> 	...loop body...
> 
> 	fetch pos->next
> 	store into pos
> 	goto again
> 
> Yours looks like
> 
> 	fetch (head)->next
> 	smp_read_barrier_depends()
> 	store into pos
> again:
> 	prefetch(pos->next)
> 	pos != (head)
> 
> 	...loop body...
> 
> 	fetch pos->next
> 	smp_read_barrier_depends()
> 	store into pos
> 	goto again
> 
> As the objective here is to insert a barrier before dereferencing
> pos (e.g., reading pos->next or using it in the loop body), these
> two should be identical.
> 
> But I do concede that your version looks clearer, and has the
> benefit that should prefetch ever be optimised out with no side-
> effects, yours would still be correct while the current one will
> lose the barrier completely.

Agreed as well -- compilers would also be within their right to bypass
the rcu_dereference() around the test/prefetch, which would allow
them to refetch.  For example, with __list_for_each_rcu(), the original
implementation allows the compiler to treat a use of "pos" within the body
of the loop as if it was a use of (head)->next, refetching if convenient.
Not so good.

So good catch, Linus!!!

Could we also eliminate the (both unused in 2.6.25 and useless as
well) list_for_each_safe_rcu()?  After all, if you use list_del_rcu()
and call_rcu(), all the RCU list-traversal primitives are "safe" in
this sense.  Patch attached (testing in progress), based on Linus's
earlier patch.

Signed_off_by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
---

 list.h |   47 +++++++++++++++--------------------------------
 1 file changed, 15 insertions(+), 32 deletions(-)

diff -urpNa linux-2.6.25/include/linux/list.h linux-2.6.25-rcu-list/include/linux/list.h
--- linux-2.6.25/include/linux/list.h	2008-04-16 19:49:44.000000000 -0700
+++ linux-2.6.25-rcu-list/include/linux/list.h	2008-04-20 18:44:55.000000000 -0700
@@ -631,31 +631,14 @@ static inline void list_splice_init_rcu(
  * as long as the traversal is guarded by rcu_read_lock().
  */
 #define list_for_each_rcu(pos, head) \
-	for (pos = (head)->next; \
-		prefetch(rcu_dereference(pos)->next), pos != (head); \
-        	pos = pos->next)
+	for (pos = rcu_dereference((head)->next); \
+		prefetch(pos->next), pos != (head); \
+        	pos = rcu_dereference(pos->next))
 
 #define __list_for_each_rcu(pos, head) \
-	for (pos = (head)->next; \
-		rcu_dereference(pos) != (head); \
-        	pos = pos->next)
-
-/**
- * list_for_each_safe_rcu
- * @pos:	the &struct list_head to use as a loop cursor.
- * @n:		another &struct list_head to use as temporary storage
- * @head:	the head for your list.
- *
- * Iterate over an rcu-protected list, safe against removal of list entry.
- *
- * This list-traversal primitive may safely run concurrently with
- * the _rcu list-mutation primitives such as list_add_rcu()
- * as long as the traversal is guarded by rcu_read_lock().
- */
-#define list_for_each_safe_rcu(pos, n, head) \
-	for (pos = (head)->next; \
-		n = rcu_dereference(pos)->next, pos != (head); \
-		pos = n)
+	for (pos = rcu_dereference((head)->next); \
+		pos != (head); \
+        	pos = rcu_dereference(pos->next))
 
 /**
  * list_for_each_entry_rcu	-	iterate over rcu list of given type
@@ -668,10 +651,10 @@ static inline void list_splice_init_rcu(
  * as long as the traversal is guarded by rcu_read_lock().
  */
 #define list_for_each_entry_rcu(pos, head, member) \
-	for (pos = list_entry((head)->next, typeof(*pos), member); \
-		prefetch(rcu_dereference(pos)->member.next), \
+	for (pos = list_entry(rcu_dereference((head)->next), typeof(*pos), member); \
+		prefetch(pos->member.next), \
 			&pos->member != (head); \
-		pos = list_entry(pos->member.next, typeof(*pos), member))
+		pos = list_entry(rcu_dereference(pos->member.next), typeof(*pos), member))
 
 
 /**
@@ -686,9 +669,9 @@ static inline void list_splice_init_rcu(
  * as long as the traversal is guarded by rcu_read_lock().
  */
 #define list_for_each_continue_rcu(pos, head) \
-	for ((pos) = (pos)->next; \
-		prefetch(rcu_dereference((pos))->next), (pos) != (head); \
-        	(pos) = (pos)->next)
+	for ((pos) = rcu_dereference((pos)->next); \
+		prefetch((pos)->next), (pos) != (head); \
+        	(pos) = rcu_dereference((pos)->next))
 
 /*
  * Double linked lists with a single pointer list head.
@@ -986,10 +969,10 @@ static inline void hlist_add_after_rcu(s
  * as long as the traversal is guarded by rcu_read_lock().
  */
 #define hlist_for_each_entry_rcu(tpos, pos, head, member)		 \
-	for (pos = (head)->first;					 \
-	     rcu_dereference(pos) && ({ prefetch(pos->next); 1;}) &&	 \
+	for (pos = rcu_dereference((head)->first);			 \
+	        ({ prefetch(pos->next); 1;}) &&				 \
 		({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \
-	     pos = pos->next)
+	     pos = rcu_dereference(pos->next))
 
 #else
 #warning "don't include kernel headers in userspace"

  reply	other threads:[~2008-04-21  2:08 UTC|newest]

Thread overview: 211+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-04-19 13:22 2.6.25-git1: Solid hang on HP nx6325 (64-bit) Rafael J. Wysocki
2008-04-20 19:04 ` 2.6.25-git2: BUG: unable to handle kernel paging request at ffffffffffffffff Rafael J. Wysocki
2008-04-20 19:04   ` Rafael J. Wysocki
2008-04-20 19:14   ` Rafael J. Wysocki
2008-04-20 19:14     ` Rafael J. Wysocki
2008-04-20 21:31   ` Linus Torvalds
2008-04-21  1:18     ` Herbert Xu
2008-04-21  2:08       ` Paul E. McKenney [this message]
2008-04-21  4:59         ` Paul E. McKenney
2008-04-21  5:47           ` Paul E. McKenney
2008-04-21 13:00             ` Ingo Molnar
2008-04-21 16:06             ` Linus Torvalds
2008-04-21 16:24               ` Rafael J. Wysocki
2008-04-21 15:49         ` Linus Torvalds
2008-04-21 17:05           ` Paul E. McKenney
2008-04-21 17:30             ` Linus Torvalds
2008-04-21 17:43               ` Paul E. McKenney
2008-04-22  1:03           ` Herbert Xu
2008-04-22 13:36             ` Paul E. McKenney
2008-04-21 16:12     ` Rafael J. Wysocki
2008-04-21 16:54       ` Linus Torvalds
2008-04-21 17:06         ` Jiri Slaby
2008-04-21 17:19           ` Rafael J. Wysocki
2008-04-21 17:48           ` Linus Torvalds
2008-04-21 18:22             ` Rafael J. Wysocki
2008-04-21 18:22               ` Rafael J. Wysocki
2008-04-21 19:38             ` Jiri Slaby
2008-04-21 20:39         ` David Miller
2008-04-21 21:18           ` Jiri Slaby
2008-04-21 21:58             ` Jiri Slaby
2008-04-21 22:26               ` Jiri Slaby
2008-04-21 22:54                 ` Paul E. McKenney
2008-04-21 23:02                   ` Jiri Slaby
2008-04-21 23:02                     ` Jiri Slaby
2008-04-21 23:11                     ` Zdenek Kabelac
2008-04-21 23:11                       ` Zdenek Kabelac
2008-04-21 23:17                     ` Jiri Slaby
2008-04-22  0:54                       ` Rafael J. Wysocki
2008-04-22  1:14                         ` Linus Torvalds
2008-04-22  1:30                           ` Rafael J. Wysocki
2008-04-22  9:49                           ` Jiri Slaby
2008-04-22  9:53                             ` Ingo Molnar
2008-04-22 18:35                               ` Zdenek Kabelac
2008-04-22 18:48                                 ` Linus Torvalds
2008-04-22 20:34                                   ` device_pm_add (was: Re: 2.6.25-git2: BUG: unable to handle kernel paging request at ffffffffffffffff) Rafael J. Wysocki
2008-04-22 20:57                                     ` Rafael J. Wysocki
2008-04-22 20:57                                     ` Rafael J. Wysocki
2008-04-22 22:11                                       ` Greg KH
2008-04-22 22:11                                       ` Greg KH
2008-04-22 20:58                                     ` Linus Torvalds
2008-04-22 20:58                                       ` Linus Torvalds
2008-04-22 22:12                                       ` Greg KH
2008-04-22 22:12                                       ` Greg KH
2008-04-22 22:48                                       ` Rafael J. Wysocki
2008-04-22 22:48                                       ` Rafael J. Wysocki
2008-04-23  0:50                                       ` Rafael J. Wysocki
2008-04-23 14:56                                         ` Alan Stern
2008-04-23 14:56                                         ` Alan Stern
2008-04-23  0:50                                       ` Rafael J. Wysocki
2008-04-22 20:34                                   ` Rafael J. Wysocki
2008-04-23  8:50                                   ` 2.6.25-git2: BUG: unable to handle kernel paging request at ffffffffffffffff Zdenek Kabelac
2008-04-23  8:50                                     ` Zdenek Kabelac
2008-04-23 15:53                                     ` Linus Torvalds
2008-04-23 15:53                                       ` Linus Torvalds
2008-04-23 16:58                                       ` Pekka Enberg
2008-04-23 16:58                                         ` Pekka Enberg
2008-04-23 17:28                                         ` Zdenek Kabelac
2008-04-23 17:28                                           ` Zdenek Kabelac
2008-04-23 17:40                                       ` Ingo Molnar
2008-04-23 18:52                                       ` Pekka Enberg
2008-04-23 19:05                                         ` Christoph Lameter
2008-04-23 19:19                                           ` Pekka J Enberg
2008-04-23 19:28                                             ` Christoph Lameter
2008-04-23 20:27                                             ` Zdenek Kabelac
2008-04-24 22:26                                       ` Jiri Slaby
2008-04-24 22:41                                         ` Linus Torvalds
2008-04-25  0:57                                           ` Jiri Slaby
2008-04-24 23:45                                             ` Linus Torvalds
2008-04-25  7:36                                               ` Jiri Slaby
2008-04-25 14:09                                                 ` Pavel Machek
2008-04-25 15:30                                                 ` Rafael J. Wysocki
2008-04-25 17:10                                           ` Jiri Slaby
2008-04-25  9:13                                             ` David Miller
2008-04-25 12:15                                               ` Zdenek Kabelac
2008-04-25 12:27                                                 ` Zdenek Kabelac
2008-04-25 15:12                                               ` [PATCH 1/1] x86: fix text_poke Jiri Slaby
2008-04-28  0:51                                                 ` Jiri Slaby
2008-04-25 15:03                                                 ` Linus Torvalds
2008-04-25 15:17                                                   ` Andi Kleen
2008-04-25 19:36                                                     ` Christoph Lameter
2008-04-26  9:59                                                       ` Andi Kleen
2008-04-26 11:16                                                         ` Jiri Slaby
2008-04-26 11:34                                                           ` Andi Kleen
2008-04-28 20:24                                                         ` VIRTUAL_BUG_ON() Christoph Lameter
2008-05-01 19:22                                                           ` [RFC 1/1] mm: add virt to phys debug Jiri Slaby
2008-05-01 19:22                                                             ` Jiri Slaby
2008-05-01 19:22                                                             ` Jiri Slaby
2008-05-01 20:18                                                             ` Christoph Lameter
2008-05-01 20:18                                                               ` Christoph Lameter
2008-05-06 21:54                                                               ` Jiri Slaby
2008-05-06 21:54                                                                 ` Jiri Slaby
2008-05-07 17:30                                                                 ` Christoph Lameter
2008-05-07 17:30                                                                   ` Christoph Lameter
2008-05-13 14:38                                                               ` Jiri Slaby
2008-05-13 14:38                                                                 ` Jiri Slaby
2008-04-25 15:19                                                   ` [PATCH 1/1] x86: fix text_poke Ingo Molnar
2008-04-25 15:26                                                     ` Ingo Molnar
2008-04-25 15:32                                                       ` Ingo Molnar
2008-04-25 15:33                                                       ` Linus Torvalds
2008-04-25 15:48                                                         ` Andi Kleen
2008-04-25 16:06                                                           ` Linus Torvalds
2008-04-25 16:19                                                             ` Andi Kleen
2008-04-25 16:24                                                               ` Linus Torvalds
2008-04-25 16:33                                                                 ` Ingo Molnar
2008-04-25 18:13                                                                 ` Jeremy Fitzhardinge
2008-05-05  2:36                                                                   ` Nick Piggin
2008-04-25 16:30                                                               ` Mathieu Desnoyers
2008-04-25 16:42                                                                 ` H. Peter Anvin
2008-04-25 17:09                                                                   ` Mathieu Desnoyers
2008-04-25 18:37                                                                     ` Mathieu Desnoyers
2008-04-25 18:47                                                                       ` H. Peter Anvin
2008-04-25 19:19                                                                       ` H. Peter Anvin
2008-04-25 20:04                                                                         ` Mathieu Desnoyers
2008-04-25 20:09                                                                           ` H. Peter Anvin
2008-04-25 20:18                                                                       ` H. Peter Anvin
2008-04-25 20:37                                                                         ` Mathieu Desnoyers
2008-04-25 20:41                                                                           ` H. Peter Anvin
2008-04-25 20:51                                                                             ` Linus Torvalds
2008-04-25 21:12                                                                               ` Mathieu Desnoyers
2008-04-25 21:15                                                                                 ` H. Peter Anvin
2008-04-25 21:47                                                                                   ` Mathieu Desnoyers
2008-04-25 22:07                                                                                     ` H. Peter Anvin
2008-04-25 22:30                                                                                       ` Mathieu Desnoyers
2008-04-25 22:36                                                                                         ` Linus Torvalds
2008-04-28 20:21                                                                                           ` Ingo Molnar
2008-04-28 20:55                                                                                             ` Jeremy Fitzhardinge
2008-04-28 21:01                                                                                               ` H. Peter Anvin
2008-04-28 22:42                                                                                                 ` Mathieu Desnoyers
2008-04-28 20:43                                                                                           ` Mathieu Desnoyers
2008-04-28 21:02                                                                                             ` Jeremy Fitzhardinge
2008-05-04 15:03                                                                                               ` Mathieu Desnoyers
2008-05-04 16:18                                                                                                 ` H. Peter Anvin
2008-04-25 22:38                                                                                         ` H. Peter Anvin
2008-04-25 22:04                                                                                 ` Linus Torvalds
2008-04-25 23:00                                                                                   ` Mathieu Desnoyers
2008-04-25 23:13                                                                                     ` Jeremy Fitzhardinge
2008-04-25 23:34                                                                                       ` Masami Hiramatsu
2008-04-26  6:21                                                                                         ` Jeremy Fitzhardinge
2008-04-26 11:56                                                                                           ` Arnaldo Carvalho de Melo
2008-04-26 23:38                                                                                             ` Jeremy Fitzhardinge
2008-04-26 23:38                                                                                               ` Jeremy Fitzhardinge
2008-04-27  1:00                                                                                               ` Arnaldo Carvalho de Melo
2008-04-26  2:12                                                                                   ` Frank Ch. Eigler
2008-06-05 17:44                                                                                   ` Frank Ch. Eigler
2008-04-26  6:50                                                                                 ` Jeremy Fitzhardinge
2008-04-28  0:49                                                                                   ` Masami Hiramatsu
2008-04-25 21:02                                                                             ` David Miller
2008-04-25 21:11                                                                               ` H. Peter Anvin
2008-04-25 16:22                                                             ` Ingo Molnar
2008-04-25 16:37                                                               ` Linus Torvalds
2008-04-25 16:43                                                                 ` Ingo Molnar
2008-04-25 16:43                                                                   ` Ingo Molnar
2008-04-25 16:45                                                                 ` Ingo Molnar
2008-04-25 16:51                                                                   ` Linus Torvalds
2008-04-25 17:02                                                                     ` Ingo Molnar
2008-04-25 17:13                                                                       ` Linus Torvalds
2008-04-25 17:26                                                                         ` Andi Kleen
2008-04-25 17:29                                                                           ` Linus Torvalds
2008-04-25 17:53                                                                         ` Ingo Molnar
2008-04-25 18:04                                                                           ` Ingo Molnar
2008-04-25 18:09                                                                           ` Linus Torvalds
2008-04-25 18:19                                                                             ` Ingo Molnar
2008-04-25 18:19                                                                               ` Ingo Molnar
2008-04-25 18:56                                                                               ` Ingo Molnar
2008-04-25 18:13                                                                           ` Ingo Molnar
2008-04-25 16:52                                                                 ` Ingo Molnar
2008-04-25 16:56                                                                 ` Andi Kleen
2008-04-25 15:50                                                         ` Ingo Molnar
2008-04-25 15:57                                                           ` H. Peter Anvin
2008-04-25 18:53                                                             ` Pavel Machek
2008-04-25 16:11                                                           ` Linus Torvalds
2008-04-25 15:54                                                         ` Mathieu Desnoyers
2008-04-25 15:59                                                           ` Ingo Molnar
2008-04-25 16:11                                                             ` Mathieu Desnoyers
2008-04-25 15:27                                                     ` Andi Kleen
2008-04-25 20:18                                                   ` David Miller
2008-04-25 15:23                                               ` Jiri Slaby
2008-04-25  1:35                                         ` 2.6.25-git2: BUG: unable to handle kernel paging request at ffffffffffffffff David Miller
2008-04-25  1:48                                           ` Linus Torvalds
2008-04-25  1:57                                             ` David Miller
2008-04-25  7:41                                               ` Jiri Slaby
2008-04-25  7:45                                                 ` David Miller
2008-04-25  8:02                                                   ` Jiri Slaby
2008-04-25  8:18                                                   ` pci commands resume order [Was: 2.6.25-git2: BUG: unable to handle kernel paging request at ffffffffffffffff] Jiri Slaby
2008-04-25 17:11                                                     ` Jesse Barnes
2008-04-25 10:53                                                   ` 2.6.25-git2: BUG: unable to handle kernel paging request at ffffffffffffffff Craig Schlenter
2008-04-25  7:42                                           ` Jiri Slaby
2008-04-25  7:49                                             ` David Miller
2008-04-25  7:56                                               ` Jiri Slaby
2008-04-25  7:58                                                 ` David Miller
2008-04-25  8:00                                                   ` Jiri Slaby
2008-04-25 15:47                                                     ` Randy Dunlap
2008-04-22 21:46                                 ` Rafael J. Wysocki
2008-04-22 19:09                               ` Ingo Molnar
2008-04-22  1:15                   ` Rafael J. Wysocki
2008-04-22  1:25                     ` [ProbableSpam]Re: " Paul E. McKenney
2008-04-21 21:19           ` Linus Torvalds
2008-04-21 21:54             ` David Miller
2008-04-21 13:17   ` Ingo Molnar
2008-04-21 13:35     ` Rafael J. Wysocki
2008-04-21 18:56       ` Ingo Molnar

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=20080421020806.GL20138@linux.vnet.ibm.com \
    --to=paulmck@linux.vnet.ibm.com \
    --cc=akpm@linux-foundation.org \
    --cc=herbert@gondor.apana.org.au \
    --cc=linux-ext4@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@elte.hu \
    --cc=rjw@sisk.pl \
    --cc=torvalds@linux-foundation.org \
    /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.