From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
To: Tejun Heo <tj@kernel.org>
Cc: linux-kernel@vger.kernel.org, mingo@elte.hu,
laijs@cn.fujitsu.com, dipankar@in.ibm.com,
akpm@linux-foundation.org, mathieu.desnoyers@polymtl.ca,
josh@joshtriplett.org, niv@us.ibm.com, tglx@linutronix.de,
peterz@infradead.org, rostedt@goodmis.org,
Valdis.Kletnieks@vt.edu, dhowells@redhat.com,
eric.dumazet@gmail.com, darren@dvhart.com
Subject: Re: [PATCH RFC tip/core/rcu 13/20] rcu: increase synchronize_sched_expedited() batching
Date: Sun, 19 Dec 2010 08:35:52 -0800 [thread overview]
Message-ID: <20101219163552.GF2143@linux.vnet.ibm.com> (raw)
In-Reply-To: <4D0DD3D2.4030606@kernel.org>
On Sun, Dec 19, 2010 at 10:43:46AM +0100, Tejun Heo wrote:
> Hello,
>
> On 12/18/2010 09:14 PM, Paul E. McKenney wrote:
> >>> diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h
> >>> index 49e8e16..af56148 100644
> >>> --- a/include/linux/rcupdate.h
> >>> +++ b/include/linux/rcupdate.h
> >>> @@ -47,6 +47,8 @@
> >>> extern int rcutorture_runnable; /* for sysctl */
> >>> #endif /* #ifdef CONFIG_RCU_TORTURE_TEST */
> >>>
> >>> +#define UINT_CMP_GE(a, b) (UINT_MAX / 2 >= (a) - (b))
> >>> +#define UINT_CMP_LT(a, b) (UINT_MAX / 2 < (a) - (b))
> >>> #define ULONG_CMP_GE(a, b) (ULONG_MAX / 2 >= (a) - (b))
> >>> #define ULONG_CMP_LT(a, b) (ULONG_MAX / 2 < (a) - (b))
> >>
> >> I don't think the original comparison had overflow problem. (a) < (b)
> >> gives the wrong result on overflow but (int)((a) - (b)) < 0 is
> >> correct.
> >
> > You are right that it does give the correct result now, but the C
> > standard never has defined overflow for signed integers, as noted in
> > Section 6.3.1.3p3 of the N1494 Working Draft of the C standard:
> >
> > Otherwise, the new type is signed and the value cannot be
> > represented in it; either the result is implementation-defined
> > or an implementation-defined signal is raised.
> >
> > I have heard too many compiler guys gleefully discussing optimizations
> > that they could use if they took full advantage of this clause, so I
> > am not comfortable relying on the intuitive semantics for signed
> > arithmetic. (Now atomic_t is another story -- both C and C++ will
> > be requiring twos-complement semantics, thankfully.)
> >
> >> I find the latter approach cleaner and that way the constant in the
> >> instruction can be avoided too although if the compiler might generate
> >> the same code regardless.
> >
> > I would like your way better if it was defined in the C standard.
> > But it unfortunately is not. :-(
>
> I see, then would something like the following work?
>
> (int)((unsigned)(a) - (unsigned)(b)) < 0
Unfortunately, no. :-(
The (int) converts from unsigned to signed, and if the upper bit of
the unsigned difference is non-zero, then the paragraph I quoted above
applies, and the standard allows the compiler to do whatever it wants.
> >> Also, I think the names are misleading. They aren't testing whether
> >> one is greater or less than the other. They're testing whether one is
> >> before or after the other where the counters are used as monotonically
> >> incrementing (with wrapping) sequence, so wouldn't something like the
> >> following be better?
> >
> > They are comparing the twos-complement difference between the two
> > numbers against zero.
>
> But still GE/LT are way too misleading. Anyways, so with the above
> change the macro now would look like the following.
I am not all that worried about the names. I can certainly live with
SEQ_TEST() just as easily as I can live with the current names.
> #define SEQ_TEST(a, b, op) ({ \
> typeof(a) __seq_a = (a); \
> typeof(b) __seq_b = (b); \
> bool __ret; \
> (void)(&__seq_a == &__seq_b); \
> switch (sizeof(__seq_a)) { \
> case sizeof(s8): \
> __ret = (s8)((u8)__seq_a - (u8)__seq_b) op 0; \
> break; \
> case sizeof(s16): \
> __ret = (s16)((u16)__seq_a - (u16)__seq_b) op 0;\
> break; \
> case sizeof(s32): \
> __ret = (s32)((u32)__seq_a - (u32)__seq_b) op 0;\
> break; \
> case sizeof(s64): \
> __ret = (s64)((u64)__seq_a - (u64)__seq_b) op 0;\
> break; \
> default: \
> __make_build_fail; \
> } \
> __ret; \
> })
>
> Would the above work?
Again, unfortunately, no. The (s8), (s16), (s32), and (s64) casts result
in implementation-defined behavior when the top bit of the difference is
set, just as with (int) above.
To remain within the confines of the standard, the entire computation
needs to be done using unsigned arithmetic. One way to do this might
be something like the following:
#define U8_MAX ((u8)(~0U))
#define U16_MAX ((u16)(~0U))
#define U32_MAX ((u32)(~0UL))
#define U64_MAX ((u64)(~0ULL))
#define SEQ_TEST(a, b, op) ({ \
typeof(a) __seq_a = (a); \
typeof(b) __seq_b = (b); \
bool __ret; \
(void)(&__seq_a == &__seq_b); \
switch (sizeof(__seq_a)) { \
case sizeof(s8): \
__ret = (U8_MAX / 2 op (u8)__seq_a - (u8)__seq_b);\
break; \
case sizeof(s16): \
__ret = (U16_MAX / 2 op (u16)__seq_a - (u16)__seq_b);\
break; \
case sizeof(s32): \
__ret = (U32_MAX / 2 op (u32)__seq_a - (u32)__seq_b);\
break; \
case sizeof(s64): \
__ret = (U64_MAX / 2 op (u64)__seq_a - (u64)__seq_b);\
break; \
default: \
__make_build_fail; \
} \
__ret; \
})
Make sense?
Thanx, Paul
next prev parent reply other threads:[~2010-12-19 16:36 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-12-17 20:54 [PATCH tip/core/rcu 0/20] second preview of RCU patches for 2.6.38 Paul E. McKenney
2010-12-17 20:54 ` [PATCH RFC tip/core/rcu 01/20] rcu: add priority-inversion testing to rcutorture Paul E. McKenney
2010-12-17 20:54 ` [PATCH RFC tip/core/rcu 02/20] rcu: move TINY_RCU from softirq to kthread Paul E. McKenney
2010-12-17 20:54 ` [PATCH RFC tip/core/rcu 03/20] rcu: priority boosting for TINY_PREEMPT_RCU Paul E. McKenney
2010-12-17 20:54 ` [PATCH RFC tip/core/rcu 04/20] rcu: add tracing for TINY_RCU and TINY_PREEMPT_RCU Paul E. McKenney
2010-12-17 20:54 ` [PATCH RFC tip/core/rcu 05/20] rcu: document TINY_RCU and TINY_PREEMPT_RCU tracing Paul E. McKenney
2010-12-17 20:54 ` [PATCH RFC tip/core/rcu 06/20] rcu: Distinguish between boosting and boosted Paul E. McKenney
2010-12-17 20:54 ` [PATCH RFC tip/core/rcu 07/20] rcu: get rid of obsolete "classic" names in TREE_RCU tracing Paul E. McKenney
2010-12-17 20:54 ` [PATCH RFC tip/core/rcu 08/20] rcu,cleanup: move synchronize_sched_expedited() out of sched.c Paul E. McKenney
2010-12-17 20:54 ` [PATCH RFC tip/core/rcu 09/20] rcu,cleanup: simplify the code when cpu is dying Paul E. McKenney
2010-12-17 20:54 ` [PATCH RFC tip/core/rcu 10/20] rcu: update documentation/comments for Lai's adoption patch Paul E. McKenney
2010-12-17 20:54 ` [PATCH RFC tip/core/rcu 11/20] rcu: fix race condition in synchronize_sched_expedited() Paul E. McKenney
2010-12-18 15:52 ` Tejun Heo
2010-12-18 19:58 ` Paul E. McKenney
2010-12-17 20:54 ` [PATCH RFC tip/core/rcu 12/20] rcu: Make synchronize_srcu_expedited() fast if running readers Paul E. McKenney
2010-12-17 20:54 ` [PATCH RFC tip/core/rcu 13/20] rcu: increase synchronize_sched_expedited() batching Paul E. McKenney
2010-12-18 16:13 ` Tejun Heo
2010-12-18 20:14 ` Paul E. McKenney
2010-12-19 9:43 ` Tejun Heo
2010-12-19 16:35 ` Paul E. McKenney [this message]
2010-12-20 10:33 ` Peter Zijlstra
2010-12-20 13:40 ` Mathieu Desnoyers
2010-12-20 10:31 ` Peter Zijlstra
2010-12-21 7:58 ` Paul E. McKenney
2010-12-17 20:54 ` [PATCH RFC tip/core/rcu 14/20] rcu: Stop chasing QS if another CPU did it for us Paul E. McKenney
2010-12-17 20:54 ` [PATCH RFC tip/core/rcu 15/20] rcu: Keep gpnum and completed fields synchronized Paul E. McKenney
2010-12-20 2:13 ` Lai Jiangshan
2010-12-20 2:14 ` Frederic Weisbecker
2010-12-20 16:51 ` Paul E. McKenney
2010-12-17 20:54 ` [PATCH RFC tip/core/rcu 16/20] rcu: fine-tune grace-period begin/end checks Paul E. McKenney
2010-12-17 20:54 ` [PATCH RFC tip/core/rcu 17/20] rcu: limit rcu_node leaf-level fanout Paul E. McKenney
2010-12-17 20:54 ` [PATCH RFC tip/core/rcu 18/20] rcu: reduce __call_rcu()-induced contention on rcu_node structures Paul E. McKenney
2010-12-17 20:54 ` [PATCH RFC tip/core/rcu 19/20] rculist: fix borked __list_for_each_rcu() macro Paul E. McKenney
2010-12-17 20:54 ` [PATCH RFC tip/core/rcu 20/20] rcu: remove unused " 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=20101219163552.GF2143@linux.vnet.ibm.com \
--to=paulmck@linux.vnet.ibm.com \
--cc=Valdis.Kletnieks@vt.edu \
--cc=akpm@linux-foundation.org \
--cc=darren@dvhart.com \
--cc=dhowells@redhat.com \
--cc=dipankar@in.ibm.com \
--cc=eric.dumazet@gmail.com \
--cc=josh@joshtriplett.org \
--cc=laijs@cn.fujitsu.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mathieu.desnoyers@polymtl.ca \
--cc=mingo@elte.hu \
--cc=niv@us.ibm.com \
--cc=peterz@infradead.org \
--cc=rostedt@goodmis.org \
--cc=tglx@linutronix.de \
--cc=tj@kernel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox