Commit Graph

12 Commits

Author SHA1 Message Date
Bart Van Assche
7b7948b1d5 libhealthloop: Use designated initializers
Make the code somewhat easier to read by using designated initializers.
No functionality has been changed.

Bug: 362986353
Change-Id: I707ea158c9c45eeb2662d7b5c1efc9b63f0375cb
Signed-off-by: Bart Van Assche <bvanassche@google.com>
2024-09-03 17:01:44 -07:00
Bart Van Assche
5264619177 libhealthloop: Reduce the number of ScheduleBatteryUpdate() calls
Instead of calling ScheduleBatteryUpdate() every time a uevent has been
received, only call it after the netlink socket receive buffer has been
drained. This change is safe because the contents of the power supply
uevent messages is ignored.

A subtle change in this CL is that an additional call to
uevent_kernel_multicast_recv() is introduced after all the receive
buffer has been drained. In case of a receive buffer overflow, this
extra call will receive and clear the socket error (sk_err).

Bug: 362986353
Change-Id: Ic1c489dde3338f0142def743b4cd654363517486
Signed-off-by: Bart Van Assche <bvanassche@google.com>
2024-09-03 17:01:44 -07:00
Bart Van Assche
1f2a9d0b08 libhealthloop: Terminate KLOG messages with a newline
KLOG messages are sent to /dev/kmsg and hence must be terminated with a
newline character.

Bug: 362986353
Change-Id: I7484b7722f05d8defb9529788324ac51228b7ea6
Signed-off-by: Bart Van Assche <bvanassche@google.com>
2024-09-03 17:01:44 -07:00
Bart Van Assche
d9974eb049 Merge "Revert "libhealthloop: Handle netlink receive buffer overflows"" into main 2024-08-27 15:38:47 +00:00
Bart Van Assche
185589ba6c Revert "libhealthloop: Handle netlink receive buffer overflows"
Revert this CL because there are several signs that too much time
is spent in healthd and because CL "libhealthloop: Handle netlink
receive buffer overflows" is suspected of causing an infinite loop.

Bug: 359559224
Change-Id: Iaec132da47284d662b357b901b81b21fb6d7cd9e
Signed-off-by: Bart Van Assche <bvanassche@google.com>
2024-08-27 14:22:14 +00:00
Bart Van Assche
5c604b9a73 libhealthloop: Only wake up for power supply events
healthd receives power supply information as uevents and holds a
wakelock while receiving these uevents. Without uevent filter, suspend
is postponed indefinitely if a uevent is generated during suspend. Fix
this by attaching a BPF program to the uevent socket that filters out
all events that are not power supply events.

This CL replaces the following CLs:
* Lianwei Wang, healthd: Don't set all eventpoll wakeup-able,
  2015-07-09
  (https://android-review.googlesource.com/c/platform/system/core/+/158851).
* Stephane Lee, Add BPF filter to filter uevents for
  SUBSYSTEM=powersupply, 2022-05-06.

Multiple ideas and some code in this CL have been borrowed from
Stephane Lee's CL.

Bug: 139203596
Bug: 140330870
Bug: 203131934
Bug: 203229817
Bug: 203462310
Bug: 221725014
Test: Verified that a Pixel 2024 still wakes up if a USB cable is connected or disconnected.
Test: Verified that suspend and resume still works for a Pixel 2024 device.
Test: Verified that the following text appears in the Cuttlefish logcat output: "HealthLoop: Successfully attached BPF program to uevent socket"
Test: Verified as follows that recovery mode works fine with Cuttlefish: adb reboot recovery && adb root && adb shell dmesg | grep -E 'F DEBUG|HealthLoop'
Change-Id: I64446b103d660d220880461bdef7ef0f531e1734
Signed-off-by: Bart Van Assche <bvanassche@google.com>
2024-08-05 15:56:25 -07:00
Bart Van Assche
0cfcfac12d libhealthloop: Handle netlink receive buffer overflows
The Linux kernel netlink implementation sets EPOLLERR if delivery of a
netlink message fails because of a buffer overrun (see also the Linux
kernel netlink_overrun() and sock_def_error_report() functions). Handle
buffer overruns by calling ScheduleBatteryUpdate() unconditionally.

Bug: 203462310
Change-Id: I54f7d239e6b4caad0db4d1b15de7c0385f796ebd
Signed-off-by: Bart Van Assche <bvanassche@google.com>
2024-08-05 15:56:16 -07:00
Bart Van Assche
6fe3618e7c libhealthloop: Micro-optimize HealthLoop::RegisterEvent()
BoundFunction is an alias for std::function<>. Copying a function object
may be expensive. Use std::move() to avoid copying std::function<>. From
https://engdoc.corp.google.com/eng/doc/devguide/cpp/std_function.md:
"Generally prefer both accepting and passing by value if ownership is
transferred. Recall that when using value semantics, it's important to
also use std::move() when appropriate."

Bug: 203462310
Change-Id: I9fb87737dd5ce0fbb84bfbbdb0f8bb952dea1fbc
Signed-off-by: Bart Van Assche <bvanassche@google.com>
2024-08-05 15:55:24 -07:00
Bart Van Assche
7087858515 HealthLoop.cpp: Minimize #include directives
Remove the #include directives for header files of which no symbols are
used.

Bug: 203462310
Change-Id: I0d1678d9d01f05d7dc83e70b5f4df0f1129b1968
Signed-off-by: Bart Van Assche <bvanassche@google.com>
2024-08-04 16:20:25 -07:00
Bart Van Assche
ac9f9cb348 libhealthloop: Remove the POWER_SUPPLY_SUBSYSTEM macro
Make the source code slightly easier to read by removing a macro that is
only used once.

Change-Id: I954a1ee9760398480c68a7e9bd2cdf58527c5746
Signed-off-by: Bart Van Assche <bvanassche@google.com>
2021-11-05 21:11:47 +00:00
Yifan Hong
50c9e25251 [REFACTOR] health 2.0: healthd_common -> libhealthloop
This change converts the original healthd_common.cpp to a
C++ class, HealthLoop, that manages the infinite loop in health-related
modules (charger, health HAL, healthd, etc.). By doing so, the global
static variables (including FDs and healthd_mode_ops) are cleaned up.

This helps us implement health HAL 2.1.

In order to support legacy modules (namely, healthd, charger, health HAL
2.0, which all depends on android.hardware.health@2.0-impl), a
healthd_common_adapter.cpp file is added to
android.hardware.health@2.0-impl, so that the following functions
in healthd/healthd.h continues to be implemented using the global
healthd_mode_ops:
    - healthd_register_event
    - healthd_battery_update_internal

Test: boot up the device and run VTS test on health HAL.
Bug: 137670450
Bug: 142260281
Change-Id: Iadcfc1315155404a3600f0e1219b5bc370d96409
2019-10-14 15:24:21 -07:00
Yifan Hong
c04b0a3e20 health 2.0: Move healthd_common.cpp
... so that the next CL has less diff.

Test: see next CL.
Change-Id: I5be187ab859a0b26d615b5ba7af9a26a07880181
2019-10-14 15:24:21 -07:00