Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

android: use jemalloc on Android #32273

Merged
merged 1 commit into from
May 13, 2024
Merged

Conversation

mukilan
Copy link
Member

@mukilan mukilan commented May 13, 2024

This is a fix for the crash issue in 64-bit ARM #32175 and is essentially a revert of 5395c3e from the first Android PR.

When targeting Android 11 and above, 64-bit ARM platforms have the 'Tagged Pointer' feature enabled by default which causes memory allocated using the system allocator to have a non-zero 'tag' set in the highest byte of heap addresses.

This is incompatible with SpiderMonkey which assumes that only the bottom 48 bits are set and asserts this at various points.

Both Servo and Gecko have a similar architecture where the pointer to a heap allocated DOM struct is encoded as a JS::Value and stored in the DOM_OBJECT_SLOT (reserved slot) of the JSObject which reflects the native DOM struct.

As observed in #32175, even Gecko crashes with jemalloc disabled which suggests that support for using the native system allocator with tagged pointers enabled by default is not present at the moment.


  • ./mach build -d does not report any errors
  • ./mach test-tidy does not report any errors
  • These changes fix Android: 64-bit ARM apk crashes during startup. #32175
  • These changes do not require tests because they fix a crash in android build and ./mach test-android-startup is currently broken.

@sagudev
Copy link
Member

sagudev commented May 13, 2024

I think android used to have jemalloc as system allocator, but that changed in recent years. I wonder what would happen if we use ASAN on android?

@mrobinson
Copy link
Member

@mukilan It looks like we disabled jemalloc for Android in #31086, but I cannot recall why not. Was it a build issue?

ports/jniapi/build.rs Outdated Show resolved Hide resolved
@mrobinson
Copy link
Member

@mukilan It looks like we disabled jemalloc for Android in #31086, but I cannot recall why not. Was it a build issue?

It's explained in this PR 🤦. The issue is that jemalloc-sys has an implicit binary dependency on libgcc which isn't included by default in newer Android NDKs. Out of curiosity, does this fix the issue? tikv/jemallocator@805804a.

@mukilan
Copy link
Member Author

mukilan commented May 13, 2024

@mukilan It looks like we disabled jemalloc for Android in #31086, but I cannot recall why not. Was it a build issue?

It's explained in this PR 🤦. The issue is that jemalloc-sys has an implicit binary dependency on libgcc which isn't included by default in newer Android NDKs. Out of curiosity, does this fix the issue? tikv/jemallocator@805804a.

I don't think this would fix it as the issue is basically with this line that forces us to link withlibgcc.a.

@mukilan
Copy link
Member Author

mukilan commented May 13, 2024

I think android used to have jemalloc as system allocator, but that changed in recent years. I wonder what would happen if we use ASAN on android?

Good question! Looks like ASan is not recommended any more and Hardware Address Santizier (HWSAan] is recommended. It also looks like HWASan uses the tagged pointers support in aarch64.

This is a fix for the crash issue in 64-bit ARM [servo#32175][1].

When targeting Android 11 and above, 64-bit ARM platforms
have the 'Tagged Pointer' feature enabled by default which
causes memory allocated using the system allocator to have
a non-zero 'tag' set in the highest byte of heap addresses.

This is incompatible with SpiderMonkey which assumes that
only the bottom 48 bits are set and asserts this at various
points.

Both Servo and Gecko have a similar architecture where
the pointer to a heap allocated DOM struct is encoded as
a JS::Value and stored in the DOM_OBJECT_SLOT (reserved
slot) of the JSObject which reflects the native DOM struct.

As observed in servo#32175, even Gecko crashes with `jemalloc`
disabled which suggests that support for using the native
system allocator with tagged pointers enabled by default
is not present at the moment.

[1]: servo#32175

Signed-off-by: Mukilan Thiyagarajan <mukilan@igalia.com>
@mrobinson mrobinson enabled auto-merge May 13, 2024 09:18
@mrobinson mrobinson added this pull request to the merge queue May 13, 2024
@github-merge-queue github-merge-queue bot removed this pull request from the merge queue due to failed status checks May 13, 2024
@sagudev sagudev added this pull request to the merge queue May 13, 2024
Merged via the queue into servo:main with commit 385f6f9 May 13, 2024
9 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Android: 64-bit ARM apk crashes during startup.
3 participants