Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit aa5aeb74 authored by Sharvil Nanavati's avatar Sharvil Nanavati
Browse files

DO NOT MERGE Directly acquire wake locks from the Bluetooth stack.

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
parent be76179d
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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)
+1 −1
Original line number Diff line number Diff line
@@ -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)
+4 −3
Original line number Diff line number Diff line
@@ -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)