kindwolf.org Git repositories xavierg-snippets / master create-multiple-swap-files / determine-max-swapfiles-1.bash
master

Tree @master (Download .tar.gz)

determine-max-swapfiles-1.bash @masterraw · history · blame

#!/usr/bin/env bash
# Compute MAX_SWAPFILES by duplicating the computations found in swap.h as of 2023-08.

function get_swap_define {
	local value="${1}"
	local kernel_release="$(uname -r | cut -d- -f1,2)"
	local swap_h_path="/usr/src/linux-headers-${kernel_release}-common/include/linux/swap.h"
	perl -nE 'say $1 if (m/#define\s+'${value}'\s+(\d+)/ && $1 > 0)' "${swap_h_path}"
}

function get_kernel_config {
	local config="${1}"
	local kernel_config="/boot/config-$(uname -r)"
	grep -q "^${config}=y\$" "${kernel_config}"
}

MAX_SWAPFILES_SHIFT=$(get_swap_define MAX_SWAPFILES_SHIFT)
SWP_DEVICE_NUM=$(get_swap_define SWP_DEVICE_NUM)
SWP_MIGRATION_NUM=$(get_swap_define SWP_MIGRATION_NUM)
SWP_HWPOISON_NUM=$(get_swap_define SWP_HWPOISON_NUM)
SWP_PTE_MARKER_NUM=$(get_swap_define SWP_PTE_MARKER_NUM)

((MAX_SWAPFILES=1 << MAX_SWAPFILES_SHIFT))
kernel_config="/boot/config-$(uname -r)"
get_kernel_config CONFIG_MIGRATION && ((MAX_SWAPFILES-=SWP_MIGRATION_NUM))
get_kernel_config CONFIG_MEMORY_FAILURE && ((MAX_SWAPFILES-=SWP_HWPOISON_NUM))
get_kernel_config CONFIG_DEVICE_PRIVATE && ((MAX_SWAPFILES-=SWP_DEVICE_NUM))
((MAX_SWAPFILES-=SWP_PTE_MARKER_NUM))