diff --git a/lib/functions/compilation/armbian-kernel.sh b/lib/functions/compilation/armbian-kernel.sh index 1378fef5391d..385cab058657 100644 --- a/lib/functions/compilation/armbian-kernel.sh +++ b/lib/functions/compilation/armbian-kernel.sh @@ -57,51 +57,46 @@ function armbian_kernel_config__disable_various_options() { fi } -function armbian_kernel_config__600_enable_ebpf_and_btf_info() { - display_alert "Enabling eBPF and BTF info" "for fully BTF & CO-RE enabled kernel" "info" - +function armbian_kernel_config__force_pa_va_48_bits_on_arm64() { declare -A opts_val=() - declare -a opts_n=("CONFIG_DEBUG_INFO_NONE") - declare -a opts_y=( - "CONFIG_BPF_JIT" "CONFIG_BPF_JIT_DEFAULT_ON" "CONFIG_FTRACE_SYSCALLS" "CONFIG_PROBE_EVENTS_BTF_ARGS" "CONFIG_BPF_KPROBE_OVERRIDE" - "CONFIG_DEBUG_INFO" "CONFIG_DEBUG_INFO_DWARF5" - "CONFIG_DEBUG_INFO_BTF" "CONFIG_DEBUG_INFO_BTF_MODULES" - ) - + declare -a opts_y=() opts_n=() if [[ "${ARCH}" == "arm64" ]]; then opts_y+=("CONFIG_ARM64_VA_BITS_48") opts_val["CONFIG_ARM64_PA_BITS"]="48" fi + armbian_kernel_config_apply_opts_from_arrays +} - declare opt_y opt_val opt_n - for opt_n in "${opts_n[@]}"; do - kernel_config_modifying_hashes+=("${opt_n}=n") - done - - for opt_y in "${opts_y[@]}"; do - kernel_config_modifying_hashes+=("${opt_y}=y") - done - - for opt_val in "${!opts_val[@]}"; do - kernel_config_modifying_hashes+=("${opt_val}=${opts_val[$opt_val]}") - done - - if [[ -f .config ]]; then - for opt_n in "${opts_n[@]}"; do - display_alert "Disabling kernel opt" "${opt_n}=n" "debug" - kernel_config_set_n "${opt_n}" - done +function armbian_kernel_config__600_enable_ebpf_and_btf_info() { + declare -A opts_val=() + declare -a opts_y=() opts_n=() - for opt_y in "${opts_y[@]}"; do - display_alert "Enabling kernel opt" "${opt_y}=y" "debug" - kernel_config_set_y "${opt_y}" - done + if [[ "${KERNEL_BTF}" == "no" ]]; then # If user is explicit by passing "KERNEL_BTF=no", then actually disable all debug info. + display_alert "Disabling eBPF and BTF info for kernel" "as requested by KERNEL_BTF=no" "info" + opts_y+=("CONFIG_DEBUG_INFO_NONE") # Enable the "none" option + opts_n+=("CONFIG_DEBUG_INFO" "CONFIG_DEBUG_INFO_DWARF5" "CONFIG_DEBUG_INFO_BTF" "CONFIG_DEBUG_INFO_BTF_MODULES") # BTF & CO-RE == off + # We don't disable the eBPF options, as eBPF itself doesn't require BTF (debug info) and doesnt' consume as much memory during build as BTF debug info does. + else + declare -i available_physical_memory_mib + available_physical_memory_mib=$(($(awk '/MemAvailable/ {print $2}' /proc/meminfo) / 1024)) # MiB + display_alert "Considering available RAM for BTF build" "${available_physical_memory_mib} MiB" "info" + + if [[ ${available_physical_memory_mib} -lt 6451 ]]; then # If less than 6451 MiB of RAM is available, then exit with an error, telling the user to avoid pain and set KERNEL_BTF=no ... + if [[ "${KERNEL_BTF}" == "yes" ]]; then # ... except if the user knows better, and has set KERNEL_BTF=yes, then we'll just warn. + display_alert "Not enough RAM available (${available_physical_memory_mib}Mib) for BTF build" "but KERNEL_BTF=yes is set; enabling BTF" "warn" + else + exit_with_error "Not enough RAM available (${available_physical_memory_mib}Mib) for BTF build. Please set 'KERNEL_BTF=no' to avoid running out of memory during the kernel LD/BTF build step; or ignore this check by setting 'KERNEL_BTF=yes' -- that might put a lot of load on your swap disk, if any." + fi + fi - for opt_val in "${!opts_val[@]}"; do - display_alert "Setting kernel opt" "${opt_val}=${opts_val[$opt_val]}" "debug" - kernel_config_set_val "${opt_val}" "${opts_val[$opt_val]}" - done + display_alert "Enabling eBPF and BTF info" "for fully BTF & CO-RE enabled kernel" "info" + opts_n+=("CONFIG_DEBUG_INFO_NONE") # Make sure the "none" option is disabled + opts_y+=( + "CONFIG_BPF_JIT" "CONFIG_BPF_JIT_DEFAULT_ON" "CONFIG_FTRACE_SYSCALLS" "CONFIG_PROBE_EVENTS_BTF_ARGS" "CONFIG_BPF_KPROBE_OVERRIDE" # eBPF == on + "CONFIG_DEBUG_INFO" "CONFIG_DEBUG_INFO_DWARF5" "CONFIG_DEBUG_INFO_BTF" "CONFIG_DEBUG_INFO_BTF_MODULES" # BTF & CO-RE == off + ) fi + armbian_kernel_config_apply_opts_from_arrays return 0 } @@ -166,3 +161,37 @@ function kernel_config_set_val() { display_alert "Setting kernel config/module value" "${config}=${value}" "debug" run_host_command_logged ./scripts/config --set-val "${config}" "${value}" } + +# This takes opts_n, opts_y, arrays from parent scope; also the opts_val dictionary; +# it and applies them to the hashes and to the .config if it exists. +function armbian_kernel_config_apply_opts_from_arrays() { + declare opt_y opt_val opt_n + for opt_n in "${opts_n[@]}"; do + kernel_config_modifying_hashes+=("${opt_n}=n") + done + + for opt_y in "${opts_y[@]}"; do + kernel_config_modifying_hashes+=("${opt_y}=y") + done + + for opt_val in "${!opts_val[@]}"; do + kernel_config_modifying_hashes+=("${opt_val}=${opts_val[$opt_val]}") + done + + if [[ -f .config ]]; then + for opt_n in "${opts_n[@]}"; do + display_alert "Disabling kernel opt" "${opt_n}=n" "debug" + kernel_config_set_n "${opt_n}" + done + + for opt_y in "${opts_y[@]}"; do + display_alert "Enabling kernel opt" "${opt_y}=y" "debug" + kernel_config_set_y "${opt_y}" + done + + for opt_val in "${!opts_val[@]}"; do + display_alert "Setting kernel opt" "${opt_val}=${opts_val[$opt_val]}" "debug" + kernel_config_set_val "${opt_val}" "${opts_val[$opt_val]}" + done + fi +}