• __set_current_state


    #define __set_current_state(state_value)                \
        current->state = (state_value)

    /* task state bitmask, copied from include/linux/sched.h */
    #define TASK_RUNNING        0
    #define TASK_INTERRUPTIBLE    1
    #define TASK_UNINTERRUPTIBLE    2
    #define __TASK_STOPPED        4
    #define __TASK_TRACED        8
    /* in tsk->exit_state */
    #define EXIT_DEAD        16
    #define EXIT_ZOMBIE        32
    #define EXIT_TRACE        (EXIT_ZOMBIE | EXIT_DEAD)
    /* in tsk->state again */
    #define TASK_DEAD        64
    #define TASK_WAKEKILL        128
    #define TASK_WAKING        256
    #define TASK_PARKED        512

    asmlinkage __visible void __sched schedule(void)
    {
        struct task_struct *tsk = current;

        sched_submit_work(tsk);
        do {
            preempt_disable();
            __schedule(false);
            sched_preempt_enable_no_resched();
        } while (need_resched());
        sched_update_worker(tsk);
    }
    EXPORT_SYMBOL(schedule);

    static void __sched notrace __schedule(bool preempt)
    {
        struct task_struct *prev, *next;
        unsigned long *switch_count;
        struct rq_flags rf;
        struct rq *rq;
        int cpu;

        cpu = smp_processor_id();
        rq = cpu_rq(cpu);
        prev = rq->curr;

        schedule_debug(prev, preempt);

        if (sched_feat(HRTICK))
            hrtick_clear(rq);

        local_irq_disable();
        rcu_note_context_switch(preempt);

        /*
         * Make sure that signal_pending_state()->signal_pending() below
         * can't be reordered with __set_current_state(TASK_INTERRUPTIBLE)
         * done by the caller to avoid the race with signal_wake_up().
         *
         * The membarrier system call requires a full memory barrier
         * after coming from user-space, before storing to rq->curr.
         */
        rq_lock(rq, &rf);
        smp_mb__after_spinlock();

        /* Promote REQ to ACT */
        rq->clock_update_flags <<= 1;
        update_rq_clock(rq);

        switch_count = &prev->nivcsw;
        if (!preempt && prev->state) {
            if (signal_pending_state(prev->state, prev)) {
                prev->state = TASK_RUNNING;
            } else {
                deactivate_task(rq, prev, DEQUEUE_SLEEP | DEQUEUE_NOCLOCK);//cpu运行队列中删除任务

                if (prev->in_iowait) {
                    atomic_inc(&rq->nr_iowait);
                    delayacct_blkio_start();
                }
            }
            switch_count = &prev->nvcsw;
        }

        next = pick_next_task(rq, prev, &rf);
        clear_tsk_need_resched(prev);
        clear_preempt_need_resched();

        if (likely(prev != next)) {
            rq->nr_switches++;
            /*
             * RCU users of rcu_dereference(rq->curr) may not see
             * changes to task_struct made by pick_next_task().
             */
            RCU_INIT_POINTER(rq->curr, next);
            /*
             * The membarrier system call requires each architecture
             * to have a full memory barrier after updating
             * rq->curr, before returning to user-space.
             *
             * Here are the schemes providing that barrier on the
             * various architectures:
             * - mm ? switch_mm() : mmdrop() for x86, s390, sparc, PowerPC.
             *   switch_mm() rely on membarrier_arch_switch_mm() on PowerPC.
             * - finish_lock_switch() for weakly-ordered
             *   architectures where spin_unlock is a full barrier,
             * - switch_to() for arm64 (weakly-ordered, spin_unlock
             *   is a RELEASE barrier),
             */
            ++*switch_count;

            trace_sched_switch(preempt, prev, next);

            /* Also unlocks the rq: */
            rq = context_switch(rq, prev, next, &rf);
        } else {
            rq->clock_update_flags &= ~(RQCF_ACT_SKIP|RQCF_REQ_SKIP);
            rq_unlock_irq(rq, &rf);
        }

        balance_callback(rq);
    }

  • 相关阅读:
    改变世界的物理学方程
    Spring中beanFactory与ApplicationContext的简介说明
    企业应该做的体系认证
    C语言日记 32 类的对象,this指针
    矿产行业商业供应链协同系统解决方案:构建数智化供应链平台,保障矿产资源安全供应
    (九)笔记.net学习之委托和事件、多播委托、观察者模式
    人工智能的兴起和发展
    Shell脚本案例:安装指定路径下的所有apk到安卓设备
    MATLAB字符串
    2022年五款适合新手入门的吉他推荐,超全面吉他选购攻略防雷不踩坑!
  • 原文地址:https://blog.csdn.net/wmzjzwlzs/article/details/128058238