From d334223b3126df12594a6f3e71a5f810a3d3599f Mon Sep 17 00:00:00 2001 From: Vantesh <121645908+Vantesh@users.noreply.github.com> Date: Sun, 19 Oct 2025 16:33:08 +0300 Subject: [PATCH 1/2] feat(hibernation): reorder mkinitcpio modules for NVIDIA support * Ensure NVIDIA modules are prioritized before compression modules for hibernation functionality. --- .../linux/run_onchange_after_01_laptop.sh | 173 ++++++++++++++---- 1 file changed, 140 insertions(+), 33 deletions(-) diff --git a/home/.chezmoiscripts/linux/run_onchange_after_01_laptop.sh b/home/.chezmoiscripts/linux/run_onchange_after_01_laptop.sh index f1199658..b9d6deb4 100644 --- a/home/.chezmoiscripts/linux/run_onchange_after_01_laptop.sh +++ b/home/.chezmoiscripts/linux/run_onchange_after_01_laptop.sh @@ -396,64 +396,171 @@ setup_hibernation() { fi fi + # Get GPU info early to determine module order local gpu_info gpu_info=$(get_gpu_info) - # Add hibernation compression modules local modules modules=$(sed -nE 's/^[[:space:]]*MODULES=\((.*)\)[[:space:]]*$/\1/p' "$mkinitcpio_conf" 2>/dev/null | head -n1) + # Build ordered list of modules ensuring correct order + # CRITICAL: NVIDIA modules MUST come before compression modules for hibernation to work + local -a current_modules + local nvidia_modules=("nvidia" "nvidia_modeset" "nvidia_uvm" "nvidia_drm") local compression_modules=("lz4" "lz4_compress") - local missing_compression=() + local needs_reorder=false + local has_nvidia=false - for mod in "${compression_modules[@]}"; do - if [[ "$modules" != *" $mod "* ]] && [[ "$modules" != "$mod "* ]] && [[ "$modules" != *" $mod" ]] && [[ "$modules" != "$mod" ]]; then - missing_compression+=("$mod") - fi - done + read -ra current_modules <<<"$modules" + + if [[ "$gpu_info" = *"NVIDIA Corporation"* ]]; then + has_nvidia=true + fi + + # Check if we have both NVIDIA and compression modules, and if compression comes first + if [[ "$has_nvidia" = true ]]; then + local first_nvidia_idx=-1 + local first_compression_idx=-1 + + for i in "${!current_modules[@]}"; do + local mod="${current_modules[$i]}" - if [[ ${#missing_compression[@]} -gt 0 ]]; then - local new_modules="$modules" - for mod in "${missing_compression[@]}"; do - new_modules="$new_modules $mod" + # Find first NVIDIA module index + if [[ $first_nvidia_idx -eq -1 ]]; then + for nvidia_mod in "${nvidia_modules[@]}"; do + if [[ "$mod" = "$nvidia_mod" ]]; then + first_nvidia_idx=$i + break + fi + done + fi + + # Find first compression module index + if [[ $first_compression_idx -eq -1 ]]; then + for comp_mod in "${compression_modules[@]}"; do + if [[ "$mod" = "$comp_mod" ]]; then + first_compression_idx=$i + break + fi + done + fi done - new_modules=$(xargs <<<"$new_modules") - if ! sudo sed -i -E "s|^[[:space:]]*MODULES=\(.*\)|MODULES=($new_modules)|" "$mkinitcpio_conf" 2>/dev/null; then - LAST_ERROR="Failed to update mkinitcpio MODULES for compression" - return 1 + # If compression modules exist and come before NVIDIA modules (or NVIDIA doesn't exist yet), reorder + if [[ $first_compression_idx -ne -1 ]] && { [[ $first_nvidia_idx -eq -1 ]] || [[ $first_compression_idx -lt $first_nvidia_idx ]]; }; then + needs_reorder=true fi - - log INFO "Updated mkinitcpio MODULES (added ${missing_compression[*]} for hibernation compression)" - needs_regen=true fi - if [[ "$gpu_info" = *"NVIDIA Corporation"* ]]; then - local modules - modules=$(sed -nE 's/^[[:space:]]*MODULES=\((.*)\)[[:space:]]*$/\1/p' "$mkinitcpio_conf" 2>/dev/null | head -n1) + # Rebuild module list with correct order + if [[ "$needs_reorder" = true ]] || [[ "$has_nvidia" = true ]]; then + local -a final_modules=() + local -a other_modules=() + local -a nvidia_to_add=() + local -a compression_to_add=() + + # Separate modules into categories + for mod in "${current_modules[@]}"; do + local is_nvidia=false + local is_compression=false + + for nvidia_mod in "${nvidia_modules[@]}"; do + if [[ "$mod" = "$nvidia_mod" ]]; then + is_nvidia=true + break + fi + done - local nvidia_modules=("nvidia" "nvidia_modeset" "nvidia_uvm" "nvidia_drm") - local missing_modules=() + if [[ "$is_nvidia" = false ]]; then + for comp_mod in "${compression_modules[@]}"; do + if [[ "$mod" = "$comp_mod" ]]; then + is_compression=true + break + fi + done + fi - for mod in "${nvidia_modules[@]}"; do - if [[ "$modules" != *" $mod "* ]] && [[ "$modules" != "$mod "* ]] && [[ "$modules" != *" $mod" ]]; then - missing_modules+=("$mod") + if [[ "$is_nvidia" = false ]] && [[ "$is_compression" = false ]]; then + other_modules+=("$mod") fi done - if [[ ${#missing_modules[@]} -gt 0 ]]; then - local new_modules="$modules" - for mod in "${missing_modules[@]}"; do - new_modules="$new_modules $mod" + # Determine which modules to add + if [[ "$has_nvidia" = true ]]; then + for nvidia_mod in "${nvidia_modules[@]}"; do + local found=false + for mod in "${current_modules[@]}"; do + if [[ "$mod" = "$nvidia_mod" ]]; then + found=true + break + fi + done + if [[ "$found" = false ]]; then + nvidia_to_add+=("$nvidia_mod") + fi + done + fi + + for comp_mod in "${compression_modules[@]}"; do + local found=false + for mod in "${current_modules[@]}"; do + if [[ "$mod" = "$comp_mod" ]]; then + found=true + break + fi + done + if [[ "$found" = false ]]; then + compression_to_add+=("$comp_mod") + fi + done + + # Build final module list: other modules + NVIDIA modules + compression modules + final_modules=("${other_modules[@]}") + + if [[ "$has_nvidia" = true ]]; then + # Add existing NVIDIA modules first + for nvidia_mod in "${nvidia_modules[@]}"; do + for mod in "${current_modules[@]}"; do + if [[ "$mod" = "$nvidia_mod" ]]; then + final_modules+=("$mod") + break + fi + done done - new_modules=$(xargs <<<"$new_modules") + # Then add any missing NVIDIA modules + final_modules+=("${nvidia_to_add[@]}") + fi - if ! sudo sed -i -E "s|^[[:space:]]*MODULES=\(.*\)|MODULES=($new_modules)|" "$mkinitcpio_conf" 2>/dev/null; then + # Add existing compression modules + for comp_mod in "${compression_modules[@]}"; do + for mod in "${current_modules[@]}"; do + if [[ "$mod" = "$comp_mod" ]]; then + final_modules+=("$mod") + break + fi + done + done + # Then add any missing compression modules + final_modules+=("${compression_to_add[@]}") + + # Only update if something changed + if [[ "${final_modules[*]}" != "${current_modules[*]}" ]]; then + local new_modules_str="${final_modules[*]}" + + if ! sudo sed -i -E "s|^[[:space:]]*MODULES=\(.*\)|MODULES=($new_modules_str)|" "$mkinitcpio_conf" 2>/dev/null; then LAST_ERROR="Failed to update mkinitcpio MODULES" return 1 fi - log INFO "Updated mkinitcpio MODULES (added ${missing_modules[*]})" + if [[ "$needs_reorder" = true ]]; then + log INFO "Reordered mkinitcpio MODULES (NVIDIA before compression)" + fi + + if [[ ${#nvidia_to_add[@]} -gt 0 ]] || [[ ${#compression_to_add[@]} -gt 0 ]]; then + local -a added=("${nvidia_to_add[@]}" "${compression_to_add[@]}") + log INFO "Updated mkinitcpio MODULES (added ${added[*]})" + fi + needs_regen=true fi fi From 5b58392ac613e657a67b148f396beaaf86a5bfa5 Mon Sep 17 00:00:00 2001 From: Vantesh <121645908+Vantesh@users.noreply.github.com> Date: Sun, 19 Oct 2025 22:33:48 +0300 Subject: [PATCH 2/2] chore(dms): update refresh period to 24 hours --- home/.chezmoiexternals/00-dms.yaml.tmpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/home/.chezmoiexternals/00-dms.yaml.tmpl b/home/.chezmoiexternals/00-dms.yaml.tmpl index 3d578cbd..eea2aa9f 100644 --- a/home/.chezmoiexternals/00-dms.yaml.tmpl +++ b/home/.chezmoiexternals/00-dms.yaml.tmpl @@ -5,7 +5,7 @@ type: git-repo clone.args: "--depth=1" url: "https://github.com/vantesh/DankMaterialShell.git" - refreshPeriod: "36h" + refreshPeriod: "24h" {{- end }} {{ end }}