From 8b3f315e7a85989b200b8678f6d82ae45ad5c810 Mon Sep 17 00:00:00 2001 From: Philip Cuadra Date: Thu, 20 Apr 2017 16:02:48 -0700 Subject: [PATCH] Make BT HAL audio threads RT Bluetooth threads that are used in audio have deadline requirements for glitchless playback. Those threads need to be scheduled as RT tasks to ensure that they can meet the deadline even if there is high system load. Use schedulerservice to request RT scheduling. Bug 37518404 Test: play Bluetooth audio, check for RT with systrace Change-Id: I043a97df3d2801922b54dcbf7c700ae11a48c217 --- bluetooth/1.0/default/Android.bp | 4 ++++ bluetooth/1.0/default/Android.mk | 1 + bluetooth/1.0/default/async_fd_watcher.cc | 22 ++++++++++++++++++++++ 3 files changed, 27 insertions(+) diff --git a/bluetooth/1.0/default/Android.bp b/bluetooth/1.0/default/Android.bp index fec2264dc4..46a498752b 100644 --- a/bluetooth/1.0/default/Android.bp +++ b/bluetooth/1.0/default/Android.bp @@ -24,6 +24,7 @@ cc_library_shared { "vendor_interface.cc", ], shared_libs: [ + "android.frameworks.schedulerservice@1.0", "android.hardware.bluetooth@1.0", "libbase", "libcutils", @@ -48,6 +49,7 @@ cc_library_static { ], export_include_dirs: ["."], shared_libs: [ + "android.frameworks.schedulerservice@1.0", "liblog", ], } @@ -84,9 +86,11 @@ cc_test { "test", ], shared_libs: [ + "android.frameworks.schedulerservice@1.0", "libbase", "libhidlbase", "liblog", + "libutils", ], static_libs: [ "android.hardware.bluetooth-async", diff --git a/bluetooth/1.0/default/Android.mk b/bluetooth/1.0/default/Android.mk index 38294c77ea..2dcb067677 100644 --- a/bluetooth/1.0/default/Android.mk +++ b/bluetooth/1.0/default/Android.mk @@ -35,5 +35,6 @@ LOCAL_SHARED_LIBRARIES += \ libhidlbase \ libhidltransport \ android.hardware.bluetooth@1.0 \ + android.frameworks.schedulerservice@1.0\ include $(BUILD_EXECUTABLE) diff --git a/bluetooth/1.0/default/async_fd_watcher.cc b/bluetooth/1.0/default/async_fd_watcher.cc index 05ac537230..ab8d55547f 100644 --- a/bluetooth/1.0/default/async_fd_watcher.cc +++ b/bluetooth/1.0/default/async_fd_watcher.cc @@ -14,6 +14,8 @@ // limitations under the License. // +#define LOG_TAG "android.hardware.bluetooth@1.0-impl" + #include "async_fd_watcher.h" #include @@ -22,13 +24,18 @@ #include #include #include +#include #include #include "fcntl.h" #include "sys/select.h" #include "unistd.h" +#include + static const int INVALID_FD = -1; +static const int BT_RT_PRIORITY = 1; + namespace android { namespace hardware { namespace bluetooth { @@ -112,6 +119,21 @@ int AsyncFdWatcher::notifyThread() { } void AsyncFdWatcher::ThreadRoutine() { + using ::android::frameworks::schedulerservice::V1_0::ISchedulingPolicyService; + using ::android::hardware::Return; + sp manager = ISchedulingPolicyService::getService(); + if (manager == nullptr) { + ALOGE("%s: Couldn't get scheduler manager to set SCHED_FIFO.", __func__); + } else { + Return ret = manager->requestPriority(getpid(), + gettid(), + BT_RT_PRIORITY); + if (!ret.isOk() || !ret) { + ALOGE("%s unable to set SCHED_FIFO for pid %d, tid %d", __func__, + getpid(), gettid()); + } + } + while (running_) { fd_set read_fds; FD_ZERO(&read_fds);