Re: [PATCH 2/2] add rcu_assign_index() if ever needed

2008-02-14 Thread Paul E. McKenney
On Thu, Feb 14, 2008 at 09:02:09AM +0530, Gautham R Shenoy wrote:
 On Wed, Feb 13, 2008 at 02:05:15PM -0800, Paul E. McKenney wrote:
  Hello again!
  
  This is a speculative patch that as far as I can tell is not yet required.
  If anyone applies RCU to a data structure allocated out of an array, using
  array indexes in place of pointers to link the array elements together,
  then the rcu_assign_index() function in this patch will be needed to
  assign a given element's array index to the RCU-traversed index.  The
  implementation is exactly that of the old rcu_assign_pointer(), so is
  extremely well tested.
  
  The existing rcu_assign_pointer() will emit a compiler warning in cases
  where rcu_assign_index() is required.
  
  Signed-off-by: Paul E. McKenney [EMAIL PROTECTED]
  ---
  
   rcupdate.h |   18 ++
   1 file changed, 18 insertions(+)
  
  diff -urpNa -X dontdiff linux-2.6.24-rap/include/linux/rcupdate.h 
  linux-2.6.24-rai/include/linux/rcupdate.h
  --- linux-2.6.24-rap/include/linux/rcupdate.h   2008-02-13 
  13:36:47.0 -0800
  +++ linux-2.6.24-rai/include/linux/rcupdate.h   2008-02-13 
  10:55:40.0 -0800
  @@ -286,6 +286,24 @@ extern struct lockdep_map rcu_lock_map;
  })
  
   /**
  + * rcu_assign_index - assign (publicize) a index of a newly
  + * initialized array elementg that will be dereferenced by RCU
    
 
 I hope Andrew got that one while porting against the latest -mm :)
 
 Looks good otherwise.

Good catch!!!

Thanx, Paul
--
To unsubscribe from this list: send the line unsubscribe netdev in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 2/2] add rcu_assign_index() if ever needed

2008-02-14 Thread Randy Dunlap
On Wed, 13 Feb 2008 14:05:15 -0800 Paul E. McKenney wrote:

 Hello again!
 
 This is a speculative patch that as far as I can tell is not yet required.
 If anyone applies RCU to a data structure allocated out of an array, using
 array indexes in place of pointers to link the array elements together,
 then the rcu_assign_index() function in this patch will be needed to
 assign a given element's array index to the RCU-traversed index.  The
 implementation is exactly that of the old rcu_assign_pointer(), so is
 extremely well tested.
 
 The existing rcu_assign_pointer() will emit a compiler warning in cases
 where rcu_assign_index() is required.
 
 Signed-off-by: Paul E. McKenney [EMAIL PROTECTED]
 ---
 
  rcupdate.h |   18 ++
  1 file changed, 18 insertions(+)
 
 diff -urpNa -X dontdiff linux-2.6.24-rap/include/linux/rcupdate.h 
 linux-2.6.24-rai/include/linux/rcupdate.h
 --- linux-2.6.24-rap/include/linux/rcupdate.h 2008-02-13 13:36:47.0 
 -0800
 +++ linux-2.6.24-rai/include/linux/rcupdate.h 2008-02-13 10:55:40.0 
 -0800
 @@ -286,6 +286,24 @@ extern struct lockdep_map rcu_lock_map;
   })
  
  /**
 + * rcu_assign_index - assign (publicize) a index of a newly
 + * initialized array elementg that will be dereferenced by RCU
 + * read-side critical sections.  Returns the value assigned.
 + *
 + * Inserts memory barriers on architectures that require them
 + * (pretty much all of them other than x86), and also prevents
 + * the compiler from reordering the code that initializes the
 + * structure after the index assignment.  More importantly, this
 + * call documents which indexes will be dereferenced by RCU read-side
 + * code.
 + */

s/a index/index/

Along with Gautham's typo fix, you could also make this be passable
kernel-doc notation.  :)


See Documentation/kernel-doc-nano-HOWTO.txt for details.

Summary:
The function (or macro) name and short description must be on one line.
This is followed by the parameters, then a blank (actually  *) line,
then any (longer) description, notes, etc.  So basically:

/**
 * rcu_assign_index - assign (publicize) index of a newly initialized array 
element
 * @p: description of @p
 * @v: description of @v
 *
 * This function assigns (publicizes) the index of a newly
 * initialized array element that will be dereferenced by RCU
 * read-side critical sections.  Returns the value assigned.
 *
 * Inserts memory barriers on architectures that require them
 * (pretty much all of them other than x86), and also prevents
 * the compiler from reordering the code that initializes the
 * structure after the index assignment.  More importantly, this
 * call documents which indexes will be dereferenced by RCU read-side
 * code.
 */


 +
 +#define rcu_assign_index(p, v)   ({ \
 + smp_wmb(); \
 + (p) = (v); \
 + })
 +
 +/**
   * synchronize_sched - block until all CPUs have exited any non-preemptive
   * kernel code sequences.
   *

---
~Randy
--
To unsubscribe from this list: send the line unsubscribe netdev in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 2/2] add rcu_assign_index() if ever needed

2008-02-14 Thread Paul E. McKenney
On Thu, Feb 14, 2008 at 09:24:27AM -0800, Randy Dunlap wrote:
 On Wed, 13 Feb 2008 14:05:15 -0800 Paul E. McKenney wrote:
 
  Hello again!
  
  This is a speculative patch that as far as I can tell is not yet required.
  If anyone applies RCU to a data structure allocated out of an array, using
  array indexes in place of pointers to link the array elements together,
  then the rcu_assign_index() function in this patch will be needed to
  assign a given element's array index to the RCU-traversed index.  The
  implementation is exactly that of the old rcu_assign_pointer(), so is
  extremely well tested.
  
  The existing rcu_assign_pointer() will emit a compiler warning in cases
  where rcu_assign_index() is required.
  
  Signed-off-by: Paul E. McKenney [EMAIL PROTECTED]
  ---
  
   rcupdate.h |   18 ++
   1 file changed, 18 insertions(+)
  
  diff -urpNa -X dontdiff linux-2.6.24-rap/include/linux/rcupdate.h 
  linux-2.6.24-rai/include/linux/rcupdate.h
  --- linux-2.6.24-rap/include/linux/rcupdate.h   2008-02-13 
  13:36:47.0 -0800
  +++ linux-2.6.24-rai/include/linux/rcupdate.h   2008-02-13 
  10:55:40.0 -0800
  @@ -286,6 +286,24 @@ extern struct lockdep_map rcu_lock_map;
  })
   
   /**
  + * rcu_assign_index - assign (publicize) a index of a newly
  + * initialized array elementg that will be dereferenced by RCU
  + * read-side critical sections.  Returns the value assigned.
  + *
  + * Inserts memory barriers on architectures that require them
  + * (pretty much all of them other than x86), and also prevents
  + * the compiler from reordering the code that initializes the
  + * structure after the index assignment.  More importantly, this
  + * call documents which indexes will be dereferenced by RCU read-side
  + * code.
  + */
 
 s/a index/index/
 
 Along with Gautham's typo fix, you could also make this be passable
 kernel-doc notation.  :)

Guess I should do the same for rcu_assign_pointer() and probably several
others as well...  Good catch!!!

Thanx, Paul

 See Documentation/kernel-doc-nano-HOWTO.txt for details.
 
 Summary:
 The function (or macro) name and short description must be on one line.
 This is followed by the parameters, then a blank (actually  *) line,
 then any (longer) description, notes, etc.  So basically:
 
 /**
  * rcu_assign_index - assign (publicize) index of a newly initialized array 
 element
  * @p: description of @p
  * @v: description of @v
  *
  * This function assigns (publicizes) the index of a newly
  * initialized array element that will be dereferenced by RCU
  * read-side critical sections.  Returns the value assigned.
  *
  * Inserts memory barriers on architectures that require them
  * (pretty much all of them other than x86), and also prevents
  * the compiler from reordering the code that initializes the
  * structure after the index assignment.  More importantly, this
  * call documents which indexes will be dereferenced by RCU read-side
  * code.
  */
 
 
  +
  +#define rcu_assign_index(p, v) ({ \
  +   smp_wmb(); \
  +   (p) = (v); \
  +   })
  +
  +/**
* synchronize_sched - block until all CPUs have exited any non-preemptive
* kernel code sequences.
*
 
 ---
 ~Randy
--
To unsubscribe from this list: send the line unsubscribe netdev in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 2/2] add rcu_assign_index() if ever needed

2008-02-13 Thread Paul E. McKenney
Hello again!

This is a speculative patch that as far as I can tell is not yet required.
If anyone applies RCU to a data structure allocated out of an array, using
array indexes in place of pointers to link the array elements together,
then the rcu_assign_index() function in this patch will be needed to
assign a given element's array index to the RCU-traversed index.  The
implementation is exactly that of the old rcu_assign_pointer(), so is
extremely well tested.

The existing rcu_assign_pointer() will emit a compiler warning in cases
where rcu_assign_index() is required.

Signed-off-by: Paul E. McKenney [EMAIL PROTECTED]
---

 rcupdate.h |   18 ++
 1 file changed, 18 insertions(+)

diff -urpNa -X dontdiff linux-2.6.24-rap/include/linux/rcupdate.h 
linux-2.6.24-rai/include/linux/rcupdate.h
--- linux-2.6.24-rap/include/linux/rcupdate.h   2008-02-13 13:36:47.0 
-0800
+++ linux-2.6.24-rai/include/linux/rcupdate.h   2008-02-13 10:55:40.0 
-0800
@@ -286,6 +286,24 @@ extern struct lockdep_map rcu_lock_map;
})
 
 /**
+ * rcu_assign_index - assign (publicize) a index of a newly
+ * initialized array elementg that will be dereferenced by RCU
+ * read-side critical sections.  Returns the value assigned.
+ *
+ * Inserts memory barriers on architectures that require them
+ * (pretty much all of them other than x86), and also prevents
+ * the compiler from reordering the code that initializes the
+ * structure after the index assignment.  More importantly, this
+ * call documents which indexes will be dereferenced by RCU read-side
+ * code.
+ */
+
+#define rcu_assign_index(p, v) ({ \
+   smp_wmb(); \
+   (p) = (v); \
+   })
+
+/**
  * synchronize_sched - block until all CPUs have exited any non-preemptive
  * kernel code sequences.
  *
--
To unsubscribe from this list: send the line unsubscribe netdev in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 2/2] add rcu_assign_index() if ever needed

2008-02-13 Thread Andrew Morton
On Thu, 14 Feb 2008 09:02:09 +0530 Gautham R Shenoy [EMAIL PROTECTED] wrote:

   /**
  + * rcu_assign_index - assign (publicize) a index of a newly
  + * initialized array elementg that will be dereferenced by RCU
    
 
 I hope Andrew got that one while porting against the latest -mm :)

I don't actually read the comments - I just like to make sure they're
there ;)
--
To unsubscribe from this list: send the line unsubscribe netdev in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html