From a29ef6949644e2d5d85cfe0738287c10a76c31b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joel=20Wir=C4=81mu=20Pauling?= Date: Wed, 4 Feb 2026 21:29:12 +1300 Subject: [PATCH] feat(memory/IO) This update optimizes memory throughput and I/O performance across all ROCKNIX AArch64 targets by enabling File-System-backed Transparent Huge Pages (THP) and implementing a tiered hardware-aware tuning strategy. With MGLRU and zRAM providing a safety net, enabling Large Page (2MB) support reduces TLB misses, allowing the CPU to prioritize emulation logic over memory address translation. Key Features Enabled File-System THP (CONFIG_READ_ONLY_THP_FOR_FS): Collapses read-only file mappings (game binaries/data) into huge pages to accelerate asset loading. Contiguous Page Table Entries (CONFIG_ARM64_CONTPTE): Allows the MMU to treat groups of pages as a single entry, increasing TLB efficiency on high-performance targets. Memory Compaction & Migration: Re-enabled infrastructure to shuffle physical RAM into contiguous blocks required for huge pages. Architecture-Specific Write Support (CONFIG_ARCH_WANT_PMD_MKWRITE): Ensures efficient huge page handling during high-performance memory writes. Tiered Userspace Management The rocknix-memory-manager applies specific logic at boot based on the SoC and RAM capacity: Flagship Mode (RK3588, SM8x, RK3399): Sets defrag to defer+madvise for proactive huge page creation. Sets vm.compaction_proactiveness to 40 to maintain a pool of contiguous blocks. Budget Mode (H700, RK3326): Sets defrag to defer only to prevent CPU "stalls" during gameplay. Sets vm.compaction_proactiveness to 10 to prioritize raw CPU availability. Texture Performance: Globally enables shmem_enabled=advise to benefit Vulkan and Wayland texture handling. Swappiness: Sets vm.swappiness to 100 when ZRAM is active to keep physical RAM unfragmented for huge page allocations. Safety Rationale MGLRU: Prevents "reclaim storms" during huge page allocation on 1GB devices. zRAM: Absorbs memory pressure via high-speed compressed swap. Read-Only Focus: FS-Backed THP targets low-risk mappings while providing high-impact gains for asset streaming. --- .../devices/H700/linux/linux.aarch64.conf | 6 +-- .../devices/RK3326/linux/linux.aarch64.conf | 6 +-- .../devices/RK3399/linux/linux.aarch64.conf | 23 +++++++-- .../devices/RK3566/linux/linux.aarch64.conf | 23 +++++++-- .../devices/RK3588/linux/linux.aarch64.conf | 10 +++- .../devices/S922X/linux/linux.aarch64.conf | 6 +-- .../devices/SDM845/linux/linux.aarch64.conf | 2 +- .../devices/SM8250/linux/linux.aarch64.conf | 10 ++-- .../devices/SM8550/linux/linux.aarch64.conf | 6 +-- .../devices/SM8650/linux/linux.aarch64.conf | 6 +-- .../sources/scripts/rocknix-memory-manager | 49 +++++++++++++++---- 11 files changed, 106 insertions(+), 41 deletions(-) diff --git a/projects/ROCKNIX/devices/H700/linux/linux.aarch64.conf b/projects/ROCKNIX/devices/H700/linux/linux.aarch64.conf index 84cfceea7b..66736418d8 100644 --- a/projects/ROCKNIX/devices/H700/linux/linux.aarch64.conf +++ b/projects/ROCKNIX/devices/H700/linux/linux.aarch64.conf @@ -11,8 +11,8 @@ CONFIG_AS_VERSION=24400 CONFIG_LD_IS_BFD=y CONFIG_LD_VERSION=24400 CONFIG_LLD_VERSION=0 -CONFIG_RUSTC_VERSION=109300 -CONFIG_RUSTC_LLVM_VERSION=210108 +CONFIG_RUSTC_VERSION=109200 +CONFIG_RUSTC_LLVM_VERSION=210103 CONFIG_CC_CAN_LINK=y CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT=y @@ -1020,7 +1020,7 @@ CONFIG_TRANSPARENT_HUGEPAGE=y CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y # CONFIG_TRANSPARENT_HUGEPAGE_NEVER is not set CONFIG_THP_SWAP=y -# CONFIG_READ_ONLY_THP_FOR_FS is not set +CONFIG_READ_ONLY_THP_FOR_FS=y # CONFIG_NO_PAGE_MAPCOUNT is not set CONFIG_PAGE_MAPCOUNT=y CONFIG_PGTABLE_HAS_HUGE_LEAVES=y diff --git a/projects/ROCKNIX/devices/RK3326/linux/linux.aarch64.conf b/projects/ROCKNIX/devices/RK3326/linux/linux.aarch64.conf index 0c9f6c2fda..bc95607891 100644 --- a/projects/ROCKNIX/devices/RK3326/linux/linux.aarch64.conf +++ b/projects/ROCKNIX/devices/RK3326/linux/linux.aarch64.conf @@ -11,8 +11,8 @@ CONFIG_AS_VERSION=24400 CONFIG_LD_IS_BFD=y CONFIG_LD_VERSION=24400 CONFIG_LLD_VERSION=0 -CONFIG_RUSTC_VERSION=109300 -CONFIG_RUSTC_LLVM_VERSION=210108 +CONFIG_RUSTC_VERSION=109200 +CONFIG_RUSTC_LLVM_VERSION=210103 CONFIG_CC_CAN_LINK=y CONFIG_CC_CAN_LINK_STATIC=y CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y @@ -962,7 +962,7 @@ CONFIG_TRANSPARENT_HUGEPAGE=y CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y # CONFIG_TRANSPARENT_HUGEPAGE_NEVER is not set CONFIG_THP_SWAP=y -# CONFIG_READ_ONLY_THP_FOR_FS is not set +CONFIG_READ_ONLY_THP_FOR_FS=y CONFIG_PGTABLE_HAS_HUGE_LEAVES=y CONFIG_ARCH_SUPPORTS_HUGE_PFNMAP=y CONFIG_ARCH_SUPPORTS_PMD_PFNMAP=y diff --git a/projects/ROCKNIX/devices/RK3399/linux/linux.aarch64.conf b/projects/ROCKNIX/devices/RK3399/linux/linux.aarch64.conf index 0c7fcbb938..463aa9e708 100644 --- a/projects/ROCKNIX/devices/RK3399/linux/linux.aarch64.conf +++ b/projects/ROCKNIX/devices/RK3399/linux/linux.aarch64.conf @@ -11,8 +11,8 @@ CONFIG_AS_VERSION=24400 CONFIG_LD_IS_BFD=y CONFIG_LD_VERSION=24400 CONFIG_LLD_VERSION=0 -CONFIG_RUSTC_VERSION=109300 -CONFIG_RUSTC_LLVM_VERSION=210108 +CONFIG_RUSTC_VERSION=109200 +CONFIG_RUSTC_LLVM_VERSION=210103 CONFIG_CC_CAN_LINK=y CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT=y @@ -546,6 +546,7 @@ CONFIG_ARM64_SME=y CONFIG_RELOCATABLE=y # CONFIG_RANDOMIZE_BASE is not set CONFIG_CC_HAVE_STACKPROTECTOR_SYSREG=y +CONFIG_ARM64_CONTPTE=y # end of Kernel Features # @@ -722,6 +723,7 @@ CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y CONFIG_HAVE_ARCH_HUGE_VMAP=y CONFIG_HAVE_ARCH_HUGE_VMALLOC=y CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y +CONFIG_ARCH_WANT_PMD_MKWRITE=y CONFIG_HAVE_MOD_ARCH_SPECIFIC=y CONFIG_MODULES_USE_ELF_RELA=y CONFIG_ARCH_WANTS_EXECMEM_LATE=y @@ -959,9 +961,11 @@ CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y CONFIG_SPLIT_PTE_PTLOCKS=y CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y CONFIG_SPLIT_PMD_PTLOCKS=y -# CONFIG_COMPACTION is not set +CONFIG_COMPACTION=y +CONFIG_COMPACT_UNEVICTABLE_DEFAULT=1 # CONFIG_PAGE_REPORTING is not set CONFIG_MIGRATION=y +CONFIG_ARCH_ENABLE_THP_MIGRATION=y CONFIG_CONTIG_ALLOC=y CONFIG_PCP_BATCH_SCALE_MAX=5 CONFIG_PHYS_ADDR_T_64BIT=y @@ -970,8 +974,19 @@ CONFIG_DEFAULT_MMAP_MIN_ADDR=32768 CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y # CONFIG_MEMORY_FAILURE is not set CONFIG_ARCH_WANTS_THP_SWAP=y -# CONFIG_TRANSPARENT_HUGEPAGE is not set +# CONFIG_PERSISTENT_HUGE_ZERO_FOLIO is not set +CONFIG_MM_ID=y +CONFIG_TRANSPARENT_HUGEPAGE=y +# CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS is not set +CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y +# CONFIG_TRANSPARENT_HUGEPAGE_NEVER is not set +CONFIG_THP_SWAP=y +CONFIG_READ_ONLY_THP_FOR_FS=y +# CONFIG_NO_PAGE_MAPCOUNT is not set CONFIG_PAGE_MAPCOUNT=y +CONFIG_PGTABLE_HAS_HUGE_LEAVES=y +CONFIG_ARCH_SUPPORTS_HUGE_PFNMAP=y +CONFIG_ARCH_SUPPORTS_PMD_PFNMAP=y CONFIG_CMA=y # CONFIG_CMA_DEBUGFS is not set # CONFIG_CMA_SYSFS is not set diff --git a/projects/ROCKNIX/devices/RK3566/linux/linux.aarch64.conf b/projects/ROCKNIX/devices/RK3566/linux/linux.aarch64.conf index 4a9b5b5445..dc003bbb2c 100644 --- a/projects/ROCKNIX/devices/RK3566/linux/linux.aarch64.conf +++ b/projects/ROCKNIX/devices/RK3566/linux/linux.aarch64.conf @@ -11,8 +11,8 @@ CONFIG_AS_VERSION=24400 CONFIG_LD_IS_BFD=y CONFIG_LD_VERSION=24400 CONFIG_LLD_VERSION=0 -CONFIG_RUSTC_VERSION=109300 -CONFIG_RUSTC_LLVM_VERSION=210108 +CONFIG_RUSTC_VERSION=109200 +CONFIG_RUSTC_LLVM_VERSION=210103 CONFIG_CC_CAN_LINK=y CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT=y @@ -555,6 +555,7 @@ CONFIG_RANDOMIZE_BASE=y CONFIG_RANDOMIZE_MODULE_REGION_FULL=y CONFIG_CC_HAVE_STACKPROTECTOR_SYSREG=y CONFIG_STACKPROTECTOR_PER_TASK=y +CONFIG_ARM64_CONTPTE=y # end of Kernel Features # @@ -726,6 +727,7 @@ CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y CONFIG_HAVE_ARCH_HUGE_VMAP=y CONFIG_HAVE_ARCH_HUGE_VMALLOC=y CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y +CONFIG_ARCH_WANT_PMD_MKWRITE=y CONFIG_HAVE_MOD_ARCH_SPECIFIC=y CONFIG_MODULES_USE_ELF_RELA=y CONFIG_ARCH_WANTS_EXECMEM_LATE=y @@ -935,9 +937,11 @@ CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y CONFIG_SPLIT_PTE_PTLOCKS=y CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y CONFIG_SPLIT_PMD_PTLOCKS=y -# CONFIG_COMPACTION is not set +CONFIG_COMPACTION=y +CONFIG_COMPACT_UNEVICTABLE_DEFAULT=1 # CONFIG_PAGE_REPORTING is not set CONFIG_MIGRATION=y +CONFIG_ARCH_ENABLE_THP_MIGRATION=y CONFIG_PCP_BATCH_SCALE_MAX=5 CONFIG_PHYS_ADDR_T_64BIT=y CONFIG_KSM=y @@ -945,8 +949,19 @@ CONFIG_DEFAULT_MMAP_MIN_ADDR=32768 CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y # CONFIG_MEMORY_FAILURE is not set CONFIG_ARCH_WANTS_THP_SWAP=y -# CONFIG_TRANSPARENT_HUGEPAGE is not set +# CONFIG_PERSISTENT_HUGE_ZERO_FOLIO is not set +CONFIG_MM_ID=y +CONFIG_TRANSPARENT_HUGEPAGE=y +# CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS is not set +CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y +# CONFIG_TRANSPARENT_HUGEPAGE_NEVER is not set +CONFIG_THP_SWAP=y +CONFIG_READ_ONLY_THP_FOR_FS=y +# CONFIG_NO_PAGE_MAPCOUNT is not set CONFIG_PAGE_MAPCOUNT=y +CONFIG_PGTABLE_HAS_HUGE_LEAVES=y +CONFIG_ARCH_SUPPORTS_HUGE_PFNMAP=y +CONFIG_ARCH_SUPPORTS_PMD_PFNMAP=y # CONFIG_CMA is not set CONFIG_PAGE_BLOCK_MAX_ORDER=10 CONFIG_GENERIC_EARLY_IOREMAP=y diff --git a/projects/ROCKNIX/devices/RK3588/linux/linux.aarch64.conf b/projects/ROCKNIX/devices/RK3588/linux/linux.aarch64.conf index 51abd5f54c..512a925268 100644 --- a/projects/ROCKNIX/devices/RK3588/linux/linux.aarch64.conf +++ b/projects/ROCKNIX/devices/RK3588/linux/linux.aarch64.conf @@ -902,10 +902,12 @@ CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y # CONFIG_MEMORY_HOTPLUG is not set CONFIG_SPLIT_PTLOCK_CPUS=4 CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y -# CONFIG_COMPACTION is not set +CONFIG_COMPACTION=y +CONFIG_COMPACT_UNEVICTABLE_DEFAULT=1 # CONFIG_PAGE_REPORTING is not set CONFIG_MIGRATION=y CONFIG_ARCH_ENABLE_HUGEPAGE_MIGRATION=y +CONFIG_ARCH_ENABLE_THP_MIGRATION=y CONFIG_CONTIG_ALLOC=y CONFIG_PHYS_ADDR_T_64BIT=y CONFIG_MMU_NOTIFIER=y @@ -914,7 +916,11 @@ CONFIG_DEFAULT_MMAP_MIN_ADDR=32768 CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y # CONFIG_MEMORY_FAILURE is not set CONFIG_ARCH_WANTS_THP_SWAP=y -# CONFIG_TRANSPARENT_HUGEPAGE is not set +CONFIG_TRANSPARENT_HUGEPAGE=y +# CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS is not set +CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y +CONFIG_THP_SWAP=y +CONFIG_READ_ONLY_THP_FOR_FS=y CONFIG_CMA=y # CONFIG_CMA_INACTIVE is not set # CONFIG_CMA_DEBUG is not set diff --git a/projects/ROCKNIX/devices/S922X/linux/linux.aarch64.conf b/projects/ROCKNIX/devices/S922X/linux/linux.aarch64.conf index 3370320563..de75301ff7 100644 --- a/projects/ROCKNIX/devices/S922X/linux/linux.aarch64.conf +++ b/projects/ROCKNIX/devices/S922X/linux/linux.aarch64.conf @@ -11,8 +11,8 @@ CONFIG_AS_VERSION=24400 CONFIG_LD_IS_BFD=y CONFIG_LD_VERSION=24400 CONFIG_LLD_VERSION=0 -CONFIG_RUSTC_VERSION=109300 -CONFIG_RUSTC_LLVM_VERSION=210108 +CONFIG_RUSTC_VERSION=109200 +CONFIG_RUSTC_LLVM_VERSION=210103 CONFIG_CC_CAN_LINK=y CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT=y @@ -964,7 +964,7 @@ CONFIG_TRANSPARENT_HUGEPAGE=y CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y # CONFIG_TRANSPARENT_HUGEPAGE_NEVER is not set CONFIG_THP_SWAP=y -# CONFIG_READ_ONLY_THP_FOR_FS is not set +CONFIG_READ_ONLY_THP_FOR_FS=y # CONFIG_NO_PAGE_MAPCOUNT is not set CONFIG_PAGE_MAPCOUNT=y CONFIG_PGTABLE_HAS_HUGE_LEAVES=y diff --git a/projects/ROCKNIX/devices/SDM845/linux/linux.aarch64.conf b/projects/ROCKNIX/devices/SDM845/linux/linux.aarch64.conf index 2344f03862..8ead96be1b 100644 --- a/projects/ROCKNIX/devices/SDM845/linux/linux.aarch64.conf +++ b/projects/ROCKNIX/devices/SDM845/linux/linux.aarch64.conf @@ -929,7 +929,7 @@ CONFIG_ZONE_DMA32=y CONFIG_ARCH_USES_HIGH_VMA_FLAGS=y # CONFIG_PERCPU_STATS is not set # CONFIG_GUP_TEST is not set -# CONFIG_READ_ONLY_THP_FOR_FS is not set +CONFIG_READ_ONLY_THP_FOR_FS=y CONFIG_ARCH_HAS_PTE_SPECIAL=y CONFIG_SECRETMEM=y # CONFIG_ANON_VMA_NAME is not set diff --git a/projects/ROCKNIX/devices/SM8250/linux/linux.aarch64.conf b/projects/ROCKNIX/devices/SM8250/linux/linux.aarch64.conf index 215570e117..08e1a3def9 100644 --- a/projects/ROCKNIX/devices/SM8250/linux/linux.aarch64.conf +++ b/projects/ROCKNIX/devices/SM8250/linux/linux.aarch64.conf @@ -11,8 +11,9 @@ CONFIG_AS_VERSION=24400 CONFIG_LD_IS_BFD=y CONFIG_LD_VERSION=24400 CONFIG_LLD_VERSION=0 -CONFIG_RUSTC_VERSION=109300 -CONFIG_RUSTC_LLVM_VERSION=210108 +CONFIG_RUSTC_VERSION=108800 +CONFIG_RUST_IS_AVAILABLE=y +CONFIG_RUSTC_LLVM_VERSION=190107 CONFIG_CC_CAN_LINK=y CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT=y @@ -25,8 +26,6 @@ CONFIG_RUSTC_HAS_SLICE_AS_FLATTENED=y CONFIG_RUSTC_HAS_COERCE_POINTEE=y CONFIG_RUSTC_HAS_SPAN_FILE=y CONFIG_RUSTC_HAS_UNNECESSARY_TRANSMUTES=y -CONFIG_RUSTC_HAS_FILE_WITH_NUL=y -CONFIG_RUSTC_HAS_FILE_AS_C_STR=y CONFIG_PAHOLE_VERSION=0 CONFIG_IRQ_WORK=y CONFIG_BUILDTIME_TABLE_SORT=y @@ -286,6 +285,7 @@ CONFIG_PERF_EVENTS=y CONFIG_SYSTEM_DATA_VERIFICATION=y CONFIG_PROFILING=y +# CONFIG_RUST is not set # # Kexec and crash features @@ -1073,7 +1073,7 @@ CONFIG_TRANSPARENT_HUGEPAGE_TMPFS_HUGE_NEVER=y # CONFIG_TRANSPARENT_HUGEPAGE_TMPFS_HUGE_WITHIN_SIZE is not set # CONFIG_TRANSPARENT_HUGEPAGE_TMPFS_HUGE_ADVISE is not set CONFIG_THP_SWAP=y -# CONFIG_READ_ONLY_THP_FOR_FS is not set +CONFIG_READ_ONLY_THP_FOR_FS=y # CONFIG_NO_PAGE_MAPCOUNT is not set CONFIG_PAGE_MAPCOUNT=y CONFIG_PGTABLE_HAS_HUGE_LEAVES=y diff --git a/projects/ROCKNIX/devices/SM8550/linux/linux.aarch64.conf b/projects/ROCKNIX/devices/SM8550/linux/linux.aarch64.conf index 9a633cf184..a4c09248ad 100644 --- a/projects/ROCKNIX/devices/SM8550/linux/linux.aarch64.conf +++ b/projects/ROCKNIX/devices/SM8550/linux/linux.aarch64.conf @@ -11,8 +11,8 @@ CONFIG_AS_VERSION=24400 CONFIG_LD_IS_BFD=y CONFIG_LD_VERSION=24400 CONFIG_LLD_VERSION=0 -CONFIG_RUSTC_VERSION=109300 -CONFIG_RUSTC_LLVM_VERSION=210108 +CONFIG_RUSTC_VERSION=109200 +CONFIG_RUSTC_LLVM_VERSION=210103 CONFIG_CC_CAN_LINK=y CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT=y @@ -1077,7 +1077,7 @@ CONFIG_TRANSPARENT_HUGEPAGE=y CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y # CONFIG_TRANSPARENT_HUGEPAGE_NEVER is not set CONFIG_THP_SWAP=y -# CONFIG_READ_ONLY_THP_FOR_FS is not set +CONFIG_READ_ONLY_THP_FOR_FS=y # CONFIG_NO_PAGE_MAPCOUNT is not set CONFIG_PAGE_MAPCOUNT=y CONFIG_PGTABLE_HAS_HUGE_LEAVES=y diff --git a/projects/ROCKNIX/devices/SM8650/linux/linux.aarch64.conf b/projects/ROCKNIX/devices/SM8650/linux/linux.aarch64.conf index 234dc9846d..e79ae4f195 100644 --- a/projects/ROCKNIX/devices/SM8650/linux/linux.aarch64.conf +++ b/projects/ROCKNIX/devices/SM8650/linux/linux.aarch64.conf @@ -11,8 +11,8 @@ CONFIG_AS_VERSION=24400 CONFIG_LD_IS_BFD=y CONFIG_LD_VERSION=24400 CONFIG_LLD_VERSION=0 -CONFIG_RUSTC_VERSION=109300 -CONFIG_RUSTC_LLVM_VERSION=210108 +CONFIG_RUSTC_VERSION=109200 +CONFIG_RUSTC_LLVM_VERSION=210103 CONFIG_CC_CAN_LINK=y CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT=y @@ -1077,7 +1077,7 @@ CONFIG_TRANSPARENT_HUGEPAGE=y CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y # CONFIG_TRANSPARENT_HUGEPAGE_NEVER is not set CONFIG_THP_SWAP=y -# CONFIG_READ_ONLY_THP_FOR_FS is not set +CONFIG_READ_ONLY_THP_FOR_FS=y # CONFIG_NO_PAGE_MAPCOUNT is not set CONFIG_PAGE_MAPCOUNT=y CONFIG_PGTABLE_HAS_HUGE_LEAVES=y diff --git a/projects/ROCKNIX/packages/rocknix/sources/scripts/rocknix-memory-manager b/projects/ROCKNIX/packages/rocknix/sources/scripts/rocknix-memory-manager index 42aa3fac6b..77c7cabcb2 100755 --- a/projects/ROCKNIX/packages/rocknix/sources/scripts/rocknix-memory-manager +++ b/projects/ROCKNIX/packages/rocknix/sources/scripts/rocknix-memory-manager @@ -38,6 +38,11 @@ KSM_ENABLE="${KSM_ENABLE:-$DEFAULT_KSM_ENABLE}" # --- 2. ENVIRONMENT & TIER DETECTION --- +# Source environment to ensure HW_DEVICE is available +if [ -f /etc/profile ]; then + . /etc/profile +fi + # Global RAM calc (MB) TOTAL_MEM_KB=$(awk '/MemTotal/ {print $2}' /proc/meminfo) TOTAL_MEM_MB=$((TOTAL_MEM_KB / 1024)) @@ -60,10 +65,8 @@ fi # even with lower RAM. IS_HIGH_PERF_SOC=false -if [ -f /proc/device-tree/compatible ]; then - if grep -qE "rk3588|sm8|s922x|g12b|rk3399" /proc/device-tree/compatible; then - IS_HIGH_PERF_SOC=true - fi +if [[ "${HW_DEVICE,,}" =~ rk3588|sm8|s922x|g12b|rk3399 ]]; then + IS_HIGH_PERF_SOC=true fi # Basic mount check @@ -193,7 +196,8 @@ show_status() { # THP if [ -f /sys/kernel/mm/transparent_hugepage/enabled ]; then local thp=$(grep -o '\[.*\]' /sys/kernel/mm/transparent_hugepage/enabled | tr -d '[]') - printf " Huge Pages: %s\n" "$thp" + local defrag=$(grep -o '\[.*\]' /sys/kernel/mm/transparent_hugepage/defrag | tr -d '[]') + printf " Huge Pages: %s (Defrag: %s)\n" "$thp" "$defrag" else printf " Huge Pages: Absent\n" fi @@ -292,11 +296,12 @@ apply_vm_tuning() { # 2. Compaction Proactiveness local compaction_val=20 if [[ "${VM_COMPACTION,,}" == "auto" ]]; then - if [ "$IS_HIGH_RAM" = true ]; then - compaction_val=50 - elif [ "$IS_LOW_RAM" = true ] && [ "$IS_HIGH_PERF_SOC" = true ]; then - # Low RAM/High CPU can afford proactive compaction to help THP/allocs - compaction_val=30 + if [ "$IS_HIGH_PERF_SOC" = true ]; then + # High-end chips can afford background cleanup to keep THP ready. + compaction_val=40 + elif [ "$IS_LOW_RAM" = true ]; then + # Save CPU cycles on budget targets. + compaction_val=10 else compaction_val=20 fi @@ -308,8 +313,29 @@ apply_vm_tuning() { fi # 3. Transparent Huge Pages + # Tiered THP Logic (FS MADVISE Synergy) if [ -f /sys/kernel/mm/transparent_hugepage/enabled ]; then + # Default to madvise for all to prevent bloat echo madvise > /sys/kernel/mm/transparent_hugepage/enabled + + # Enable for Shared Memory (Crucial for Vulkan/Wayland textures) + if [ -f /sys/kernel/mm/transparent_hugepage/shmem_enabled ]; then + echo advise > /sys/kernel/mm/transparent_hugepage/shmem_enabled + fi + + # Budget vs Flagship Defrag Logic + # On Budget devices (e.g. H700, RK3326), we use 'defer' so the system + # never stalls while trying to find a contiguous 2MB block. + if [ "$IS_LOW_RAM" = true ] && [ "$IS_HIGH_PERF_SOC" = false ]; then + echo defer > /sys/kernel/mm/transparent_hugepage/defrag + logger -t memory-manager "THP: Budget mode enabled (defrag=defer)" + else + # Flagship (RK3588, SM8x) or powerful Mid-range (RK3399) + # Use defer+madvise to allow some synchronous compaction for + # applications that explicitly think it is worth the performance. + echo "defer+madvise" > /sys/kernel/mm/transparent_hugepage/defrag + logger -t memory-manager "THP: Flagship mode enabled (defrag=defer+madvise)" + fi fi } @@ -322,6 +348,9 @@ apply_tuning() { setup_ksm if [ "$ZRAM_SIZE_VAL" -gt 0 ]; then + # With ZRAM + MGLRU + THP, high swappiness ensures the system swaps + # anonymous memory into compressed RAM, keeping physical RAM "unfragmented" + # for Huge Page allocations. sysctl -w vm.swappiness=100 >/dev/null sysctl -w vm.page-cluster=0 >/dev/null