LCOV - code coverage report
Current view: top level - kernel/sched - idle_task.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 9 32 28.1 %
Date: 2014-02-18 Functions: 5 12 41.7 %
Branches: 0 0 -

           Branch data     Line data    Source code
       1                 :            : #include "sched.h"
       2                 :            : 
       3                 :            : /*
       4                 :            :  * idle-task scheduling class.
       5                 :            :  *
       6                 :            :  * (NOTE: these are not related to SCHED_IDLE tasks which are
       7                 :            :  *  handled in sched/fair.c)
       8                 :            :  */
       9                 :            : 
      10                 :            : #ifdef CONFIG_SMP
      11                 :            : static int
      12                 :          0 : select_task_rq_idle(struct task_struct *p, int cpu, int sd_flag, int flags)
      13                 :            : {
      14                 :          0 :         return task_cpu(p); /* IDLE tasks as never migrated */
      15                 :            : }
      16                 :            : 
      17                 :          0 : static void pre_schedule_idle(struct rq *rq, struct task_struct *prev)
      18                 :            : {
      19                 :    5679261 :         idle_exit_fair(rq);
      20                 :            :         rq_last_tick_reset(rq);
      21                 :    5679259 : }
      22                 :            : 
      23                 :          0 : static void post_schedule_idle(struct rq *rq)
      24                 :            : {
      25                 :    5679218 :         idle_enter_fair(rq);
      26                 :    5679199 : }
      27                 :            : #endif /* CONFIG_SMP */
      28                 :            : /*
      29                 :            :  * Idle tasks are unconditionally rescheduled:
      30                 :            :  */
      31                 :          0 : static void check_preempt_curr_idle(struct rq *rq, struct task_struct *p, int flags)
      32                 :            : {
      33                 :          0 :         resched_task(rq->idle);
      34                 :          0 : }
      35                 :            : 
      36                 :          0 : static struct task_struct *pick_next_task_idle(struct rq *rq)
      37                 :            : {
      38                 :    5679088 :         schedstat_inc(rq, sched_goidle);
      39                 :            : #ifdef CONFIG_SMP
      40                 :            :         /* Trigger the post schedule to do an idle_enter for CFS */
      41                 :    5679088 :         rq->post_schedule = 1;
      42                 :            : #endif
      43                 :    5679088 :         return rq->idle;
      44                 :            : }
      45                 :            : 
      46                 :            : /*
      47                 :            :  * It is not legal to sleep in the idle task - print a warning
      48                 :            :  * message if some code attempts to do it:
      49                 :            :  */
      50                 :            : static void
      51                 :          0 : dequeue_task_idle(struct rq *rq, struct task_struct *p, int flags)
      52                 :            : {
      53                 :            :         raw_spin_unlock_irq(&rq->lock);
      54                 :          0 :         printk(KERN_ERR "bad: scheduling from the idle thread!\n");
      55                 :          0 :         dump_stack();
      56                 :          0 :         raw_spin_lock_irq(&rq->lock);
      57                 :          0 : }
      58                 :            : 
      59                 :          0 : static void put_prev_task_idle(struct rq *rq, struct task_struct *prev)
      60                 :            : {
      61                 :    5679257 : }
      62                 :            : 
      63                 :          0 : static void task_tick_idle(struct rq *rq, struct task_struct *curr, int queued)
      64                 :            : {
      65                 :     804217 : }
      66                 :            : 
      67                 :          0 : static void set_curr_task_idle(struct rq *rq)
      68                 :            : {
      69                 :          0 : }
      70                 :            : 
      71                 :          0 : static void switched_to_idle(struct rq *rq, struct task_struct *p)
      72                 :            : {
      73                 :          0 :         BUG();
      74                 :            : }
      75                 :            : 
      76                 :            : static void
      77                 :          0 : prio_changed_idle(struct rq *rq, struct task_struct *p, int oldprio)
      78                 :            : {
      79                 :          0 :         BUG();
      80                 :            : }
      81                 :            : 
      82                 :          0 : static unsigned int get_rr_interval_idle(struct rq *rq, struct task_struct *task)
      83                 :            : {
      84                 :          0 :         return 0;
      85                 :            : }
      86                 :            : 
      87                 :            : /*
      88                 :            :  * Simple, special scheduling class for the per-CPU idle tasks:
      89                 :            :  */
      90                 :            : const struct sched_class idle_sched_class = {
      91                 :            :         /* .next is NULL */
      92                 :            :         /* no enqueue/yield_task for idle tasks */
      93                 :            : 
      94                 :            :         /* dequeue is not valid, we print a debug message there: */
      95                 :            :         .dequeue_task           = dequeue_task_idle,
      96                 :            : 
      97                 :            :         .check_preempt_curr     = check_preempt_curr_idle,
      98                 :            : 
      99                 :            :         .pick_next_task         = pick_next_task_idle,
     100                 :            :         .put_prev_task          = put_prev_task_idle,
     101                 :            : 
     102                 :            : #ifdef CONFIG_SMP
     103                 :            :         .select_task_rq         = select_task_rq_idle,
     104                 :            :         .pre_schedule           = pre_schedule_idle,
     105                 :            :         .post_schedule          = post_schedule_idle,
     106                 :            : #endif
     107                 :            : 
     108                 :            :         .set_curr_task          = set_curr_task_idle,
     109                 :            :         .task_tick              = task_tick_idle,
     110                 :            : 
     111                 :            :         .get_rr_interval        = get_rr_interval_idle,
     112                 :            : 
     113                 :            :         .prio_changed           = prio_changed_idle,
     114                 :            :         .switched_to            = switched_to_idle,
     115                 :            : };

Generated by: LCOV version 1.9