Skip to content
Snippets Groups Projects
Select Git revision
  • 4ef873226ceb9c7bf11a922caddc5698a24bcfaf
  • vme-testing default
  • ci-test
  • master
  • remoteproc
  • am625-sk-ov5640
  • pcal6534-upstreaming
  • lps22df-upstreaming
  • msc-upstreaming
  • imx8mp
  • iio/noa1305
  • vme-next
  • vme-next-4.14-rc4
  • v4.14-rc4
  • v4.14-rc3
  • v4.14-rc2
  • v4.14-rc1
  • v4.13
  • vme-next-4.13-rc7
  • v4.13-rc7
  • v4.13-rc6
  • v4.13-rc5
  • v4.13-rc4
  • v4.13-rc3
  • v4.13-rc2
  • v4.13-rc1
  • v4.12
  • v4.12-rc7
  • v4.12-rc6
  • v4.12-rc5
  • v4.12-rc4
  • v4.12-rc3
32 results

fault.c

Blame
  • stop_task.c 2.86 KiB
    #include "sched.h"
    
    /*
     * stop-task scheduling class.
     *
     * The stop task is the highest priority task in the system, it preempts
     * everything and will be preempted by nothing.
     *
     * See kernel/stop_machine.c
     */
    
    #ifdef CONFIG_SMP
    static int
    select_task_rq_stop(struct task_struct *p, int cpu, int sd_flag, int flags)
    {
    	return task_cpu(p); /* stop tasks as never migrate */
    }
    #endif /* CONFIG_SMP */
    
    static void
    check_preempt_curr_stop(struct rq *rq, struct task_struct *p, int flags)
    {
    	/* we're never preempted */
    }
    
    static struct task_struct *
    pick_next_task_stop(struct rq *rq, struct task_struct *prev)
    {
    	struct task_struct *stop = rq->stop;
    
    	if (!stop || !task_on_rq_queued(stop))
    		return NULL;
    
    	put_prev_task(rq, prev);
    
    	stop->se.exec_start = rq_clock_task(rq);
    
    	return stop;
    }
    
    static void
    enqueue_task_stop(struct rq *rq, struct task_struct *p, int flags)
    {
    	add_nr_running(rq, 1);
    }
    
    static void
    dequeue_task_stop(struct rq *rq, struct task_struct *p, int flags)
    {
    	sub_nr_running(rq, 1);
    }
    
    static void yield_task_stop(struct rq *rq)
    {
    	BUG(); /* the stop task should never yield, its pointless. */
    }
    
    static void put_prev_task_stop(struct rq *rq, struct task_struct *prev)
    {
    	struct task_struct *curr = rq->curr;
    	u64 delta_exec;
    
    	delta_exec = rq_clock_task(rq) - curr->se.exec_start;
    	if (unlikely((s64)delta_exec < 0))
    		delta_exec = 0;
    
    	schedstat_set(curr->se.statistics.exec_max,
    			max(curr->se.statistics.exec_max, delta_exec));
    
    	curr->se.sum_exec_runtime += delta_exec;
    	account_group_exec_runtime(curr, delta_exec);
    
    	curr->se.exec_start = rq_clock_task(rq);
    	cpuacct_charge(curr, delta_exec);
    }
    
    static void task_tick_stop(struct rq *rq, struct task_struct *curr, int queued)
    {
    }
    
    static void set_curr_task_stop(struct rq *rq)
    {
    	struct task_struct *stop = rq->stop;
    
    	stop->se.exec_start = rq_clock_task(rq);
    }
    
    static void switched_to_stop(struct rq *rq, struct task_struct *p)
    {
    	BUG(); /* its impossible to change to this class */
    }
    
    static void
    prio_changed_stop(struct rq *rq, struct task_struct *p, int oldprio)
    {
    	BUG(); /* how!?, what priority? */
    }
    
    static unsigned int
    get_rr_interval_stop(struct rq *rq, struct task_struct *task)
    {
    	return 0;
    }
    
    static void update_curr_stop(struct rq *rq)
    {
    }
    
    /*
     * Simple, special scheduling class for the per-CPU stop tasks:
     */
    const struct sched_class stop_sched_class = {
    	.next			= &dl_sched_class,
    
    	.enqueue_task		= enqueue_task_stop,
    	.dequeue_task		= dequeue_task_stop,
    	.yield_task		= yield_task_stop,
    
    	.check_preempt_curr	= check_preempt_curr_stop,
    
    	.pick_next_task		= pick_next_task_stop,
    	.put_prev_task		= put_prev_task_stop,
    
    #ifdef CONFIG_SMP
    	.select_task_rq		= select_task_rq_stop,
    #endif
    
    	.set_curr_task          = set_curr_task_stop,
    	.task_tick		= task_tick_stop,
    
    	.get_rr_interval	= get_rr_interval_stop,
    
    	.prio_changed		= prio_changed_stop,
    	.switched_to		= switched_to_stop,
    	.update_curr		= update_curr_stop,
    };