#!/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))