Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

armbian-kernel.sh: introduce KERNEL_BTF=no to opt-out of BTF/CO-RE type-info on low-RAM machines #7675

Draft
wants to merge 1 commit into
base: main
Choose a base branch
from
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
101 changes: 65 additions & 36 deletions lib/functions/compilation/armbian-kernel.sh
Original file line number Diff line number Diff line change
Expand Up @@ -43,51 +43,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
}
Expand Down Expand Up @@ -152,3 +147,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
}
Loading