16 Jul, 2008

2 commits


15 Jul, 2008

1 commit


11 Jul, 2008

2 commits

  • Conflicts:

    include/linux/rculist.h
    kernel/rcupreempt.c

    Signed-off-by: Ingo Molnar

    Ingo Molnar
     
  • PREEMPT_RCU without HOTPLUG_CPU is broken. The rcu_online_cpu is called
    to initially populate rcu_cpu_online_map with all online CPUs when the
    hotplug event handler is installed, and also to populate the map with
    CPUs as they come online. The former case is meant to happen with and
    without HOTPLUG_CPU, but without HOTPLUG_CPU, the rcu_offline_cpu
    function is no-oped -- while it still gets called, it does not set the
    rcu CPU map.

    With a blank RCU CPU map, grace periods get to tick by completely
    oblivious to active RCU read side critical sections. This results in
    free-before-grace bugs.

    Fix is obvious once the problem is known. (Also, change __devinit to
    __cpuinit so the function gets thrown away on !HOTPLUG_CPU kernels).

    Signed-off-by: Nick Piggin
    Reported-and-tested-by: Alexey Dobriyan
    Acked-by: Ingo Molnar
    Cc: Paul E. McKenney
    [ Nick is my personal hero of the day - Linus ]
    Signed-off-by: Linus Torvalds

    Nick Piggin
     

06 Jul, 2008

1 commit


23 Jun, 2008

1 commit


19 Jun, 2008

1 commit


16 Jun, 2008

1 commit


25 May, 2008

1 commit

  • As git-grep shows, open_softirq() is always called with the last argument
    being NULL

    block/blk-core.c: open_softirq(BLOCK_SOFTIRQ, blk_done_softirq, NULL);
    kernel/hrtimer.c: open_softirq(HRTIMER_SOFTIRQ, run_hrtimer_softirq, NULL);
    kernel/rcuclassic.c: open_softirq(RCU_SOFTIRQ, rcu_process_callbacks, NULL);
    kernel/rcupreempt.c: open_softirq(RCU_SOFTIRQ, rcu_process_callbacks, NULL);
    kernel/sched.c: open_softirq(SCHED_SOFTIRQ, run_rebalance_domains, NULL);
    kernel/softirq.c: open_softirq(TASKLET_SOFTIRQ, tasklet_action, NULL);
    kernel/softirq.c: open_softirq(HI_SOFTIRQ, tasklet_hi_action, NULL);
    kernel/timer.c: open_softirq(TIMER_SOFTIRQ, run_timer_softirq, NULL);
    net/core/dev.c: open_softirq(NET_TX_SOFTIRQ, net_tx_action, NULL);
    net/core/dev.c: open_softirq(NET_RX_SOFTIRQ, net_rx_action, NULL);

    This observation has already been made by Matthew Wilcox in June 2002
    (http://www.cs.helsinki.fi/linux/linux-kernel/2002-25/0687.html)

    "I notice that none of the current softirq routines use the data element
    passed to them."

    and the situation hasn't changed since them. So it appears we can safely
    remove that extra argument to save 128 (54) bytes of kernel data (text).

    Signed-off-by: Carlos R. Mafra
    Signed-off-by: Ingo Molnar
    Signed-off-by: Thomas Gleixner

    Carlos R. Mafra
     

24 May, 2008

1 commit


19 May, 2008

4 commits

  • Removed duplicated include file in kernel/rcupreempt.c.

    Signed-off-by: Huang Weiyi
    Signed-off-by: Andrew Morton
    Signed-off-by: Ingo Molnar

    Huang Weiyi
     
  • The comment was correct -- need to make the code match the comment.
    Without this patch, if a CPU goes dynticks idle (and stays there forever)
    in just the right phase of preemptible-RCU grace-period processing,
    grace periods stall. The offending sequence of events (courtesy
    of Promela/spin, at least after I got the liveness criterion coded
    correctly...) is as follows:

    o CPU 0 is in dynticks-idle mode. Its dynticks_progress_counter
    is (say) 10.

    o CPU 0 takes an interrupt, so rcu_irq_enter() increments CPU 0's
    dynticks_progress_counter to 11.

    o CPU 1 is doing RCU grace-period processing in rcu_try_flip_idle(),
    sees rcu_pending(), so invokes dyntick_save_progress_counter(),
    which in turn takes a snapshot of CPU 0's dynticks_progress_counter
    into CPU 0's rcu_dyntick_snapshot -- now set to 11. CPU 1 then
    updates the RCU grace-period state to rcu_try_flip_waitack().

    o CPU 0 returns from its interrupt, so rcu_irq_exit() increments
    CPU 0's dynticks_progress_counter to 12.

    o CPU 1 later invokes rcu_try_flip_waitack(), which notices that
    CPU 0 has not yet responded, and hence in turn invokes
    rcu_try_flip_waitack_needed(). This function examines the
    state of CPU 0's dynticks_progress_counter and rcu_dyntick_snapshot
    variables, which it copies to curr (== 12) and snap (== 11),
    respectively.

    Because curr!=snap, the first condition fails.

    Because curr-snap is only 1 and snap is odd, the second
    condition fails.

    rcu_try_flip_waitack_needed() therefore incorrectly concludes
    that it must wait for CPU 0 to explicitly acknowledge the
    counter flip.

    o CPU 0 remains forever in dynticks-idle mode, never taking
    any more hardware interrupts or any NMIs, and never running
    any more tasks. (Of course, -something- will usually eventually
    happen, which might be why we haven't seen this one in the
    wild. Still should be fixed!)

    Therefore the grace period never ends. Fix is to make the code match
    the comment, as shown below. With this fix, the above scenario
    would be satisfied with curr being even, and allow the grace period
    to proceed.

    Signed-off-by: Paul E. McKenney
    Cc: Peter Zijlstra
    Cc: Josh Triplett
    Cc: Dipankar Sarma
    Cc:
    Signed-off-by: Andrew Morton
    Signed-off-by: Ingo Molnar

    Paul E. McKenney
     
  • Fourth cut of patch to provide the call_rcu_sched(). This is again to
    synchronize_sched() as call_rcu() is to synchronize_rcu().

    Should be fine for experimental and -rt use, but not ready for inclusion.
    With some luck, I will be able to tell Andrew to come out of hiding on
    the next round.

    Passes multi-day rcutorture sessions with concurrent CPU hotplugging.

    Fixes since the first version include a bug that could result in
    indefinite blocking (spotted by Gautham Shenoy), better resiliency
    against CPU-hotplug operations, and other minor fixes.

    Fixes since the second version include reworking grace-period detection
    to avoid deadlocks that could happen when running concurrently with
    CPU hotplug, adding Mathieu's fix to avoid the softlockup messages,
    as well as Mathieu's fix to allow use earlier in boot.

    Fixes since the third version include a wrong-CPU bug spotted by
    Andrew, getting rid of the obsolete synchronize_kernel API that somehow
    snuck back in, merging spin_unlock() and local_irq_restore() in a
    few places, commenting the code that checks for quiescent states based
    on interrupting from user-mode execution or the idle loop, removing
    some inline attributes, and some code-style changes.

    Known/suspected shortcomings:

    o I still do not entirely trust the sleep/wakeup logic. Next step
    will be to use a private snapshot of the CPU online mask in
    rcu_sched_grace_period() -- if the CPU wasn't there at the start
    of the grace period, we don't need to hear from it. And the
    bit about accounting for changes in online CPUs inside of
    rcu_sched_grace_period() is ugly anyway.

    o It might be good for rcu_sched_grace_period() to invoke
    resched_cpu() when a given CPU wasn't responding quickly,
    but resched_cpu() is declared static...

    This patch also fixes a long-standing bug in the earlier preemptable-RCU
    implementation of synchronize_rcu() that could result in loss of
    concurrent external changes to a task's CPU affinity mask. I still cannot
    remember who reported this...

    Signed-off-by: Paul E. McKenney
    Signed-off-by: Mathieu Desnoyers
    Signed-off-by: Ingo Molnar
    Signed-off-by: Thomas Gleixner

    Paul E. McKenney
     
  • rcu_batches_completed and rcu_patches_completed_bh are both declared
    in rcuclassic.h and rcupreempt.h. This patch removes the extra
    prototypes for them from rcupdate.h.

    rcu_batches_completed_bh is defined as a static inline in the rcupreempt.h
    header file. Trying to export this as EXPORT_SYMBOL_GPL causes linking problems
    with the powerpc linker. There's no need to export a static inlined function.

    Modules must be compiled with the same type of RCU implementation as the
    kernel they are for.

    Signed-off-by: Steven Rostedt
    Signed-off-by: Ingo Molnar

    Steven Rostedt
     

20 Apr, 2008

1 commit

  • * Modify sched_affinity functions to pass cpumask_t variables by reference
    instead of by value.

    * Use new set_cpus_allowed_ptr function.

    Depends on:
    [sched-devel]: sched: add new set_cpus_allowed_ptr function

    Cc: Paul Jackson
    Cc: Cliff Wickman
    Signed-off-by: Mike Travis
    Signed-off-by: Ingo Molnar

    Mike Travis
     

01 Mar, 2008

3 commits

  • This patch fixes a potentially invalid access to a per-CPU variable in
    rcu_process_callbacks().

    This per-CPU access needs to be done in such a way as to guarantee that
    the code using it cannot move to some other CPU before all uses of the
    value accessed have completed. Even though this code is currently only
    invoked from softirq context, which currrently cannot migrate to some
    other CPU, life would be better if this code did not silently make such
    an assumption.

    Signed-off-by: Paul E. McKenney
    Signed-off-by: Ingo Molnar

    Paul E. McKenney
     
  • This fixes a oops encountered when doing hibernate/resume in presence of
    PREEMPT_RCU.

    The problem was that the code failed to disable preemption when
    accessing a per-CPU variable. This is OK when called from code that
    already has preemption disabled, but such is not the case from the
    suspend/resume code path.

    Reported-by: Dave Young
    Tested-by: Dave Young
    Signed-off-by: Paul E. McKenney
    Signed-off-by: Ingo Molnar

    Paul E. McKenney
     
  • The PREEMPT-RCU can get stuck if a CPU goes idle and NO_HZ is set. The
    idle CPU will not progress the RCU through its grace period and a
    synchronize_rcu my get stuck. Without this patch I have a box that will
    not boot when PREEMPT_RCU and NO_HZ are set. That same box boots fine
    with this patch.

    This patch comes from the -rt kernel where it has been tested for
    several months.

    Signed-off-by: Steven Rostedt
    Signed-off-by: Paul E. McKenney
    Signed-off-by: Ingo Molnar

    Steven Rostedt
     

26 Jan, 2008

2 commits

  • This patch allows preemptible RCU to tolerate CPU-hotplug operations.
    It accomplishes this by maintaining a local copy of a map of online
    CPUs, which it accesses under its own lock.

    Signed-off-by: Gautham R Shenoy
    Signed-off-by: Paul E. McKenney
    Reviewed-by: Steven Rostedt
    Signed-off-by: Ingo Molnar

    Paul E. McKenney
     
  • This patch implements a new version of RCU which allows its read-side
    critical sections to be preempted. It uses a set of counter pairs
    to keep track of the read-side critical sections and flips them
    when all tasks exit read-side critical section. The details
    of this implementation can be found in this paper -

    http://www.rdrop.com/users/paulmck/RCU/OLSrtRCU.2006.08.11a.pdf

    and the article-

    http://lwn.net/Articles/253651/

    This patch was developed as a part of the -rt kernel development and
    meant to provide better latencies when read-side critical sections of
    RCU don't disable preemption. As a consequence of keeping track of RCU
    readers, the readers have a slight overhead (optimizations in the paper).
    This implementation co-exists with the "classic" RCU implementations
    and can be switched to at compiler.

    Also includes RCU tracing summarized in debugfs.

    [ akpm@linux-foundation.org: build fixes on non-preempt architectures ]

    Signed-off-by: Gautham R Shenoy
    Signed-off-by: Dipankar Sarma
    Signed-off-by: Paul E. McKenney
    Reviewed-by: Steven Rostedt
    Signed-off-by: Ingo Molnar

    Paul E. McKenney