lkml.org 
[lkml]   [2014]   [Jul]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH 04/16] rcu: Remove redundant check for an online CPU
    On Wed, Jul 23, 2014 at 10:01:14AM -0400, Pranith Kumar wrote:
    > On Wed, Jul 23, 2014 at 9:41 AM, Paul E. McKenney
    > <paulmck@linux.vnet.ibm.com> wrote:
    > > On Wed, Jul 23, 2014 at 09:23:47AM -0400, Pranith Kumar wrote:
    > >> On Wed, Jul 23, 2014 at 8:09 AM, Paul E. McKenney
    > >> <paulmck@linux.vnet.ibm.com> wrote:
    > >> > On Wed, Jul 23, 2014 at 01:09:41AM -0400, Pranith Kumar wrote:
    > >> >> rcu_prcess_callbacks() is the softirq handler for RCU which is raised from
    > >> >> invoke_rcu_core() which is called from __call_rcu_core().
    > >> >>
    > >> >> Each of these three functions checks if the cpu is online. We can remove the
    > >> >> redundant ones. This commit removes one of these redundant check.
    > >> >>
    > >> >> Signed-off-by: Pranith Kumar <bobby.prani@gmail.com>
    > >> >
    > >> > Sorry, but no. There can be a long delay between raise_softirq() and
    > >> > this function starting, particularly if ksoftirqd gets involved. The
    > >> > CPU could easily go offline in the meantime.
    > >> >
    > >>
    > >> That makes sense. I guess one of the other two checks in
    > >> __call_rcu_core() or invoke_rcu_core() can go then?
    > >
    > > What would have to be the case for this suggested change to be safe?
    > > Does that condition in fact hold?
    > >
    >
    > The only scenario which is unsafe is when this thread is preempted and
    > scheduled on a dying CPU. In that case we should turn off interrupts.
    >
    > Actually, checking the code, I see that interrupts are turned off
    > already before we call _call_rcu_core(). So I am not sure such a case
    > will happen. On the other hand invoke_rcu_core() will be a one line
    > function which might as well be in-lined to avoid the double cpu
    > online check.
    >
    > What am I missing?

    I am not sure. Perhaps the fact that __call_rcu_core() doesn't call
    invoke_rcu_core() unless the condition holds (which means that you
    cannnot remove the check from __call_rcu_core()) or maybe the fact that
    invoke_rcu_core() is called from many other places, which means that
    you might not be able to remove the check from invoke_rcu_core().

    Thanx, Paul



    \
     
     \ /
      Last update: 2014-07-23 17:42    [W:5.970 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site