ANDROID: binder: add RT inheritance flag to node.
Allows a binder node to specify whether it wants to inherit real-time scheduling policy from a caller. Change-Id: I375b6094bf441c19f19cba06d5a6be02cd07d714 Signed-off-by: Martijn Coenen <maco@android.com>
This commit is contained in:
parent
7230f99185
commit
39140a0f38
2 changed files with 25 additions and 5 deletions
|
@ -359,6 +359,8 @@ struct binder_error {
|
|||
* (invariant after initialized)
|
||||
* @min_priority: minimum scheduling priority
|
||||
* (invariant after initialized)
|
||||
* @inherit_rt: inherit RT scheduling policy from caller
|
||||
* (invariant after initialized)
|
||||
* @async_todo: list of async work items
|
||||
* (protected by @proc->inner_lock)
|
||||
*
|
||||
|
@ -395,6 +397,7 @@ struct binder_node {
|
|||
* invariant after initialization
|
||||
*/
|
||||
u8 sched_policy:2;
|
||||
u8 inherit_rt:1;
|
||||
u8 accept_fds:1;
|
||||
u8 min_priority;
|
||||
};
|
||||
|
@ -1166,7 +1169,8 @@ static void binder_set_priority(struct task_struct *task,
|
|||
|
||||
static void binder_transaction_priority(struct task_struct *task,
|
||||
struct binder_transaction *t,
|
||||
struct binder_priority node_prio)
|
||||
struct binder_priority node_prio,
|
||||
bool inherit_rt)
|
||||
{
|
||||
struct binder_priority desired_prio;
|
||||
|
||||
|
@ -1177,8 +1181,13 @@ static void binder_transaction_priority(struct task_struct *task,
|
|||
t->saved_priority.sched_policy = task->policy;
|
||||
t->saved_priority.prio = task->normal_prio;
|
||||
|
||||
desired_prio.prio = t->priority.prio;
|
||||
desired_prio.sched_policy = t->priority.sched_policy;
|
||||
if (!inherit_rt && is_rt_policy(desired_prio.sched_policy)) {
|
||||
desired_prio.prio = NICE_TO_PRIO(0);
|
||||
desired_prio.sched_policy = SCHED_NORMAL;
|
||||
} else {
|
||||
desired_prio.prio = t->priority.prio;
|
||||
desired_prio.sched_policy = t->priority.sched_policy;
|
||||
}
|
||||
|
||||
if (node_prio.prio < t->priority.prio ||
|
||||
(node_prio.prio == t->priority.prio &&
|
||||
|
@ -1283,6 +1292,7 @@ static struct binder_node *binder_init_node_ilocked(
|
|||
FLAT_BINDER_FLAG_SCHED_POLICY_SHIFT;
|
||||
node->min_priority = to_kernel_prio(node->sched_policy, priority);
|
||||
node->accept_fds = !!(flags & FLAT_BINDER_FLAG_ACCEPTS_FDS);
|
||||
node->inherit_rt = !!(flags & FLAT_BINDER_FLAG_INHERIT_RT);
|
||||
spin_lock_init(&node->lock);
|
||||
INIT_LIST_HEAD(&node->work.entry);
|
||||
INIT_LIST_HEAD(&node->async_todo);
|
||||
|
@ -2702,7 +2712,8 @@ static bool binder_proc_transaction(struct binder_transaction *t,
|
|||
|
||||
if (thread) {
|
||||
target_list = &thread->todo;
|
||||
binder_transaction_priority(thread->task, t, node_prio);
|
||||
binder_transaction_priority(thread->task, t, node_prio,
|
||||
node->inherit_rt);
|
||||
} else if (!target_list) {
|
||||
target_list = &proc->todo;
|
||||
} else {
|
||||
|
@ -4100,7 +4111,8 @@ retry:
|
|||
tr.cookie = target_node->cookie;
|
||||
node_prio.sched_policy = target_node->sched_policy;
|
||||
node_prio.prio = target_node->min_priority;
|
||||
binder_transaction_priority(current, t, node_prio);
|
||||
binder_transaction_priority(current, t, node_prio,
|
||||
target_node->inherit_rt);
|
||||
cmd = BR_TRANSACTION;
|
||||
} else {
|
||||
tr.target.ptr = 0;
|
||||
|
|
|
@ -79,6 +79,14 @@ enum flat_binder_object_flags {
|
|||
*/
|
||||
FLAT_BINDER_FLAG_SCHED_POLICY_MASK =
|
||||
3U << FLAT_BINDER_FLAG_SCHED_POLICY_SHIFT,
|
||||
|
||||
/**
|
||||
* @FLAT_BINDER_FLAG_INHERIT_RT: whether the node inherits RT policy
|
||||
*
|
||||
* Only when set, calls into this node will inherit a real-time
|
||||
* scheduling policy from the caller (for synchronous transactions).
|
||||
*/
|
||||
FLAT_BINDER_FLAG_INHERIT_RT = 0x800,
|
||||
};
|
||||
|
||||
#ifdef BINDER_IPC_32BIT
|
||||
|
|
Loading…
Add table
Reference in a new issue