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