All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Paul E. McKenney" <paulmck@us.ibm.com>
To: Lee Schermerhorn <Lee.Schermerhorn@hp.com>
Cc: Andrew Morton <akpm@osdl.org>,
	Nick Piggin <nickpiggin@yahoo.com.au>,
	Christoph Lameter <clameter@sgi.com>,
	linux-mm <linux-mm@kvack.org>
Subject: Re: [PATCH] radix-tree:  cleanup radix_tree_deref_slot() and _lookup_slot() comments
Date: Wed, 23 Aug 2006 22:24:10 -0700	[thread overview]
Message-ID: <20060824052410.GD18961@us.ibm.com> (raw)
In-Reply-To: <1156278772.5622.23.camel@localhost>

On Tue, Aug 22, 2006 at 04:32:52PM -0400, Lee Schermerhorn wrote:
> Andrew:  here is a second patch that just cleans up [I think] the
> '_deref_slot() function, and adds more explanation of expected/required
> locking to the direct slot access functions.  I separated it out,
> because it doesn't fix a serious bug, like the previous one.
> 
> Paul:  do you agree that we don't need rcu_dereference() in the
> _deref_slot() as it can only be used while the tree is held [probably
> write] locked?  Do the comments look OK?

Yep, rcu_dereference() is not needed if the tree is prevented from
changing.  That said, rcu_dereference() is zero cost on all but
Alpha, so there is little benefit to be had from removing it.

The comments look much improved.

							Thanx, Paul

> Lee
> 
> Cleanup radix tree slot dereference and lookup comments - 2.6.18-rc4-mm2
> 
> radix_tree_deref_slot() was actually dereferencing the pointer
> in the assignment to the local variable 'slot' and then 
> rcu_dereference()ing the results of an expression [return value
> of an inline function]. 
> 
> Because we must hold the tree locked across lookup_slot() and
> _deref_slot(), we don't need the rcu_dereference() at all.
> 
> Added comments specifying required locking for _lookup_slot()
> and _deref_slot().
> 
> Signed-off-by:  Lee Schermerhorn <lee.schermerhorn@hp.com>
> 
> 
>  include/linux/radix-tree.h |    9 +++++++--
>  lib/radix-tree.c           |    5 ++++-
>  2 files changed, 11 insertions(+), 3 deletions(-)
> 
> Index: linux-2.6.18-rc4-mm2/lib/radix-tree.c
> ===================================================================
> --- linux-2.6.18-rc4-mm2.orig/lib/radix-tree.c	2006-08-22 14:47:06.000000000 -0400
> +++ linux-2.6.18-rc4-mm2/lib/radix-tree.c	2006-08-22 14:48:01.000000000 -0400
> @@ -336,7 +336,10 @@ EXPORT_SYMBOL(radix_tree_insert);
>   *	@root. This is useful for update-if-exists operations.
>   *
>   *	This function cannot be called under rcu_read_lock, it must be
> - *	excluded from writers, as must the returned slot.
> + *	excluded from writers, as must the returned slot for subsequent
> + *	use by radix_tree_deref_slot() and radix_tree_replace slot.
> + *	Caller must hold tree write locked across slot lookup and
> + *	replace.
>   */
>  void **radix_tree_lookup_slot(struct radix_tree_root *root, unsigned long index)
>  {
> Index: linux-2.6.18-rc4-mm2/include/linux/radix-tree.h
> ===================================================================
> --- linux-2.6.18-rc4-mm2.orig/include/linux/radix-tree.h	2006-08-22 14:47:45.000000000 -0400
> +++ linux-2.6.18-rc4-mm2/include/linux/radix-tree.h	2006-08-22 14:48:54.000000000 -0400
> @@ -122,12 +122,17 @@ do {									\
>  /**
>   * radix_tree_deref_slot	- dereference a slot
>   * @pslot:	pointer to slot, returned by radix_tree_lookup_slot
> - * @returns:	item that was stored in that slot.
> + * @returns:	item that was stored in that slot with any direct pointer flag
> + *		removed.
> + *
> + * For use with radix_tree_lookup_slot().  Caller must hold tree at least read
> + * locked across slot lookup and dereference.  More likely, will be used with
> + * radix_tree_replace_slot(), as well, so caller will hold tree write locked.
>   */
>  static inline void *radix_tree_deref_slot(void *pslot)
>  {
>  	void *slot = *(void **)pslot;
> -	return rcu_dereference(radix_tree_direct_to_ptr(slot));
> +	return radix_tree_direct_to_ptr(slot);
>  }
>  /**
>   * radix_tree_replace_slot	- replace item in a slot
> 
> 

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

  parent reply	other threads:[~2006-08-24  5:23 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-08-22 20:32 [PATCH] radix-tree: cleanup radix_tree_deref_slot() and _lookup_slot() comments Lee Schermerhorn
2006-08-23 17:51 ` Randy.Dunlap
2006-08-23 18:50   ` Lee Schermerhorn
2006-08-23 19:06     ` Randy.Dunlap
2006-08-24  5:24 ` Paul E. McKenney [this message]
2006-08-24 15:04   ` Lee Schermerhorn
2006-08-26  5:25     ` 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=20060824052410.GD18961@us.ibm.com \
    --to=paulmck@us.ibm.com \
    --cc=Lee.Schermerhorn@hp.com \
    --cc=akpm@osdl.org \
    --cc=clameter@sgi.com \
    --cc=linux-mm@kvack.org \
    --cc=nickpiggin@yahoo.com.au \
    /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.