+155
−38
Loading
Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more
Currently each CursorWindow allocates a 2MiB ashmem region to store data, but this ends up being quite wasteful since the majority of windows only end up storing a small handful of rows/columns. In addition, creating and mmap'ing these ashmem regions requires acquiring the mmap semaphore in the kernel, which can significantly impact P95/P99 metrics when the system is under heavy load. To mitigate the issues described above, this change adjusts CursorWindow to send small windows (under 16KiB in size) directly inline in Parcel responses without requiring an ashmem region. CursorWindows also offer to gracefully "inflate" themselves into an ashmem region when filled with more than 16KiB of data. This requires some bugfixes around alloc() call sites to ensure that any pointers are converted to offsets during a potential inflation. The benchmarks referenced below show the following improvements after this change is applied: * Small cursor (1 row): 36% performance improvement * Medium cursor (100 rows): no difference * Large cursor (10k rows): no difference Bug: 169251528 Test: atest CtsDatabaseTestCases Test: atest FrameworksCoreTests:android.database Test: ./frameworks/base/libs/hwui/tests/scripts/prep_generic.sh little && atest CorePerfTests:android.database.CrossProcessCursorPerfTest Change-Id: Ie0fd149299f9847bf59a39f2855ed201bca4cdf6