/* unlocked internal variant */ static inline int pm_qos_get_value(struct pm_qos_constraints *c) { if (plist_head_empty(&c->list)) return c->default_value; switch (c->type) { case PM_QOS_MIN: return plist_first(&c->list)->prio; case PM_QOS_MAX: return plist_last(&c->list)->prio; default: /* runtime check for not using enum */ BUG(); } }
static inline int has_pushable_tasks(struct rq *rq) { return !plist_head_empty(&rq->rt.pushable_tasks); }
void rt_mutex_debug_task_free(struct task_struct *task) { WARN_ON(!plist_head_empty(&task->pi_waiters)); WARN_ON(task->pi_blocked_on); }
static void mm_fmwk_job_scheduler(struct work_struct *work) { mm_job_status_e status = MM_JOB_STATUS_INVALID; bool is_hw_busy = false; struct dev_job_list *job_list_elem; struct mm_core *core_dev = container_of(work, \ struct mm_core, \ job_scheduler); MM_CORE_HW_IFC *hw_ifc = &core_dev->mm_device; if (plist_head_empty(&core_dev->job_list)) return; job_list_elem = plist_first_entry(\ &(core_dev->job_list), \ struct dev_job_list, core_list); if (mm_core_enable_clock(core_dev)) goto mm_fmwk_job_scheduler_done; is_hw_busy = hw_ifc->mm_get_status(hw_ifc->mm_device_id); if (!is_hw_busy) { if (job_list_elem->job.size) { if (job_list_elem->job.status == MM_JOB_STATUS_READY) clean_cnt++; if (job_list_elem->job.status == MM_JOB_STATUS_DIRTY) { mm_common_cache_clean(); dirty_cnt++; if ((dirty_cnt % 1000) == 0) pr_debug("mm jobs dirty=%d, clean=%d\n", dirty_cnt, clean_cnt); } status = hw_ifc->mm_start_job(\ hw_ifc->mm_device_id, \ &job_list_elem->job, 0); if (status < MM_JOB_STATUS_SUCCESS) { getnstimeofday(&core_dev->sched_time); timespec_add_ns(\ &core_dev->sched_time, \ hw_ifc->mm_timeout * NSEC_PER_MSEC); core_dev->mm_core_idle = false; is_hw_busy = true; pr_debug("job posted "); raw_notifier_call_chain(\ &core_dev->mm_common->notifier_head, \ MM_FMWK_NOTIFY_JOB_STARTED, NULL); } else { core_dev->mm_core_idle = true; job_list_elem->job.status \ = MM_JOB_STATUS_SUCCESS; mm_common_job_completion(\ job_list_elem, core_dev); SCHEDULER_WORK(core_dev, \ &core_dev->job_scheduler); } } else { job_list_elem->job.status \ = MM_JOB_STATUS_SUCCESS; mm_common_job_completion(\ job_list_elem, core_dev); SCHEDULER_WORK(core_dev, \ &core_dev->job_scheduler); } } else { struct timespec cur_time; getnstimeofday(&cur_time); if (timespec_compare(&cur_time, &core_dev->sched_time) > 0) { pr_err("abort hw "); hw_ifc->mm_abort(hw_ifc->mm_device_id, \ &job_list_elem->job); core_dev->mm_core_idle = true; is_hw_busy = false; SCHEDULER_WORK(core_dev, &core_dev->job_scheduler); } } if (is_hw_busy) { mod_timer(&core_dev->dev_timer, \ jiffies + msecs_to_jiffies(hw_ifc->mm_timer)); pr_debug("mod_timer %lx %lx", \ jiffies, \ msecs_to_jiffies(hw_ifc->mm_timer)); return; } mm_fmwk_job_scheduler_done: mm_core_disable_clock(core_dev); }