From: Martijn Coenen <maco@android.com>
To: gregkh@linuxfoundation.org, john.stultz@linaro.org,
tkjos@google.com, arve@android.com, sherryy@android.com,
tglx@linutronix.de, peterz@infradead.org, amit.pundir@linaro.org
Cc: linux-kernel@vger.kernel.org, devel@driverdev.osuosl.org,
maco@google.com, Martijn Coenen <maco@android.com>
Subject: [PATCH v3 4/6] ANDROID: binder: add RT inheritance flag to node.
Date: Thu, 26 Oct 2017 16:07:48 +0200 [thread overview]
Message-ID: <20171026140750.119265-5-maco@android.com> (raw)
In-Reply-To: <20171026140750.119265-1-maco@android.com>
Allows a binder node to specify whether it wants to
inherit real-time scheduling policy from a caller. This
inheritance may not always be desirable, for example in
cases where the binder call runs untrusted and therefore
potentially unbounded code.
Signed-off-by: Martijn Coenen <maco@android.com>
---
drivers/android/binder.c | 21 +++++++++++++++------
include/uapi/linux/android/binder.h | 8 ++++++++
2 files changed, 23 insertions(+), 6 deletions(-)
diff --git a/drivers/android/binder.c b/drivers/android/binder.c
index 4c42e268b1a5..5958a0876fe8 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;
};
@@ -1214,9 +1217,10 @@ 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;
+ struct binder_priority desired_prio = t->priority;
if (t->set_priority_called)
return;
@@ -1225,8 +1229,10 @@ 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;
+ }
if (node_prio.prio < t->priority.prio ||
(node_prio.prio == t->priority.prio &&
@@ -1332,6 +1338,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);
@@ -2749,7 +2756,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 {
@@ -4173,7 +4181,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 b3bced80adea..5539933b3491 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.15.0.rc2.357.g7e34df9404-goog
next prev parent reply other threads:[~2017-10-26 14:09 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-10-26 14:07 [PATCH v3 0/6] ANDROID: binder: RT priority inheritance Martijn Coenen
2017-10-26 14:07 ` [PATCH v3 1/6] ANDROID: binder: add support for RT prio inheritance Martijn Coenen
2017-11-15 13:01 ` Peter Zijlstra
2017-11-16 9:18 ` Martijn Coenen
2017-11-16 11:27 ` Peter Zijlstra
2017-11-16 13:03 ` Martijn Coenen
2017-11-16 15:10 ` Peter Zijlstra
2017-11-17 10:23 ` Martijn Coenen
2017-10-26 14:07 ` [PATCH v3 2/6] ANDROID: binder: add min sched_policy to node Martijn Coenen
2017-11-15 13:02 ` Peter Zijlstra
2017-11-16 9:27 ` Martijn Coenen
2017-10-26 14:07 ` [PATCH v3 3/6] ANDROID: binder: improve priority inheritance Martijn Coenen
2017-11-15 13:03 ` Peter Zijlstra
2017-11-16 9:31 ` Martijn Coenen
2017-10-26 14:07 ` Martijn Coenen [this message]
2017-11-15 13:05 ` [PATCH v3 4/6] ANDROID: binder: add RT inheritance flag to node Peter Zijlstra
2017-11-16 9:37 ` Martijn Coenen
2017-10-26 14:07 ` [PATCH v3 5/6] ANDROID: binder: don't check prio permissions on restore Martijn Coenen
2017-11-15 13:08 ` Peter Zijlstra
2017-10-26 14:07 ` [PATCH v3 6/6] ANDROID: binder: Add tracing for binder priority inheritance Martijn Coenen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20171026140750.119265-5-maco@android.com \
--to=maco@android.com \
--cc=amit.pundir@linaro.org \
--cc=arve@android.com \
--cc=devel@driverdev.osuosl.org \
--cc=gregkh@linuxfoundation.org \
--cc=john.stultz@linaro.org \
--cc=linux-kernel@vger.kernel.org \
--cc=maco@google.com \
--cc=peterz@infradead.org \
--cc=sherryy@android.com \
--cc=tglx@linutronix.de \
--cc=tkjos@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome