Allows a binder node to specify whether it wants to
inherit real-time scheduling policy from a caller.

Signed-off-by: Martijn Coenen <m...@android.com>
---
 drivers/android/binder.c            | 22 +++++++++++++++++-----
 include/uapi/linux/android/binder.h |  8 ++++++++
 2 files changed, 25 insertions(+), 5 deletions(-)

diff --git a/drivers/android/binder.c b/drivers/android/binder.c
index 76d7544120a2..e6778c696942 100644
--- a/drivers/android/binder.c
+++ b/drivers/android/binder.c
@@ -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;
 
-       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 &&
@@ -1282,6 +1291,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 {
@@ -4098,7 +4109,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;
diff --git a/include/uapi/linux/android/binder.h 
b/include/uapi/linux/android/binder.h
index 026558ac254d..70e252bf0be0 100644
--- a/include/uapi/linux/android/binder.h
+++ b/include/uapi/linux/android/binder.h
@@ -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
-- 
2.14.1.480.gb18f417b89-goog

_______________________________________________
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

Reply via email to