Re: [PATCH] fib_trie: rcu_assign_pointer warning fix
On Tue, Feb 12, 2008 at 08:46:30PM +0100, Jarek Poplawski wrote: > On Tue, Feb 12, 2008 at 08:32:18PM +0100, Jarek Poplawski wrote: > ... > > It seems the above version of this macro uses the barrier for 0, but > > if I miss something, or for these other: documenting reasons, > > ...or __builtin_constants could be used for indexing (?!), Yep. For example: elem[0].next = 1; rcu_assign_index(global_index, 0); Thanx, Paul > > then of > > course you are right. > > Jarek P. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH] fib_trie: rcu_assign_pointer warning fix
On Tue, Feb 12, 2008 at 08:46:30PM +0100, Jarek Poplawski wrote: On Tue, Feb 12, 2008 at 08:32:18PM +0100, Jarek Poplawski wrote: ... It seems the above version of this macro uses the barrier for 0, but if I miss something, or for these other: documenting reasons, ...or __builtin_constants could be used for indexing (?!), Yep. For example: elem[0].next = 1; rcu_assign_index(global_index, 0); Thanx, Paul then of course you are right. Jarek P. -- To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH] fib_trie: rcu_assign_pointer warning fix
On Tue, Feb 12, 2008 at 08:32:18PM +0100, Jarek Poplawski wrote: ... > It seems the above version of this macro uses the barrier for 0, but > if I miss something, or for these other: documenting reasons, ...or __builtin_constants could be used for indexing (?!), > then of > course you are right. Jarek P. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH] fib_trie: rcu_assign_pointer warning fix
On Tue, Feb 12, 2008 at 08:07:29AM -0800, Paul E. McKenney wrote: ... > "All programmers are blind, especially me." Hmm... I got it my way: you - superheroes - sometimes seem to be just like us - common people... (Probably early in the morning, before dressing your funny costumes?) > You are right, Jarek. I ran this through gcc, and the following > comes close: > > #define rcu_assign_pointer(p, v) \ > ({ \ > if (!__builtin_constant_p(v) || (v)) \ > smp_wmb(); \ > (p) = (v); \ > }) > > But I am concerned about the following case: > > rcu_assign_pointer(global_index, 0); > > . . . > > x = global_array[rcu_dereference(global_index)]; > > Since arrays have a zero-th element, we would really want a memory > barrier in this case. It seems the above version of this macro uses the barrier for 0, but if I miss something, or for these other: documenting reasons, then of course you are right. > > So how about leaving the index-unfriendly version of rcu_assign_pointer() > and adding an rcu_assign_index() as follows? > > Thanx, Paul > > Signed-off-by: Paul E. McKenney <[EMAIL PROTECTED]> > --- > > rcupdate.h | 18 ++ > 1 file changed, 18 insertions(+) > > diff -urpNa -X dontdiff linux-2.6.24/include/linux/rcupdate.h > linux-2.6.24-rai/include/linux/rcupdate.h > --- linux-2.6.24/include/linux/rcupdate.h 2008-01-24 14:58:37.0 > -0800 > +++ linux-2.6.24-rai/include/linux/rcupdate.h 2008-02-12 08:04:59.0 > -0800 > @@ -278,6 +278,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 ---^ + * initialized array element that will be dereferenced by RCU Regards, Jarek P. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH] fib_trie: rcu_assign_pointer warning fix
On Tue, Feb 12, 2008 at 08:57:14AM +, Jarek Poplawski wrote: > On 12-02-2008 02:16, David Miller wrote: > > From: Stephen Hemminger <[EMAIL PROTECTED]> > > Date: Mon, 11 Feb 2008 16:59:54 -0800 > > > > linux-kernel added to CC:, any change to generic kernel infrastructure > > should be posted there > > > >> Eliminate warnings when rcu_assign_pointer is used with unsigned long. > >> It is reasonable to use RCU with non-pointer values so allow it for general > >> use. Add a comment to explain the if test. > >> > >> Signed-off-by: Stephen Hemminger <[EMAIL PROTECTED]> > >> --- > >> include/linux/rcupdate.h | 13 +++-- > >> 1 files changed, 7 insertions(+), 6 deletions(-) > >> > >> diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h > >> index 37a642c..c44ac87 100644 > >> --- a/include/linux/rcupdate.h > >> +++ b/include/linux/rcupdate.h > >> @@ -172,14 +172,15 @@ struct rcu_head { > >> * structure after the pointer assignment. More importantly, this > >> * call documents which pointers will be dereferenced by RCU read-side > >> * code. > >> + * > >> + * If value is the NULL (constant 0), then no barrier is needed. > >> */ > >> > >> -#define rcu_assign_pointer(p, v) \ > >> - ({ \ > >> - if (!__builtin_constant_p(v) || \ > >> - ((v) != NULL)) \ > >> - smp_wmb(); \ > >> - (p) = (v); \ > >> +#define rcu_assign_pointer(p, v) \ > >> + ({ \ > >> + if (!(__builtin_constant_p(v) && v))\ > > ...But, "If value is the NULL (constant 0)" we have: > > if (!(1 && NULL != 0)) ==> if (!(0)) and the barrier is used?! "All programmers are blind, especially me." You are right, Jarek. I ran this through gcc, and the following comes close: #define rcu_assign_pointer(p, v) \ ({ \ if (!__builtin_constant_p(v) || (v)) \ smp_wmb(); \ (p) = (v); \ }) But I am concerned about the following case: rcu_assign_pointer(global_index, 0); . . . x = global_array[rcu_dereference(global_index)]; Since arrays have a zero-th element, we would really want a memory barrier in this case. So how about leaving the index-unfriendly version of rcu_assign_pointer() and adding an rcu_assign_index() as follows? Thanx, Paul Signed-off-by: Paul E. McKenney <[EMAIL PROTECTED]> --- rcupdate.h | 18 ++ 1 file changed, 18 insertions(+) diff -urpNa -X dontdiff linux-2.6.24/include/linux/rcupdate.h linux-2.6.24-rai/include/linux/rcupdate.h --- linux-2.6.24/include/linux/rcupdate.h 2008-01-24 14:58:37.0 -0800 +++ linux-2.6.24-rai/include/linux/rcupdate.h 2008-02-12 08:04:59.0 -0800 @@ -278,6 +278,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 linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH] fib_trie: rcu_assign_pointer warning fix
On 12-02-2008 02:16, David Miller wrote: > From: Stephen Hemminger <[EMAIL PROTECTED]> > Date: Mon, 11 Feb 2008 16:59:54 -0800 > > linux-kernel added to CC:, any change to generic kernel infrastructure > should be posted there > >> Eliminate warnings when rcu_assign_pointer is used with unsigned long. >> It is reasonable to use RCU with non-pointer values so allow it for general >> use. Add a comment to explain the if test. >> >> Signed-off-by: Stephen Hemminger <[EMAIL PROTECTED]> >> --- >> include/linux/rcupdate.h | 13 +++-- >> 1 files changed, 7 insertions(+), 6 deletions(-) >> >> diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h >> index 37a642c..c44ac87 100644 >> --- a/include/linux/rcupdate.h >> +++ b/include/linux/rcupdate.h >> @@ -172,14 +172,15 @@ struct rcu_head { >> * structure after the pointer assignment. More importantly, this >> * call documents which pointers will be dereferenced by RCU read-side >> * code. >> + * >> + * If value is the NULL (constant 0), then no barrier is needed. >> */ >> >> -#define rcu_assign_pointer(p, v) \ >> -({ \ >> -if (!__builtin_constant_p(v) || \ >> -((v) != NULL)) \ >> -smp_wmb(); \ >> -(p) = (v); \ >> +#define rcu_assign_pointer(p, v)\ >> +({ \ >> +if (!(__builtin_constant_p(v) && v))\ ...But, "If value is the NULL (constant 0)" we have: if (!(1 && NULL != 0)) ==> if (!(0)) and the barrier is used?! >> +smp_wmb(); \ >> +(p) = (v); \ >> }) >> >> /** Regards, Jarek P. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH] fib_trie: rcu_assign_pointer warning fix
On 12-02-2008 02:16, David Miller wrote: From: Stephen Hemminger [EMAIL PROTECTED] Date: Mon, 11 Feb 2008 16:59:54 -0800 linux-kernel added to CC:, any change to generic kernel infrastructure should be posted there Eliminate warnings when rcu_assign_pointer is used with unsigned long. It is reasonable to use RCU with non-pointer values so allow it for general use. Add a comment to explain the if test. Signed-off-by: Stephen Hemminger [EMAIL PROTECTED] --- include/linux/rcupdate.h | 13 +++-- 1 files changed, 7 insertions(+), 6 deletions(-) diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h index 37a642c..c44ac87 100644 --- a/include/linux/rcupdate.h +++ b/include/linux/rcupdate.h @@ -172,14 +172,15 @@ struct rcu_head { * structure after the pointer assignment. More importantly, this * call documents which pointers will be dereferenced by RCU read-side * code. + * + * If value is the NULL (constant 0), then no barrier is needed. */ -#define rcu_assign_pointer(p, v) \ -({ \ -if (!__builtin_constant_p(v) || \ -((v) != NULL)) \ -smp_wmb(); \ -(p) = (v); \ +#define rcu_assign_pointer(p, v)\ +({ \ +if (!(__builtin_constant_p(v) v))\ ...But, If value is the NULL (constant 0) we have: if (!(1 NULL != 0)) == if (!(0)) and the barrier is used?! +smp_wmb(); \ +(p) = (v); \ }) /** Regards, Jarek P. -- To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH] fib_trie: rcu_assign_pointer warning fix
On Tue, Feb 12, 2008 at 08:32:18PM +0100, Jarek Poplawski wrote: ... It seems the above version of this macro uses the barrier for 0, but if I miss something, or for these other: documenting reasons, ...or __builtin_constants could be used for indexing (?!), then of course you are right. Jarek P. -- To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH] fib_trie: rcu_assign_pointer warning fix
On Tue, Feb 12, 2008 at 08:57:14AM +, Jarek Poplawski wrote: On 12-02-2008 02:16, David Miller wrote: From: Stephen Hemminger [EMAIL PROTECTED] Date: Mon, 11 Feb 2008 16:59:54 -0800 linux-kernel added to CC:, any change to generic kernel infrastructure should be posted there Eliminate warnings when rcu_assign_pointer is used with unsigned long. It is reasonable to use RCU with non-pointer values so allow it for general use. Add a comment to explain the if test. Signed-off-by: Stephen Hemminger [EMAIL PROTECTED] --- include/linux/rcupdate.h | 13 +++-- 1 files changed, 7 insertions(+), 6 deletions(-) diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h index 37a642c..c44ac87 100644 --- a/include/linux/rcupdate.h +++ b/include/linux/rcupdate.h @@ -172,14 +172,15 @@ struct rcu_head { * structure after the pointer assignment. More importantly, this * call documents which pointers will be dereferenced by RCU read-side * code. + * + * If value is the NULL (constant 0), then no barrier is needed. */ -#define rcu_assign_pointer(p, v) \ - ({ \ - if (!__builtin_constant_p(v) || \ - ((v) != NULL)) \ - smp_wmb(); \ - (p) = (v); \ +#define rcu_assign_pointer(p, v) \ + ({ \ + if (!(__builtin_constant_p(v) v))\ ...But, If value is the NULL (constant 0) we have: if (!(1 NULL != 0)) == if (!(0)) and the barrier is used?! All programmers are blind, especially me. You are right, Jarek. I ran this through gcc, and the following comes close: #define rcu_assign_pointer(p, v) \ ({ \ if (!__builtin_constant_p(v) || (v)) \ smp_wmb(); \ (p) = (v); \ }) But I am concerned about the following case: rcu_assign_pointer(global_index, 0); . . . x = global_array[rcu_dereference(global_index)]; Since arrays have a zero-th element, we would really want a memory barrier in this case. So how about leaving the index-unfriendly version of rcu_assign_pointer() and adding an rcu_assign_index() as follows? Thanx, Paul Signed-off-by: Paul E. McKenney [EMAIL PROTECTED] --- rcupdate.h | 18 ++ 1 file changed, 18 insertions(+) diff -urpNa -X dontdiff linux-2.6.24/include/linux/rcupdate.h linux-2.6.24-rai/include/linux/rcupdate.h --- linux-2.6.24/include/linux/rcupdate.h 2008-01-24 14:58:37.0 -0800 +++ linux-2.6.24-rai/include/linux/rcupdate.h 2008-02-12 08:04:59.0 -0800 @@ -278,6 +278,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 linux-kernel in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH] fib_trie: rcu_assign_pointer warning fix
From: "Paul E. McKenney" <[EMAIL PROTECTED]> Date: Mon, 11 Feb 2008 17:27:41 -0800 > On Mon, Feb 11, 2008 at 04:59:54PM -0800, Stephen Hemminger wrote: > > Eliminate warnings when rcu_assign_pointer is used with unsigned long. > > It is reasonable to use RCU with non-pointer values so allow it for general > > use. Add a comment to explain the if test. > > Good catch!!! (An apologies for the hassle!!!) > > Acked-by: Paul E. McKenney <[EMAIL PROTECTED]> Thanks for reviewing Paul, I'll apply this. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH] fib_trie: rcu_assign_pointer warning fix
From: Stephen Hemminger <[EMAIL PROTECTED]> Date: Mon, 11 Feb 2008 16:59:54 -0800 linux-kernel added to CC:, any change to generic kernel infrastructure should be posted there > Eliminate warnings when rcu_assign_pointer is used with unsigned long. > It is reasonable to use RCU with non-pointer values so allow it for general > use. Add a comment to explain the if test. > > Signed-off-by: Stephen Hemminger <[EMAIL PROTECTED]> > --- > include/linux/rcupdate.h | 13 +++-- > 1 files changed, 7 insertions(+), 6 deletions(-) > > diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h > index 37a642c..c44ac87 100644 > --- a/include/linux/rcupdate.h > +++ b/include/linux/rcupdate.h > @@ -172,14 +172,15 @@ struct rcu_head { > * structure after the pointer assignment. More importantly, this > * call documents which pointers will be dereferenced by RCU read-side > * code. > + * > + * If value is the NULL (constant 0), then no barrier is needed. > */ > > -#define rcu_assign_pointer(p, v) \ > - ({ \ > - if (!__builtin_constant_p(v) || \ > - ((v) != NULL)) \ > - smp_wmb(); \ > - (p) = (v); \ > +#define rcu_assign_pointer(p, v) \ > + ({ \ > + if (!(__builtin_constant_p(v) && v))\ > + smp_wmb(); \ > + (p) = (v); \ > }) > > /** > -- > 1.5.3.8 > -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[PATCH] fib_trie: rcu_assign_pointer warning fix
Eliminate warnings when rcu_assign_pointer is used with unsigned long. It is reasonable to use RCU with non-pointer values so allow it for general use. Add a comment to explain the if test. Signed-off-by: Stephen Hemminger <[EMAIL PROTECTED]> --- include/linux/rcupdate.h | 13 +++-- 1 files changed, 7 insertions(+), 6 deletions(-) diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h index 37a642c..c44ac87 100644 --- a/include/linux/rcupdate.h +++ b/include/linux/rcupdate.h @@ -172,14 +172,15 @@ struct rcu_head { * structure after the pointer assignment. More importantly, this * call documents which pointers will be dereferenced by RCU read-side * code. + * + * If value is the NULL (constant 0), then no barrier is needed. */ -#define rcu_assign_pointer(p, v) \ - ({ \ - if (!__builtin_constant_p(v) || \ - ((v) != NULL)) \ - smp_wmb(); \ - (p) = (v); \ +#define rcu_assign_pointer(p, v) \ + ({ \ + if (!(__builtin_constant_p(v) && v))\ + smp_wmb(); \ + (p) = (v); \ }) /** -- 1.5.3.8 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH] fib_trie: rcu_assign_pointer warning fix
From: Paul E. McKenney [EMAIL PROTECTED] Date: Mon, 11 Feb 2008 17:27:41 -0800 On Mon, Feb 11, 2008 at 04:59:54PM -0800, Stephen Hemminger wrote: Eliminate warnings when rcu_assign_pointer is used with unsigned long. It is reasonable to use RCU with non-pointer values so allow it for general use. Add a comment to explain the if test. Good catch!!! (An apologies for the hassle!!!) Acked-by: Paul E. McKenney [EMAIL PROTECTED] Thanks for reviewing Paul, I'll apply this. -- To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH] fib_trie: rcu_assign_pointer warning fix
From: Stephen Hemminger [EMAIL PROTECTED] Date: Mon, 11 Feb 2008 16:59:54 -0800 linux-kernel added to CC:, any change to generic kernel infrastructure should be posted there Eliminate warnings when rcu_assign_pointer is used with unsigned long. It is reasonable to use RCU with non-pointer values so allow it for general use. Add a comment to explain the if test. Signed-off-by: Stephen Hemminger [EMAIL PROTECTED] --- include/linux/rcupdate.h | 13 +++-- 1 files changed, 7 insertions(+), 6 deletions(-) diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h index 37a642c..c44ac87 100644 --- a/include/linux/rcupdate.h +++ b/include/linux/rcupdate.h @@ -172,14 +172,15 @@ struct rcu_head { * structure after the pointer assignment. More importantly, this * call documents which pointers will be dereferenced by RCU read-side * code. + * + * If value is the NULL (constant 0), then no barrier is needed. */ -#define rcu_assign_pointer(p, v) \ - ({ \ - if (!__builtin_constant_p(v) || \ - ((v) != NULL)) \ - smp_wmb(); \ - (p) = (v); \ +#define rcu_assign_pointer(p, v) \ + ({ \ + if (!(__builtin_constant_p(v) v))\ + smp_wmb(); \ + (p) = (v); \ }) /** -- 1.5.3.8 -- To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[PATCH] fib_trie: rcu_assign_pointer warning fix
Eliminate warnings when rcu_assign_pointer is used with unsigned long. It is reasonable to use RCU with non-pointer values so allow it for general use. Add a comment to explain the if test. Signed-off-by: Stephen Hemminger [EMAIL PROTECTED] --- include/linux/rcupdate.h | 13 +++-- 1 files changed, 7 insertions(+), 6 deletions(-) diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h index 37a642c..c44ac87 100644 --- a/include/linux/rcupdate.h +++ b/include/linux/rcupdate.h @@ -172,14 +172,15 @@ struct rcu_head { * structure after the pointer assignment. More importantly, this * call documents which pointers will be dereferenced by RCU read-side * code. + * + * If value is the NULL (constant 0), then no barrier is needed. */ -#define rcu_assign_pointer(p, v) \ - ({ \ - if (!__builtin_constant_p(v) || \ - ((v) != NULL)) \ - smp_wmb(); \ - (p) = (v); \ +#define rcu_assign_pointer(p, v) \ + ({ \ + if (!(__builtin_constant_p(v) v))\ + smp_wmb(); \ + (p) = (v); \ }) /** -- 1.5.3.8 -- To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/