• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // SPDX-License-Identifier: GPL-2.0
2 
3 // Copyright (C) 2024 Google LLC.
4 
5 //! This module defines the types and methods relevant to priority inheritance.
6 
7 use kernel::bindings;
8 
9 pub(crate) type Policy = kernel::ffi::c_uint;
10 pub(crate) type Priority = kernel::ffi::c_int;
11 pub(crate) type Nice = kernel::ffi::c_int;
12 
13 pub(crate) const SCHED_NORMAL: Policy = bindings::SCHED_NORMAL;
14 pub(crate) const SCHED_FIFO: Policy = bindings::SCHED_FIFO;
15 pub(crate) const MIN_NICE: Nice = bindings::MIN_NICE as _;
16 pub(crate) const MAX_NICE: Nice = bindings::MAX_NICE as _;
17 pub(crate) const DEFAULT_PRIO: Priority = bindings::DEFAULT_PRIO as _;
18 pub(crate) const MAX_RT_PRIO: Priority = bindings::MAX_RT_PRIO as _;
19 
20 /// Scheduler policy and priority.
21 ///
22 /// The binder driver supports inheriting the following scheduler policies:
23 /// * SCHED_NORMAL
24 /// * SCHED_BATCH
25 /// * SCHED_FIFO
26 /// * SCHED_RR
27 #[derive(Copy, Clone, Default)]
28 pub(crate) struct BinderPriority {
29     pub(crate) sched_policy: Policy,
30     pub(crate) prio: Priority,
31 }
32 
33 #[derive(Copy, Clone, Eq, PartialEq)]
34 pub(crate) enum PriorityState {
35     Set,
36     Pending,
37     Abort,
38 }
39 
get_default_prio_from_task(task: &kernel::task::Task) -> BinderPriority40 pub(crate) fn get_default_prio_from_task(task: &kernel::task::Task) -> BinderPriority {
41     if is_supported_policy(task.policy()) {
42         BinderPriority {
43             sched_policy: task.policy(),
44             prio: task.normal_prio(),
45         }
46     } else {
47         BinderPriority {
48             sched_policy: SCHED_NORMAL,
49             prio: DEFAULT_PRIO,
50         }
51     }
52 }
53 
is_rt_policy(policy: Policy) -> bool54 pub(crate) fn is_rt_policy(policy: Policy) -> bool {
55     policy == bindings::SCHED_FIFO || policy == bindings::SCHED_RR
56 }
57 
is_fair_policy(policy: Policy) -> bool58 pub(crate) fn is_fair_policy(policy: Policy) -> bool {
59     policy == bindings::SCHED_NORMAL || policy == bindings::SCHED_BATCH
60 }
61 
is_supported_policy(policy: Policy) -> bool62 pub(crate) fn is_supported_policy(policy: Policy) -> bool {
63     is_fair_policy(policy) || is_rt_policy(policy)
64 }
65 
to_userspace_prio(policy: Policy, prio: Priority) -> Nice66 pub(crate) fn to_userspace_prio(policy: Policy, prio: Priority) -> Nice {
67     if is_fair_policy(policy) {
68         prio - DEFAULT_PRIO
69     } else {
70         MAX_RT_PRIO - 1 - prio
71     }
72 }
73 
to_kernel_prio(policy: Policy, prio: Nice) -> Priority74 pub(crate) fn to_kernel_prio(policy: Policy, prio: Nice) -> Priority {
75     if is_fair_policy(policy) {
76         prio + DEFAULT_PRIO
77     } else {
78         MAX_RT_PRIO - 1 - prio
79     }
80 }
81