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 }
 
沒有留言:
張貼留言