diff options
author | Martijn Coenen <maco@google.com> | 2017-04-21 16:21:31 -0700 |
---|---|---|
committer | Martijn Coenen <maco@google.com> | 2017-05-03 15:59:08 -0700 |
commit | 81ef4da81353cf86d185e90239e4f06d2930c2ba (patch) | |
tree | 613224b87c537c38ad255a72d12756bfa8dd243e | |
parent | 81e25c13192462a60eda925413302d0f8c6a936e (diff) | |
download | libhidl-81ef4da81353cf86d185e90239e4f06d2930c2ba.tar.gz |
Allow setting a minimum scheduler policy for a service.
The binder kernel driver supports priority inheritance
at a node (service)-basis, that makes sure all transactions
into that service are executed at a specified minimum
scheduler policy and priority.
This change allows users of HIDL interfaces to set
such a policy for their interface.
Bug: 37293077
Test: verified min_prio in /d/binder output
Change-Id: If72dd8322381246832b460c386dda44fbd225757
-rw-r--r-- | transport/HidlTransportSupport.cpp | 28 | ||||
-rw-r--r-- | transport/Static.cpp | 2 | ||||
-rw-r--r-- | transport/include/hidl/HidlTransportSupport.h | 15 | ||||
-rw-r--r-- | transport/include/hidl/Static.h | 7 |
4 files changed, 50 insertions, 2 deletions
diff --git a/transport/HidlTransportSupport.cpp b/transport/HidlTransportSupport.cpp index a5ec8e2..ea2e32c 100644 --- a/transport/HidlTransportSupport.cpp +++ b/transport/HidlTransportSupport.cpp @@ -14,7 +14,6 @@ * limitations under the License. */ #include <hidl/HidlTransportSupport.h> - #include <hidl/HidlBinderSupport.h> namespace android { @@ -29,5 +28,30 @@ void joinRpcThreadpool() { joinBinderRpcThreadpool(); } +bool setMinSchedulerPolicy(const sp<::android::hidl::base::V1_0::IBase>& service, + int policy, int priority) { + if (service->isRemote()) { + ALOGE("Can't set scheduler policy on remote service."); + return false; + } + + if (policy != SCHED_NORMAL && policy != SCHED_FIFO && policy != SCHED_RR) { + ALOGE("Invalid scheduler policy %d", policy); + return false; + } + + if (policy == SCHED_NORMAL && (priority < -20 || priority > 19)) { + ALOGE("Invalid priority for SCHED_NORMAL: %d", priority); + return false; + } else if (priority < 1 || priority > 99) { + ALOGE("Invalid priority for real-time policy: %d", priority); + return false; + } + + details::gServicePrioMap.set(service, { policy, priority }); + + return true; +} + +} } -}
\ No newline at end of file diff --git a/transport/Static.cpp b/transport/Static.cpp index 496c8f0..18cb475 100644 --- a/transport/Static.cpp +++ b/transport/Static.cpp @@ -32,6 +32,8 @@ sp<android::hidl::manager::V1_0::IServiceManager> gDefaultServiceManager; ConcurrentMap<std::string, std::function<sp<IBinder>(void *)>> gBnConstructorMap{}; +ConcurrentMap<wp<::android::hidl::base::V1_0::IBase>, SchedPrio> gServicePrioMap{}; + ConcurrentMap<std::string, std::function<sp<::android::hidl::base::V1_0::IBase>(void *)>> gBsConstructorMap; diff --git a/transport/include/hidl/HidlTransportSupport.h b/transport/include/hidl/HidlTransportSupport.h index 3cac1e9..0c174f7 100644 --- a/transport/include/hidl/HidlTransportSupport.h +++ b/transport/include/hidl/HidlTransportSupport.h @@ -17,6 +17,7 @@ #ifndef ANDROID_HIDL_TRANSPORT_SUPPORT_H #define ANDROID_HIDL_TRANSPORT_SUPPORT_H +#include <android/hidl/base/1.0/IBase.h> #include <hidl/HidlBinderSupport.h> #include <hidl/HidlSupport.h> #include <hidl/HidlTransportUtils.h> @@ -47,6 +48,20 @@ void configureRpcThreadpool(size_t maxThreads, bool callerWillJoin); */ void joinRpcThreadpool(); +/** + * Sets a minimum scheduler policy for all transactions coming into this + * service. + * + * This method MUST be called before passing this service to another process + * and/or registering it with registerAsService(). + * + * @param service the service to set the policy for + * @param policy scheduler policy as defined in linux UAPI + * @param priority priority. [-20..19] for SCHED_NORMAL, [1..99] for RT + */ +bool setMinSchedulerPolicy(const sp<::android::hidl::base::V1_0::IBase>& service, + int policy, int priority); + namespace details { // cast the interface IParent to IChild. diff --git a/transport/include/hidl/Static.h b/transport/include/hidl/Static.h index e6c9139..0133ff7 100644 --- a/transport/include/hidl/Static.h +++ b/transport/include/hidl/Static.h @@ -28,12 +28,19 @@ namespace android { namespace hardware { namespace details { +struct SchedPrio { + int sched_policy; + int prio; +}; + // For HidlBinderSupport and autogenerated code // value function receives reinterpret_cast<void *>(static_cast<IFoo *>(foo)), // returns sp<IBinder> extern ConcurrentMap<std::string, std::function<sp<IBinder>(void *)>> gBnConstructorMap; +extern ConcurrentMap<wp<::android::hidl::base::V1_0::IBase>, SchedPrio> gServicePrioMap; + // For HidlPassthroughSupport and autogenerated code // value function receives reinterpret_cast<void *>(static_cast<IFoo *>(foo)), // returns sp<IBase> |