1. 23 9月, 2011 2 次提交
    • O
      xen/pv-on-hvm kexec: add xs_reset_watches to shutdown watches from old kernel · ddacf5ef
      Olaf Hering 提交于
      Add new xs_reset_watches function to shutdown watches from old kernel after
      kexec boot.  The old kernel does not unregister all watches in the
      shutdown path.  They are still active, the double registration can not
      be detected by the new kernel.  When the watches fire, unexpected events
      will arrive and the xenwatch thread will crash (jumps to NULL).  An
      orderly reboot of a hvm guest will destroy the entire guest with all its
      resources (including the watches) before it is rebuilt from scratch, so
      the missing unregister is not an issue in that case.
      
      With this change the xenstored is instructed to wipe all active watches
      for the guest.  However, a patch for xenstored is required so that it
      accepts the XS_RESET_WATCHES request from a client (see changeset
      23839:42a45baf037d in xen-unstable.hg). Without the patch for xenstored
      the registration of watches will fail and some features of a PVonHVM
      guest are not available. The guest is still able to boot, but repeated
      kexec boots will fail.
      
      [v5: use xs_single instead of passing a dummy string to xs_talkv]
      [v4: ignore -EEXIST in xs_reset_watches]
      [v3: use XS_RESET_WATCHES instead of XS_INTRODUCE]
      [v2: move all code which deals with XS_INTRODUCE into xs_introduce()
          (based on feedback from Ian Campbell); remove casts from kvec assignment]
      Signed-off-by: NOlaf Hering <olaf@aepfle.de>
      [v1: Redid the git description a bit]
      Signed-off-by: NKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
      ddacf5ef
    • O
      xen/pv-on-hvm kexec: update xs_wire.h:xsd_sockmsg_type from xen-unstable · 3b082b25
      Olaf Hering 提交于
      Update include/xen/interface/io/xs_wire.h from xen-unstable.
      Now entries in xsd_sockmsg_type were added.
      Signed-off-by: NOlaf Hering <olaf@aepfle.de>
      Signed-off-by: NKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
      3b082b25
  2. 01 9月, 2011 3 次提交
    • O
      xen/pv-on-hvm kexec+kdump: reset PV devices in kexec or crash kernel · 116df6f0
      Olaf Hering 提交于
      After triggering a crash dump in a HVM guest, the PV backend drivers
      will remain in Connected state. When the kdump kernel starts the PV
      drivers will skip such devices. As a result, no root device is found and
      the vmcore cant be saved.
      
      A similar situation happens after a kexec boot, here the devices will be
      in the Closed state.
      
      With this change all frontend devices with state XenbusStateConnected or
      XenbusStateClosed will be reset by changing the state file to Closing ->
      Closed -> Initializing.  This will trigger a disconnect in the backend
      drivers. Now the frontend drivers will find the backend drivers in state
      Initwait and can connect.
      Signed-off-by: NOlaf Hering <olaf@aepfle.de>
      [v2:
        - add timeout when waiting for backend state change
        (based on feedback from Ian Campell)
        - extent printk message to include backend string
        - add comment to fall-through case in xenbus_reset_frontend]
      Signed-off-by: NKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
      116df6f0
    • O
      xen/pv-on-hvm kexec: rebind virqs to existing eventchannel ports · 62cc5fc7
      Olaf Hering 提交于
      During a kexec boot some virqs such as timer and debugirq were already
      registered by the old kernel.  The hypervisor will return -EEXISTS from
      the new EVTCHNOP_bind_virq request and the BUG in bind_virq_to_irq()
      triggers.  Catch the -EEXISTS error and loop through all possible ports to find
      what port belongs to the virq/cpu combo.
      Signed-off-by: NOlaf Hering <olaf@aepfle.de>
      [v2:
        - use NR_EVENT_CHANNELS instead of private MAX_EVTCHNS]
      Signed-off-by: NKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
      62cc5fc7
    • O
      xen/pv-on-hvm kexec: prevent crash in xenwatch_thread() when stale watch events arrive · c4c303c7
      Olaf Hering 提交于
      During repeated kexec boots xenwatch_thread() can crash because
      xenbus_watch->callback is cleared by xenbus_watch_path() if a node/token
      combo for a new watch happens to match an already registered watch from
      an old kernel.  In this case xs_watch returns -EEXISTS, then
      register_xenbus_watch() does not remove the to-be-registered watch from
      the list of active watches but returns the -EEXISTS to the caller
      anyway.
      
      Because the watch is still active in xenstored it will cause an event
      which will arrive in the new kernel. process_msg() will find the
      encapsulated struct xenbus_watch in its list of registered watches and
      puts the "empty" watch handle in the queue for xenwatch_thread().
      xenwatch_thread() then calls ->callback which was cleared earlier by
      xenbus_watch_path().
      
      To prevent that crash in a guest running on an old xen toolstack remove
      the special -EEXIST handling.
      
      v2:
       - remove the EEXIST handing in register_xenbus_watch() instead of
         checking for ->callback in process_msg()
      Signed-off-by: NKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
      Signed-off-by: NOlaf Hering <olaf@aepfle.de>
      c4c303c7
  3. 22 7月, 2011 10 次提交
  4. 21 7月, 2011 12 次提交
    • P
      2cebaa58
    • L
      Merge branch 'core-urgent-for-linus' of... · cf6ace16
      Linus Torvalds 提交于
      Merge branch 'core-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
      
      * 'core-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
        signal: align __lock_task_sighand() irq disabling and RCU
        softirq,rcu: Inform RCU of irq_exit() activity
        sched: Add irq_{enter,exit}() to scheduler_ipi()
        rcu: protect __rcu_read_unlock() against scheduler-using irq handlers
        rcu: Streamline code produced by __rcu_read_unlock()
        rcu: Fix RCU_BOOST race handling current->rcu_read_unlock_special
        rcu: decrease rcu_report_exp_rnp coupling with scheduler
      cf6ace16
    • L
      Merge branch 'sched-urgent-for-linus' of... · acc11eab
      Linus Torvalds 提交于
      Merge branch 'sched-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
      
      * 'sched-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
        sched: Avoid creating superfluous NUMA domains on non-NUMA systems
        sched: Allow for overlapping sched_domain spans
        sched: Break out cpu_power from the sched_group structure
      acc11eab
    • L
      Merge branch 'x86-urgent-for-linus' of... · 919d25a7
      Linus Torvalds 提交于
      Merge branch 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
      
      * 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
        x86. reboot: Make Dell Latitude E6320 use reboot=pci
        x86, doc only: Correct real-mode kernel header offset for init_size
        x86: Disable AMD_NUMA for 32bit for now
      919d25a7
    • I
      Merge branch 'rcu/urgent' of... · d1e9ae47
      Ingo Molnar 提交于
      Merge branch 'rcu/urgent' of git://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-2.6-rcu into core/urgent
      d1e9ae47
    • P
      signal: align __lock_task_sighand() irq disabling and RCU · a841796f
      Paul E. McKenney 提交于
      The __lock_task_sighand() function calls rcu_read_lock() with interrupts
      and preemption enabled, but later calls rcu_read_unlock() with interrupts
      disabled.  It is therefore possible that this RCU read-side critical
      section will be preempted and later RCU priority boosted, which means that
      rcu_read_unlock() will call rt_mutex_unlock() in order to deboost itself, but
      with interrupts disabled. This results in lockdep splats, so this commit
      nests the RCU read-side critical section within the interrupt-disabled
      region of code.  This prevents the RCU read-side critical section from
      being preempted, and thus prevents the attempt to deboost with interrupts
      disabled.
      
      It is quite possible that a better long-term fix is to make rt_mutex_unlock()
      disable irqs when acquiring the rt_mutex structure's ->wait_lock.
      Signed-off-by: NPaul E. McKenney <paul.mckenney@linaro.org>
      Signed-off-by: NPaul E. McKenney <paulmck@linux.vnet.ibm.com>
      a841796f
    • P
      softirq,rcu: Inform RCU of irq_exit() activity · ec433f0c
      Peter Zijlstra 提交于
      The rcu_read_unlock_special() function relies on in_irq() to exclude
      scheduler activity from interrupt level.  This fails because exit_irq()
      can invoke the scheduler after clearing the preempt_count() bits that
      in_irq() uses to determine that it is at interrupt level.  This situation
      can result in failures as follows:
      
       $task			IRQ		SoftIRQ
      
       rcu_read_lock()
      
       /* do stuff */
      
       <preempt> |= UNLOCK_BLOCKED
      
       rcu_read_unlock()
         --t->rcu_read_lock_nesting
      
      			irq_enter();
      			/* do stuff, don't use RCU */
      			irq_exit();
      			  sub_preempt_count(IRQ_EXIT_OFFSET);
      			  invoke_softirq()
      
      					ttwu();
      					  spin_lock_irq(&pi->lock)
      					  rcu_read_lock();
      					  /* do stuff */
      					  rcu_read_unlock();
      					    rcu_read_unlock_special()
      					      rcu_report_exp_rnp()
      					        ttwu()
      					          spin_lock_irq(&pi->lock) /* deadlock */
      
         rcu_read_unlock_special(t);
      
      Ed can simply trigger this 'easy' because invoke_softirq() immediately
      does a ttwu() of ksoftirqd/# instead of doing the in-place softirq stuff
      first, but even without that the above happens.
      
      Cure this by also excluding softirqs from the
      rcu_read_unlock_special() handler and ensuring the force_irqthreads
      ksoftirqd/# wakeup is done from full softirq context.
      
      [ Alternatively, delaying the ->rcu_read_lock_nesting decrement
        until after the special handling would make the thing more robust
        in the face of interrupts as well.  And there is a separate patch
        for that. ]
      
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Reported-and-tested-by: NEd Tomlinson <edt@aei.ca>
      Signed-off-by: NPeter Zijlstra <a.p.zijlstra@chello.nl>
      Signed-off-by: NPaul E. McKenney <paulmck@linux.vnet.ibm.com>
      ec433f0c
    • P
      sched: Add irq_{enter,exit}() to scheduler_ipi() · c5d753a5
      Peter Zijlstra 提交于
      Ensure scheduler_ipi() calls irq_{enter,exit} when it does some actual
      work. Traditionally we never did any actual work from the resched IPI
      and all magic happened in the return from interrupt path.
      
      Now that we do do some work, we need to ensure irq_{enter,exit} are
      called so that we don't confuse things.
      
      This affects things like timekeeping, NO_HZ and RCU, basically
      everything with a hook in irq_enter/exit.
      
      Explicit examples of things going wrong are:
      
        sched_clock_cpu() -- has a callback when leaving NO_HZ state to take
                          a new reading from GTOD and TSC. Without this
                          callback, time is stuck in the past.
      
        RCU -- needs in_irq() to work in order to avoid some nasty deadlocks
      Signed-off-by: NPeter Zijlstra <a.p.zijlstra@chello.nl>
      Signed-off-by: NPaul E. McKenney <paulmck@linux.vnet.ibm.com>
      c5d753a5
    • P
      rcu: protect __rcu_read_unlock() against scheduler-using irq handlers · 10f39bb1
      Paul E. McKenney 提交于
      The addition of RCU read-side critical sections within runqueue and
      priority-inheritance lock critical sections introduced some deadlock
      cycles, for example, involving interrupts from __rcu_read_unlock()
      where the interrupt handlers call wake_up().  This situation can cause
      the instance of __rcu_read_unlock() invoked from interrupt to do some
      of the processing that would otherwise have been carried out by the
      task-level instance of __rcu_read_unlock().  When the interrupt-level
      instance of __rcu_read_unlock() is called with a scheduler lock held
      from interrupt-entry/exit situations where in_irq() returns false,
      deadlock can result.
      
      This commit resolves these deadlocks by using negative values of
      the per-task ->rcu_read_lock_nesting counter to indicate that an
      instance of __rcu_read_unlock() is in flight, which in turn prevents
      instances from interrupt handlers from doing any special processing.
      This patch is inspired by Steven Rostedt's earlier patch that similarly
      made __rcu_read_unlock() guard against interrupt-mediated recursion
      (see https://lkml.org/lkml/2011/7/15/326), but this commit refines
      Steven's approach to avoid the need for preemption disabling on the
      __rcu_read_unlock() fastpath and to also avoid the need for manipulating
      a separate per-CPU variable.
      
      This patch avoids need for preempt_disable() by instead using negative
      values of the per-task ->rcu_read_lock_nesting counter.  Note that nested
      rcu_read_lock()/rcu_read_unlock() pairs are still permitted, but they will
      never see ->rcu_read_lock_nesting go to zero, and will therefore never
      invoke rcu_read_unlock_special(), thus preventing them from seeing the
      RCU_READ_UNLOCK_BLOCKED bit should it be set in ->rcu_read_unlock_special.
      This patch also adds a check for ->rcu_read_unlock_special being negative
      in rcu_check_callbacks(), thus preventing the RCU_READ_UNLOCK_NEED_QS
      bit from being set should a scheduling-clock interrupt occur while
      __rcu_read_unlock() is exiting from an outermost RCU read-side critical
      section.
      
      Of course, __rcu_read_unlock() can be preempted during the time that
      ->rcu_read_lock_nesting is negative.  This could result in the setting
      of the RCU_READ_UNLOCK_BLOCKED bit after __rcu_read_unlock() checks it,
      and would also result it this task being queued on the corresponding
      rcu_node structure's blkd_tasks list.  Therefore, some later RCU read-side
      critical section would enter rcu_read_unlock_special() to clean up --
      which could result in deadlock if that critical section happened to be in
      the scheduler where the runqueue or priority-inheritance locks were held.
      
      This situation is dealt with by making rcu_preempt_note_context_switch()
      check for negative ->rcu_read_lock_nesting, thus refraining from
      queuing the task (and from setting RCU_READ_UNLOCK_BLOCKED) if we are
      already exiting from the outermost RCU read-side critical section (in
      other words, we really are no longer actually in that RCU read-side
      critical section).  In addition, rcu_preempt_note_context_switch()
      invokes rcu_read_unlock_special() to carry out the cleanup in this case,
      which clears out the ->rcu_read_unlock_special bits and dequeues the task
      (if necessary), in turn avoiding needless delay of the current RCU grace
      period and needless RCU priority boosting.
      
      It is still illegal to call rcu_read_unlock() while holding a scheduler
      lock if the prior RCU read-side critical section has ever had either
      preemption or irqs enabled.  However, the common use case is legal,
      namely where then entire RCU read-side critical section executes with
      irqs disabled, for example, when the scheduler lock is held across the
      entire lifetime of the RCU read-side critical section.
      Signed-off-by: NPaul E. McKenney <paul.mckenney@linaro.org>
      Signed-off-by: NPaul E. McKenney <paulmck@linux.vnet.ibm.com>
      10f39bb1
    • P
      sched: Avoid creating superfluous NUMA domains on non-NUMA systems · d110235d
      Peter Zijlstra 提交于
      When creating sched_domains, stop when we've covered the entire
      target span instead of continuing to create domains, only to
      later find they're redundant and throw them away again.
      
      This avoids single node systems from touching funny NUMA
      sched_domain creation code and reduces the risks of the new
      SD_OVERLAP code.
      Requested-by: NLinus Torvalds <torvalds@linux-foundation.org>
      Signed-off-by: NPeter Zijlstra <a.p.zijlstra@chello.nl>
      Cc: Anton Blanchard <anton@samba.org>
      Cc: mahesh@linux.vnet.ibm.com
      Cc: benh@kernel.crashing.org
      Cc: linuxppc-dev@lists.ozlabs.org
      Link: http://lkml.kernel.org/r/1311180177.29152.57.camel@twinsSigned-off-by: NIngo Molnar <mingo@elte.hu>
      d110235d
    • P
      sched: Allow for overlapping sched_domain spans · e3589f6c
      Peter Zijlstra 提交于
      Allow for sched_domain spans that overlap by giving such domains their
      own sched_group list instead of sharing the sched_groups amongst
      each-other.
      
      This is needed for machines with more than 16 nodes, because
      sched_domain_node_span() will generate a node mask from the
      16 nearest nodes without regard if these masks have any overlap.
      
      Currently sched_domains have a sched_group that maps to their child
      sched_domain span, and since there is no overlap we share the
      sched_group between the sched_domains of the various CPUs. If however
      there is overlap, we would need to link the sched_group list in
      different ways for each cpu, and hence sharing isn't possible.
      
      In order to solve this, allocate private sched_groups for each CPU's
      sched_domain but have the sched_groups share a sched_group_power
      structure such that we can uniquely track the power.
      Reported-and-tested-by: NAnton Blanchard <anton@samba.org>
      Signed-off-by: NPeter Zijlstra <a.p.zijlstra@chello.nl>
      Cc: Linus Torvalds <torvalds@linux-foundation.org>
      Cc: Andrew Morton <akpm@linux-foundation.org>
      Link: http://lkml.kernel.org/n/tip-08bxqw9wis3qti9u5inifh3y@git.kernel.orgSigned-off-by: NIngo Molnar <mingo@elte.hu>
      e3589f6c
    • P
      sched: Break out cpu_power from the sched_group structure · 9c3f75cb
      Peter Zijlstra 提交于
      In order to prepare for non-unique sched_groups per domain, we need to
      carry the cpu_power elsewhere, so put a level of indirection in.
      Reported-and-tested-by: NAnton Blanchard <anton@samba.org>
      Signed-off-by: NPeter Zijlstra <a.p.zijlstra@chello.nl>
      Cc: Linus Torvalds <torvalds@linux-foundation.org>
      Cc: Andrew Morton <akpm@linux-foundation.org>
      Link: http://lkml.kernel.org/n/tip-qkho2byuhe4482fuknss40ad@git.kernel.orgSigned-off-by: NIngo Molnar <mingo@elte.hu>
      9c3f75cb
  5. 20 7月, 2011 10 次提交
  6. 19 7月, 2011 3 次提交