| // SPDX-License-Identifier: GPL-2.0 |
| |
| // Copyright (C) 2024 Google LLC. |
| |
| //! This module defines the types and methods relevant to priority inheritance. |
| |
| use kernel::bindings; |
| |
| pub(crate) type Policy = core::ffi::c_uint; |
| pub(crate) type Priority = core::ffi::c_int; |
| pub(crate) type Nice = core::ffi::c_int; |
| |
| pub(crate) const SCHED_NORMAL: Policy = bindings::SCHED_NORMAL; |
| pub(crate) const SCHED_FIFO: Policy = bindings::SCHED_FIFO; |
| pub(crate) const MIN_NICE: Nice = bindings::MIN_NICE as _; |
| pub(crate) const MAX_NICE: Nice = bindings::MAX_NICE as _; |
| pub(crate) const DEFAULT_PRIO: Priority = bindings::DEFAULT_PRIO as _; |
| pub(crate) const MAX_RT_PRIO: Priority = bindings::MAX_RT_PRIO as _; |
| |
| /// Scheduler policy and priority. |
| /// |
| /// The binder driver supports inheriting the following scheduler policies: |
| /// * SCHED_NORMAL |
| /// * SCHED_BATCH |
| /// * SCHED_FIFO |
| /// * SCHED_RR |
| #[derive(Copy, Clone, Default)] |
| pub(crate) struct BinderPriority { |
| pub(crate) sched_policy: Policy, |
| pub(crate) prio: Priority, |
| } |
| |
| #[derive(Copy, Clone, Eq, PartialEq)] |
| pub(crate) enum PriorityState { |
| Set, |
| Pending, |
| Abort, |
| } |
| |
| pub(crate) fn get_default_prio_from_task(task: &kernel::task::Task) -> BinderPriority { |
| if is_supported_policy(task.policy()) { |
| BinderPriority { |
| sched_policy: task.policy(), |
| prio: task.normal_prio(), |
| } |
| } else { |
| BinderPriority { |
| sched_policy: SCHED_NORMAL, |
| prio: DEFAULT_PRIO, |
| } |
| } |
| } |
| |
| pub(crate) fn is_rt_policy(policy: Policy) -> bool { |
| policy == bindings::SCHED_FIFO || policy == bindings::SCHED_RR |
| } |
| |
| pub(crate) fn is_fair_policy(policy: Policy) -> bool { |
| policy == bindings::SCHED_NORMAL || policy == bindings::SCHED_BATCH |
| } |
| |
| pub(crate) fn is_supported_policy(policy: Policy) -> bool { |
| is_fair_policy(policy) || is_rt_policy(policy) |
| } |
| |
| pub(crate) fn to_userspace_prio(policy: Policy, prio: Priority) -> Nice { |
| if is_fair_policy(policy) { |
| prio - DEFAULT_PRIO |
| } else { |
| MAX_RT_PRIO - 1 - prio |
| } |
| } |
| |
| pub(crate) fn to_kernel_prio(policy: Policy, prio: Nice) -> Priority { |
| if is_fair_policy(policy) { |
| prio + DEFAULT_PRIO |
| } else { |
| MAX_RT_PRIO - 1 - prio |
| } |
| } |