source:__schedule()
2731 static void __sched __schedule(void)
2732 {
2733 struct task_struct *prev, *next;
2734 unsigned long *switch_count;
2735 struct rq *rq;
2736 int cpu;
2738 need_resched:
2739 preempt_disable();
2740 cpu = smp_processor_id();
2741 rq = cpu_rq(cpu);
2742 rcu_note_context_switch(cpu);
2743 prev = rq->curr;
2745 schedule_debug(prev);
2747 if (sched_feat(HRTICK))
2748 hrtick_clear(rq);
2755 smp_mb__before_spinlock();
2756 raw_spin_lock_irq(&rq->lock);
2758 switch_count = &prev->nivcsw;
2759 if (prev->state && !(preempt_count() & PREEMPT_ACTIVE)) {
2760 if (unlikely(signal_pending_state(prev->state, prev))) {
2761 prev->state = TASK_RUNNING;
2762 } else {
2763 deactivate_task(rq, prev, DEQUEUE_SLEEP);
2764 prev->on_rq = 0;
2766
2771 if (prev->flags & PF_WQ_WORKER) {
2772 struct task_struct *to_wakeup;
2774 to_wakeup = wq_worker_sleeping(prev, cpu);
2775 if (to_wakeup)
2776 try_to_wake_up_local(to_wakeup);
2777 }
2778 }
2779 switch_count = &prev->nvcsw;
2780 }
2782 if (prev->on_rq ||rq->skip_clock_update < 0)
2783 update_rq_clock(rq);
2785 next = pick_next_task(rq, prev);
2786 clear_tsk_need_resched(prev);
2787 clear_preempt_need_resched();
2788 rq->skip_clock_update = 0;
2790 if (likely(prev != next)) {
2791 rq->nr_switches++;
2792 rq->curr = next;
2793 ++*switch_count;
2795 context_switch(rq, prev, next);
2802 cpu = smp_processor_id();
2803 rq = cpu_rq(cpu);
2804 } else
2807 post_schedule(rq);
2809 sched_preempt_enable_no_resched();
2810 if (need_resched())
2811 goto need_resched;
2812 }
沒有留言:
張貼留言