1. 11 7月, 2008 1 次提交
    • N
      Fix PREEMPT_RCU without HOTPLUG_CPU · 70ff0555
      Nick Piggin 提交于
      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: NNick Piggin <npiggin@suse.de>
      Reported-and-tested-by: NAlexey Dobriyan <adobriyan@gmail.com>
      Acked-by: NIngo Molnar <mingo@elte.hu>
      Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
      [ Nick is my personal hero of the day - Linus ]
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      70ff0555
  2. 19 6月, 2008 1 次提交
  3. 16 6月, 2008 1 次提交
  4. 25 5月, 2008 1 次提交
    • C
      Remove argument from open_softirq which is always NULL · 962cf36c
      Carlos R. Mafra 提交于
      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: NCarlos R. Mafra <crmafra@ift.unesp.br>
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      Signed-off-by: NThomas Gleixner <tglx@linutronix.de>
      962cf36c
  5. 19 5月, 2008 4 次提交
    • H
      rcu: remove duplicated include in kernel/rcupreempt.c · 247ab1a8
      Huang Weiyi 提交于
      Removed duplicated include file <linux/rcupdate.h> in kernel/rcupreempt.c.
      Signed-off-by: NHuang Weiyi <weiyi.huang@gmail.com>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      247ab1a8
    • P
      rcu: fix rcu_try_flip_waitack_needed() to prevent grace-period stall · d7c06513
      Paul E. McKenney 提交于
      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: NPaul E. McKenney <paulmck@linux.vnet.ibm.com>
      Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
      Cc: Josh Triplett <josh@kernel.org>
      Cc: Dipankar Sarma <dipankar@in.ibm.com>
      Cc: <stable@kernel.org>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      d7c06513
    • P
      rcu: add call_rcu_sched() · 4446a36f
      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: NPaul E. McKenney <paulmck@linux.vnet.ibm.com>
      Signed-off-by: NMathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      Signed-off-by: NThomas Gleixner <tglx@linutronix.de>
      4446a36f
    • S
      rcupreempt: remove duplicate prototypes · 8b09dee6
      Steven Rostedt 提交于
      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: NSteven Rostedt <srostedt@redhat.com>
      Signed-off-by: NIngo Molnar <mingo@elte.hu>
      8b09dee6
  6. 20 4月, 2008 1 次提交
  7. 01 3月, 2008 3 次提交
  8. 26 1月, 2008 2 次提交