Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fb92c34f authored by Martijn Coenen's avatar Martijn Coenen Committed by Amit Pundir
Browse files

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: default avatarMartijn Coenen <maco@android.com>
parent 7a6edeb6
Loading
Loading
Loading
Loading
+17 −5
Original line number Diff line number Diff line
@@ -358,6 +358,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)
 *
@@ -394,6 +396,7 @@ struct binder_node {
		 * invariant after initialization
		 */
		u8 sched_policy:2;
		u8 inherit_rt:1;
		u8 accept_fds:1;
		u8 min_priority;
	};
@@ -1165,7 +1168,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;

@@ -1176,8 +1180,13 @@ static void binder_transaction_priority(struct task_struct *task,
	t->saved_priority.sched_policy = task->policy;
	t->saved_priority.prio = task->normal_prio;

	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);
@@ -2700,7 +2710,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 {
@@ -4124,7 +4135,8 @@ static int binder_thread_read(struct binder_proc *proc,
			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;
+8 −0
Original line number Diff line number Diff line
@@ -80,6 +80,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