diff options
author | Steven Moreland <smoreland@google.com> | 2020-12-04 02:58:40 +0000 |
---|---|---|
committer | alk3pInjection <webmaster@raspii.tech> | 2021-09-27 21:17:05 +0800 |
commit | 0ee03fd7567c130846a9df6e11fca13e5fd52010 (patch) | |
tree | f6145ede8a522664dfcaf06c3a0565ba750cd4c4 | |
parent | eee61c68ef34b935adb1b1af6d1ab94b2195ee91 (diff) |
[master] libbinder: support inheriting realtime priority
gotta go fast
Bug: 170420170
Test: atest binderLibTest
Change-Id: I2f2c6cb35ebf463d90b517e134b9ea3114764af6
-rw-r--r-- | libs/binder/Binder.cpp | 22 | ||||
-rw-r--r-- | libs/binder/Parcel.cpp | 3 | ||||
-rw-r--r-- | libs/binder/include/binder/Binder.h | 5 | ||||
-rw-r--r-- | libs/binder/tests/binderLibTest.cpp | 23 |
4 files changed, 53 insertions, 0 deletions
diff --git a/libs/binder/Binder.cpp b/libs/binder/Binder.cpp index 6ca3b16324..2e734b26cc 100644 --- a/libs/binder/Binder.cpp +++ b/libs/binder/Binder.cpp @@ -133,6 +133,7 @@ class BBinder::Extras public: // unlocked objects bool mRequestingSid = false; + bool mInheritRt = false; sp<IBinder> mExtension; int mPolicy = SCHED_NORMAL; int mPriority = 0; @@ -323,6 +324,27 @@ int BBinder::getMinSchedulerPriority() { return e->mPriority; } +bool BBinder::isInheritRt() { + Extras* e = mExtras.load(std::memory_order_acquire); + + return e && e->mInheritRt; +} + +void BBinder::setInheritRt(bool inheritRt) { + Extras* e = mExtras.load(std::memory_order_acquire); + + if (!e) { + if (!inheritRt) { + return; + } + + e = getOrCreateExtras(); + if (!e) return; // out of memory + } + + e->mInheritRt = inheritRt; +} + pid_t BBinder::getDebugPid() { return getpid(); } diff --git a/libs/binder/Parcel.cpp b/libs/binder/Parcel.cpp index 5a802a92a4..5f6394e44b 100644 --- a/libs/binder/Parcel.cpp +++ b/libs/binder/Parcel.cpp @@ -226,6 +226,9 @@ status_t Parcel::flattenBinder(const sp<IBinder>& binder) if (local->isRequestingSid()) { obj.flags |= FLAT_BINDER_FLAG_TXN_SECURITY_CTX; } + if (local->isInheritRt()) { + obj.flags |= FLAT_BINDER_FLAG_INHERIT_RT; + } obj.hdr.type = BINDER_TYPE_BINDER; obj.binder = reinterpret_cast<uintptr_t>(local->getWeakRefs()); obj.cookie = reinterpret_cast<uintptr_t>(local); diff --git a/libs/binder/include/binder/Binder.h b/libs/binder/include/binder/Binder.h index 4cf051563a..40352c2934 100644 --- a/libs/binder/include/binder/Binder.h +++ b/libs/binder/include/binder/Binder.h @@ -91,6 +91,11 @@ public: __attribute__((weak)) int getMinSchedulerPriority(); + // Whether realtime scheduling policies are inherited. + bool isInheritRt(); + // This must be called before the object is sent to another process. Not thread safe. + void setInheritRt(bool inheritRt); + pid_t getDebugPid(); protected: diff --git a/libs/binder/tests/binderLibTest.cpp b/libs/binder/tests/binderLibTest.cpp index 98f0868bca..c0446d361a 100644 --- a/libs/binder/tests/binderLibTest.cpp +++ b/libs/binder/tests/binderLibTest.cpp @@ -30,6 +30,7 @@ #include <binder/IServiceManager.h> #include <private/binder/binder_module.h> +#include <linux/sched.h> #include <sys/epoll.h> #include <sys/prctl.h> @@ -53,6 +54,7 @@ static char binderserverarg[] = "--binderserver"; static constexpr int kSchedPolicy = SCHED_RR; static constexpr int kSchedPriority = 7; +static constexpr int kSchedPriorityMore = 8; static String16 binderLibTestServiceName = String16("test.binderLib"); @@ -1080,6 +1082,25 @@ TEST_F(BinderLibTest, SchedPolicySet) { EXPECT_EQ(kSchedPriority, priority); } +TEST_F(BinderLibTest, InheritRt) { + sp<IBinder> server = addServer(); + ASSERT_TRUE(server != nullptr); + + const struct sched_param param { + .sched_priority = kSchedPriorityMore, + }; + EXPECT_EQ(0, sched_setscheduler(getpid(), SCHED_RR, ¶m)); + + Parcel data, reply; + status_t ret = server->transact(BINDER_LIB_TEST_GET_SCHEDULING_POLICY, data, &reply); + EXPECT_EQ(NO_ERROR, ret); + + int policy = reply.readInt32(); + int priority = reply.readInt32(); + + EXPECT_EQ(kSchedPolicy, policy & (~SCHED_RESET_ON_FORK)); + EXPECT_EQ(kSchedPriorityMore, priority); +} TEST_F(BinderLibTest, VectorSent) { Parcel data, reply; @@ -1452,6 +1473,8 @@ int run_server(int index, int readypipefd, bool usePoll) testService->setMinSchedulerPolicy(kSchedPolicy, kSchedPriority); + testService->setInheritRt(true); + /* * Normally would also contain functionality as well, but we are only * testing the extension mechanism. |