OSDN Git Service

DO NOT MERGE Directly acquire wake locks from the Bluetooth stack.
authorSharvil Nanavati <sharvil@google.com>
Tue, 1 Sep 2015 06:50:05 +0000 (23:50 -0700)
committerSharvil Nanavati <sharvil@google.com>
Tue, 1 Sep 2015 06:50:05 +0000 (23:50 -0700)
The wake lock callouts go through JNI and then across Binder to
PowerManager. As a result, the cost of each callout is very high.
There are cases where the stack is acquiring and releasing the wake
lock tens of times per second. When that happens, the CPU load on
some devices can reach 100% and the RFCOMM throughput can drop by
50% or more.

This change reduces the cost of acqiring / releasing a wake lock.
Instead of JNI + Binder + PowerManager overhead, we simply write to
the /sys/power/wake_lock and /sys/power/wake_unlock nodes. The cost
of each is a single syscall.

Bug: 23375670
Change-Id: I760a86b557b02c3d70be7a902c943b7ee2f515b1

hci/Android.mk
osi/Android.mk
osi/src/alarm.c

index af87285..72dda1d 100644 (file)
@@ -74,7 +74,7 @@ LOCAL_SRC_FILES := \
 LOCAL_CFLAGS := -Wall -Werror $(bdroid_CFLAGS)
 LOCAL_MODULE := net_test_hci
 LOCAL_MODULE_TAGS := tests
-LOCAL_SHARED_LIBRARIES := liblog libdl
+LOCAL_SHARED_LIBRARIES := liblog libdl libpower
 LOCAL_STATIC_LIBRARIES := libbt-hci libosi libcutils libbtcore
 
 include $(BUILD_NATIVE_TEST)
index 52dc2cf..724ed1f 100644 (file)
@@ -89,7 +89,7 @@ LOCAL_SRC_FILES := \
 LOCAL_CFLAGS := -Wall -UNDEBUG
 LOCAL_MODULE := net_test_osi
 LOCAL_MODULE_TAGS := tests
-LOCAL_SHARED_LIBRARIES := liblog
+LOCAL_SHARED_LIBRARIES := liblog libpower
 LOCAL_STATIC_LIBRARIES := libosi
 
 include $(BUILD_NATIVE_TEST)
index 761c6f3..6141dbc 100644 (file)
@@ -21,6 +21,7 @@
 #include <assert.h>
 #include <errno.h>
 #include <hardware/bluetooth.h>
+#include <hardware_legacy/power.h>
 #include <inttypes.h>
 #include <malloc.h>
 #include <string.h>
@@ -303,8 +304,8 @@ static void reschedule_root_alarm(void) {
   int64_t next_expiration = next->deadline - now();
   if (next_expiration < TIMER_INTERVAL_FOR_WAKELOCK_IN_MS) {
     if (!timer_set) {
-      int status = bt_os_callouts->acquire_wake_lock(WAKE_LOCK_ID);
-      if (status != BT_STATUS_SUCCESS) {
+      int status = acquire_wake_lock(PARTIAL_WAKE_LOCK, WAKE_LOCK_ID);
+      if (status != (int) strlen(WAKE_LOCK_ID)) {
         LOG_ERROR("%s unable to acquire wake lock: %d", __func__, status);
         goto done;
       }
@@ -320,7 +321,7 @@ static void reschedule_root_alarm(void) {
 done:
   timer_set = wakeup_time.it_value.tv_sec != 0 || wakeup_time.it_value.tv_nsec != 0;
   if (timer_was_set && !timer_set) {
-    bt_os_callouts->release_wake_lock(WAKE_LOCK_ID);
+    release_wake_lock(WAKE_LOCK_ID);
   }
 
   if (timer_settime(timer, TIMER_ABSTIME, &wakeup_time, NULL) == -1)