public inbox for git-commits@fedoraproject.org
help / color / mirror / Atom feed
* [rpms/chromium] epel9-next: Support for 64K pages on Linux/AArch64
@ 2026-08-07 16:05 Than Ngo
0 siblings, 0 replies; only message in thread
From: Than Ngo @ 2026-08-07 16:05 UTC (permalink / raw)
To: git-commits
A new commit has been pushed.
Repo : rpms/chromium
Branch : epel9-next
Commit : 2a72fc8d8cdfe1d5554eea72b3e30175c16081fd
Author : Than Ngo <than@redhat.com>
Date : 2024-02-01T17:40:40+01:00
Stats : +137/-1 in 2 file(s)
URL : https://src.fedoraproject.org/rpms/chromium/c/2a72fc8d8cdfe1d5554eea72b3e30175c16081fd?branch=epel9-next
Log:
Support for 64K pages on Linux/AArch64
---
diff --git a/chromium-121-el8-support-64kpage.patch b/chromium-121-el8-support-64kpage.patch
new file mode 100644
index 0000000..556fc65
--- /dev/null
+++ b/chromium-121-el8-support-64kpage.patch
@@ -0,0 +1,126 @@
+diff -up chromium-121.0.6167.139/base/allocator/partition_allocator/src/partition_alloc/partition_bucket.h.el8-support-64kpage.patch chromium-121.0.6167.139/base/allocator/partition_allocator/src/partition_alloc/partition_bucket.h
+--- chromium-121.0.6167.139/base/allocator/partition_allocator/src/partition_alloc/partition_bucket.h.el8-support-64kpage.patch 2024-01-30 21:24:10.000000000 +0100
++++ chromium-121.0.6167.139/base/allocator/partition_allocator/src/partition_alloc/partition_bucket.h 2024-02-01 17:20:37.178877448 +0100
+@@ -146,7 +146,13 @@ struct PartitionBucket {
+ // Returns a slot number starting from the beginning of the slot span.
+ PA_ALWAYS_INLINE size_t GetSlotNumber(size_t offset_in_slot_span) const {
+ // See the static assertion for `kReciprocalShift` above.
+- PA_DCHECK(offset_in_slot_span <= kMaxBucketed);
++ // TODO(casey.smalley@arm.com): triggers on Aarch64/Linux
++ // systems with 64k system pages. Constants need to be
++ // adjusted to prevent different parts of the allocator
++ // from overlapping. For now this will allow 64k pages
++ // to function on Aarch64/Linux systems, albeit not
++ // very efficiently.
++ // PA_DCHECK(offset_in_slot_span <= kMaxBucketed);
+ PA_DCHECK(slot_size <= kMaxBucketed);
+
+ const size_t offset_in_slot =
+diff -up chromium-121.0.6167.139/base/allocator/partition_allocator/src/partition_alloc/partition_page_constants.h.el8-support-64kpage.patch chromium-121.0.6167.139/base/allocator/partition_allocator/src/partition_alloc/partition_page_constants.h
+--- chromium-121.0.6167.139/base/allocator/partition_allocator/src/partition_alloc/partition_page_constants.h.el8-support-64kpage.patch 2024-02-01 17:20:37.178877448 +0100
++++ chromium-121.0.6167.139/base/allocator/partition_allocator/src/partition_alloc/partition_page_constants.h 2024-02-01 17:31:08.500268457 +0100
+@@ -17,10 +17,8 @@ namespace partition_alloc::internal {
+ // PartitionPageSize() is 4 times the OS page size.
+ static constexpr size_t kMaxSlotsPerSlotSpan = 4 * (1 << 14) / kSmallestBucket;
+ #elif BUILDFLAG(IS_LINUX) && defined(ARCH_CPU_ARM64)
+-// System page size can be 4, 16, or 64 kiB on Linux on arm64. 64 kiB is
+-// currently (kMaxSlotsPerSlotSpanBits == 13) not supported by the code,
+-// so we use the 16 kiB maximum (64 kiB will crash).
+-static constexpr size_t kMaxSlotsPerSlotSpan = 4 * (1 << 14) / kSmallestBucket;
++// System page size can be 4, 16, or 64 kiB on Linux on AArch64.
++static constexpr size_t kMaxSlotsPerSlotSpan = 4 * (1 << 16) / kSmallestBucket;
+ #else
+ // A slot span can "span" multiple PartitionPages, but then its slot size is
+ // larger, so it doesn't have as many slots.
+diff -up chromium-121.0.6167.139/base/allocator/partition_allocator/src/partition_alloc/partition_page.h.el8-support-64kpage.patch chromium-121.0.6167.139/base/allocator/partition_allocator/src/partition_alloc/partition_page.h
+--- chromium-121.0.6167.139/base/allocator/partition_allocator/src/partition_alloc/partition_page.h.el8-support-64kpage.patch 2024-01-30 21:24:10.000000000 +0100
++++ chromium-121.0.6167.139/base/allocator/partition_allocator/src/partition_alloc/partition_page.h 2024-02-01 17:20:37.178877448 +0100
+@@ -95,26 +95,25 @@ struct SlotSpanMetadata {
+
+ // CHECK()ed in AllocNewSlotSpan().
+ // The maximum number of bits needed to cover all currently supported OSes.
+- static constexpr size_t kMaxSlotsPerSlotSpanBits = 13;
++ static constexpr size_t kMaxSlotsPerSlotSpanBits = 15;
+ static_assert(kMaxSlotsPerSlotSpan < (1 << kMaxSlotsPerSlotSpanBits), "");
+
+- // |marked_full| isn't equivalent to being full. Slot span is marked as full
+- // iff it isn't on the active slot span list (or any other list).
+- uint32_t marked_full : 1;
+ // |num_allocated_slots| is 0 for empty or decommitted slot spans, which can
+ // be further differentiated by checking existence of the freelist.
+- uint32_t num_allocated_slots : kMaxSlotsPerSlotSpanBits;
+- uint32_t num_unprovisioned_slots : kMaxSlotsPerSlotSpanBits;
++ uint16_t num_allocated_slots : kMaxSlotsPerSlotSpanBits;
++ uint16_t num_unprovisioned_slots : kMaxSlotsPerSlotSpanBits;
++
++ // |marked_full| isn't equivalent to being full. Slot span is marked as full
++ // iff it isn't on the active slot span list (or any other list).
++ bool marked_full : 1;
+
+ private:
+- const uint32_t can_store_raw_size_ : 1;
+- uint32_t freelist_is_sorted_ : 1;
+- uint32_t unused1_ : (32 - 1 - 2 * kMaxSlotsPerSlotSpanBits - 1 - 1);
++ const uint8_t can_store_raw_size_ : 1;
++ uint8_t freelist_is_sorted_ : 1;
+ // If |in_empty_cache_|==1, |empty_cache_index| is undefined and mustn't be
+ // used.
+- uint16_t in_empty_cache_ : 1;
+- uint16_t empty_cache_index_ : kEmptyCacheIndexBits; // < kMaxFreeableSpans.
+- uint16_t unused2_ : (16 - 1 - kEmptyCacheIndexBits);
++ bool in_empty_cache_ : 1;
++ uint8_t empty_cache_index_ : kEmptyCacheIndexBits; // < kMaxFreeableSpans.
+ // Can use only 48 bits (6B) in this bitfield, as this structure is embedded
+ // in PartitionPage which has 2B worth of fields and must fit in 32B.
+
+@@ -279,18 +278,13 @@ static_assert(sizeof(SlotSpanMetadata) <
+ "SlotSpanMetadata must fit into a Page Metadata slot.");
+
+ inline constexpr SlotSpanMetadata::SlotSpanMetadata() noexcept
+- : marked_full(0),
+- num_allocated_slots(0),
++ : num_allocated_slots(0),
+ num_unprovisioned_slots(0),
++ marked_full(0),
+ can_store_raw_size_(false),
+ freelist_is_sorted_(true),
+- unused1_(0),
+ in_empty_cache_(0),
+- empty_cache_index_(0),
+- unused2_(0) {
+- (void)unused1_;
+- (void)unused2_;
+-}
++ empty_cache_index_(0) {}
+
+ inline SlotSpanMetadata::SlotSpanMetadata(const SlotSpanMetadata&) = default;
+
+@@ -883,7 +877,7 @@ PA_ALWAYS_INLINE void SlotSpanMetadata::
+
+ size_t num_slots_per_span = bucket->get_slots_per_span();
+ PA_DCHECK(num_slots_per_span <= kMaxSlotsPerSlotSpan);
+- num_unprovisioned_slots = static_cast<uint32_t>(num_slots_per_span);
++ num_unprovisioned_slots = static_cast<uint16_t>(num_slots_per_span);
+ PA_DCHECK(num_unprovisioned_slots);
+
+ ToSuperPageExtent()->IncrementNumberOfNonemptySlotSpans();
+diff -up chromium-121.0.6167.139/base/allocator/partition_allocator/src/partition_alloc/partition_root.cc.el8-support-64kpage.patch chromium-121.0.6167.139/base/allocator/partition_allocator/src/partition_alloc/partition_root.cc
+--- chromium-121.0.6167.139/base/allocator/partition_allocator/src/partition_alloc/partition_root.cc.el8-support-64kpage.patch 2024-01-30 21:24:10.000000000 +0100
++++ chromium-121.0.6167.139/base/allocator/partition_allocator/src/partition_alloc/partition_root.cc 2024-02-01 17:20:37.178877448 +0100
+@@ -950,12 +950,11 @@ void PartitionRoot::Init(PartitionOption
+ (internal::SystemPageSize() == (size_t{1} << 14)));
+ #elif BUILDFLAG(IS_LINUX) && defined(ARCH_CPU_ARM64)
+ // Check runtime pagesize. Though the code is currently the same, it is
+- // not merged with the IS_APPLE case above as a 1 << 16 case needs to be
+- // added here in the future, to allow 64 kiB pagesize. That is only
+- // supported on Linux on arm64, not on IS_APPLE, but not yet present here
+- // as the rest of the partition allocator does not currently support it.
++ // not merged with the IS_APPLE case above as a 1 << 16 case is only
++ // supported on Linux on AArch64.
+ PA_CHECK((internal::SystemPageSize() == (size_t{1} << 12)) ||
+- (internal::SystemPageSize() == (size_t{1} << 14)));
++ (internal::SystemPageSize() == (size_t{1} << 14)) ||
++ (internal::SystemPageSize() == (size_t{1} << 16)));
+ #endif
+
+ ::partition_alloc::internal::ScopedGuard guard{lock_};
diff --git a/chromium.spec b/chromium.spec
index 8416e7f..a8c52e3 100644
--- a/chromium.spec
+++ b/chromium.spec
@@ -286,7 +286,7 @@
Name: chromium%{chromium_channel}
Version: 121.0.6167.139
-Release: 1%{?dist}
+Release: 2%{?dist}
Summary: A WebKit (Blink) powered web browser that Google doesn't want you to use
Url: http://www.chromium.org/Home
License: BSD-3-Clause AND LGPL-2.1-or-later AND Apache-2.0 AND IJG AND MIT AND GPL-2.0-or-later AND ISC AND OpenSSL AND (MPL-1.1 OR GPL-2.0-only OR LGPL-2.0-only)
@@ -463,6 +463,7 @@ Patch358: chromium-121-rust-clang_lib.patch
Patch359: chromium-121-python3-invalid-escape-sequence.patch
# upstream patches
+Patch400: chromium-121-el8-support-64kpage.patch
# Use chromium-latest.py to generate clean tarball from released build tarballs, found here:
# http://build.chromium.org/buildbot/official/
@@ -1082,6 +1083,12 @@ udev.
%patch -P358 -p1 -b .rust-clang_lib
%patch -P359 -p1 -b .python3-invalid-escape-sequence
+%%ifarch aarch64
+%if 0%{?rhel} == 8
+%patch -P400 -p1 -b .el8-support-64kpage.patch
+%endif
+%endif
+
# Change shebang in all relevant files in this directory and all subdirectories
# See `man find` for how the `-exec command {} +` syntax works
find -type f \( -iname "*.py" \) -exec sed -i '1s=^#! */usr/bin/\(python\|env python\)[23]\?=#!%{__python3}=' {} +
@@ -1796,6 +1803,9 @@ getent group chrome-remote-desktop >/dev/null || groupadd -r chrome-remote-deskt
%{chromium_path}/chromedriver
%changelog
+* Thu Feb 01 2024 Than Ngo <than@redhat.com> - 121.0.6167.139-2
+- Support for 64K pages on Linux/AArch64
+
* Wed Jan 31 2024 Than Ngo <than@redhat.com> - 121.0.6167.139-1
- update to 121.0.6167.139
* High CVE-2024-1060: Use after free in Canvas
^ permalink raw reply related [flat|nested] only message in thread
only message in thread, other threads:[~2026-08-07 16:05 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-08-07 16:05 [rpms/chromium] epel9-next: Support for 64K pages on Linux/AArch64 Than Ngo
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox