lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20080421054729.GA19864@linux.vnet.ibm.com>
Date:	Sun, 20 Apr 2008 22:47:29 -0700
From:	"Paul E. McKenney" <paulmck@...ux.vnet.ibm.com>
To:	Herbert Xu <herbert@...dor.apana.org.au>
Cc:	Linus Torvalds <torvalds@...ux-foundation.org>,
	"Rafael J. Wysocki" <rjw@...k.pl>,
	LKML <linux-kernel@...r.kernel.org>, Ingo Molnar <mingo@...e.hu>,
	Andrew Morton <akpm@...ux-foundation.org>,
	linux-ext4@...r.kernel.org
Subject: Re: 2.6.25-git2: BUG: unable to handle kernel paging request at ffffffffffffffff

On Sun, Apr 20, 2008 at 09:59:11PM -0700, Paul E. McKenney wrote:
> And here is an update with one bug fixed -- testing continues.
> This is an update of http://lkml.org/lkml/2008/4/20/217, deleting
> list_for_each_safe_rcu() and fixing hlist_for_each_entry_rcu().
> Testing continues...

And it passes.

							Thanx, Paul

> Signed-off-by: Paul E. McKenney <paulmck@...ux.vnet.ibm.com>
> ---
> 
>  list.h |   48 +++++++++++++++---------------------------------
>  1 file changed, 15 insertions(+), 33 deletions(-)
>  
> diff -urpNa -X dontdiff 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 21:48:29.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,9 @@ 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), \
> -			&pos->member != (head); \
> -		pos = list_entry(pos->member.next, typeof(*pos), member))
> +	for (pos = list_entry(rcu_dereference((head)->next), typeof(*pos), member); \
> +		prefetch(pos->member.next), &pos->member != (head); \
> +		pos = list_entry(rcu_dereference(pos->member.next), typeof(*pos), member))
>  
>  
>  /**
> @@ -686,9 +668,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 +968,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);			 \
> +	        pos && ({ 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"
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ