浏览代码

Merge branch 'sched-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip

* 'sched-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
  sched: Fix missing kernel-doc notation
  Revert "x86, timers: Check for pending timers after (device) interrupts"
  sched: Update the clock of runqueue select_task_rq() selected
Linus Torvalds 15 年之前
父节点
当前提交
f061d83a2b
共有 3 个文件被更改,包括 8 次插入5 次删除
  1. 0 2
      arch/x86/kernel/irq.c
  2. 0 1
      arch/x86/kernel/smp.c
  3. 8 2
      kernel/sched.c

+ 0 - 2
arch/x86/kernel/irq.c

@@ -244,7 +244,6 @@ unsigned int __irq_entry do_IRQ(struct pt_regs *regs)
 				__func__, smp_processor_id(), vector, irq);
 				__func__, smp_processor_id(), vector, irq);
 	}
 	}
 
 
-	run_local_timers();
 	irq_exit();
 	irq_exit();
 
 
 	set_irq_regs(old_regs);
 	set_irq_regs(old_regs);
@@ -269,7 +268,6 @@ void smp_generic_interrupt(struct pt_regs *regs)
 	if (generic_interrupt_extension)
 	if (generic_interrupt_extension)
 		generic_interrupt_extension();
 		generic_interrupt_extension();
 
 
-	run_local_timers();
 	irq_exit();
 	irq_exit();
 
 
 	set_irq_regs(old_regs);
 	set_irq_regs(old_regs);

+ 0 - 1
arch/x86/kernel/smp.c

@@ -198,7 +198,6 @@ void smp_reschedule_interrupt(struct pt_regs *regs)
 {
 {
 	ack_APIC_irq();
 	ack_APIC_irq();
 	inc_irq_stat(irq_resched_count);
 	inc_irq_stat(irq_resched_count);
-	run_local_timers();
 	/*
 	/*
 	 * KVM uses this interrupt to force a cpu out of guest mode
 	 * KVM uses this interrupt to force a cpu out of guest mode
 	 */
 	 */

+ 8 - 2
kernel/sched.c

@@ -676,6 +676,7 @@ inline void update_rq_clock(struct rq *rq)
 
 
 /**
 /**
  * runqueue_is_locked
  * runqueue_is_locked
+ * @cpu: the processor in question.
  *
  *
  * Returns true if the current cpu runqueue is locked.
  * Returns true if the current cpu runqueue is locked.
  * This interface allows printk to be called with the runqueue lock
  * This interface allows printk to be called with the runqueue lock
@@ -2311,7 +2312,7 @@ static int try_to_wake_up(struct task_struct *p, unsigned int state,
 {
 {
 	int cpu, orig_cpu, this_cpu, success = 0;
 	int cpu, orig_cpu, this_cpu, success = 0;
 	unsigned long flags;
 	unsigned long flags;
-	struct rq *rq;
+	struct rq *rq, *orig_rq;
 
 
 	if (!sched_feat(SYNC_WAKEUPS))
 	if (!sched_feat(SYNC_WAKEUPS))
 		wake_flags &= ~WF_SYNC;
 		wake_flags &= ~WF_SYNC;
@@ -2319,7 +2320,7 @@ static int try_to_wake_up(struct task_struct *p, unsigned int state,
 	this_cpu = get_cpu();
 	this_cpu = get_cpu();
 
 
 	smp_wmb();
 	smp_wmb();
-	rq = task_rq_lock(p, &flags);
+	rq = orig_rq = task_rq_lock(p, &flags);
 	update_rq_clock(rq);
 	update_rq_clock(rq);
 	if (!(p->state & state))
 	if (!(p->state & state))
 		goto out;
 		goto out;
@@ -2350,6 +2351,10 @@ static int try_to_wake_up(struct task_struct *p, unsigned int state,
 		set_task_cpu(p, cpu);
 		set_task_cpu(p, cpu);
 
 
 	rq = task_rq_lock(p, &flags);
 	rq = task_rq_lock(p, &flags);
+
+	if (rq != orig_rq)
+		update_rq_clock(rq);
+
 	WARN_ON(p->state != TASK_WAKING);
 	WARN_ON(p->state != TASK_WAKING);
 	cpu = task_cpu(p);
 	cpu = task_cpu(p);
 
 
@@ -3656,6 +3661,7 @@ static void update_group_power(struct sched_domain *sd, int cpu)
 
 
 /**
 /**
  * update_sg_lb_stats - Update sched_group's statistics for load balancing.
  * update_sg_lb_stats - Update sched_group's statistics for load balancing.
+ * @sd: The sched_domain whose statistics are to be updated.
  * @group: sched_group whose statistics are to be updated.
  * @group: sched_group whose statistics are to be updated.
  * @this_cpu: Cpu for which load balance is currently performed.
  * @this_cpu: Cpu for which load balance is currently performed.
  * @idle: Idle status of this_cpu
  * @idle: Idle status of this_cpu