From dea88471678a71d257e48d70765996d0583b0767 Mon Sep 17 00:00:00 2001 From: Adel Kara Slimane Date: Tue, 1 Jun 2021 20:14:47 +0200 Subject: [PATCH] Various refactorings + Enable Clang LTO (#248) * Enable Clang LTO Signed-off-by: Adel KARA SLIMANE * prepare: improve kernel prompting and selection code - Subversion are to be directly edited in the _kver_subver_map variable at the top of the file - _supported_kernels is theoretically not needed, but it's needed for the prompting to happen with the correct order, since the keys in _kver_subver_map are hash-ordered, which is not the natural ordering Signed-off-by: Adel KARA SLIMANE * prepare: update comment * prepare: improve compiler selection and LTO enablement code path Signed-off-by: Adel KARA SLIMANE * install.sh: use _prompt_from_array for distro selection Signed-off-by: Adel KARA SLIMANE * prepare: move optiprofile prompt to _prompt_from_array Signed-off-by: Adel KARA SLIMANE * prepare: improve cpu sched fallback code * install.sh: move set -e at the top * prepare: use arrays for HZ configs * prepare: enable default selection in _prompt_from_array * prepare: use _prompt_from_array for _rr_interval Signed-off-by: Adel KARA SLIMANE * prepare: update _rr_interval prompting * prepare: update and use config script for tickless * prepare: use scripts/config accross the entire script * prepare: change last lines to scripts/config * prepare: small fixes * customization.cfg: revert back to old values for _tickless * prepare: revert back to old numbering for _rr_interval Signed-off-by: Adel KARA SLIMANE * prepare: msg2 used _rr_interval Signed-off-by: Adel KARA SLIMANE * prepare: be smarter/dumber with _rr_interval Signed-off-by: Adel KARA SLIMANE * prepare: remove last manual interventions to .config * prepare: fix condition Signed-off-by: Adel KARA SLIMANE * prepare: improve cpu march handling and implement prompt Making `make` prompt wasn't working on my Gentoo for a reason I don't understand anymore. The configs are unset by the script. So it always goes for generic by default. Maybe they need to be entirely deleted from the .config file. Signed-off-by: Adel KARA SLIMANE * prepare: fix name for MuQSS.c * prepare: use _sched for scheduler source code files * install.sh: use sudo to clean root owned files in linux-src-git * prepare: remove useless code * prepare: fix issue with MuQSS * Add CacULE scheduler Signed-off-by: Adel KARA SLIMANE * 5.13 rc4 Signed-off-by: Adel KARA SLIMANE * prepare: Remove voluntary_preempt, OFenable and disable_acpi_cpufreq options * prepare: Prevent config prompt w/ modprobed-db Rebase of @CodingKoopa PR Signed-off-by: Adel KARA SLIMANE * prepare: Empty LOCALVERSION config option for Arch at the correct spot @CodingKoopa spotted the issue and reported it, thanks! Signed-off-by: Adel KARA SLIMANE * prepare: use _enable _undefine and _disable wrappers Signed-off-by: Adel KARA SLIMANE * Restore the state tracker for makepkg usage * Fix tickless array selection order for nohz idle/hz periodic * Also handle the disabling part of the generic march selector * Replace _undefine() calls with _disable() * Preserve the case of config options passed to scripts/config * Echo the CONFIG_EXPERT options without blank lines And with a header/footer Makes searching for config setting bugs easier * prepare: uppercase config options with "tr" Co-authored-by: Etienne JUVIGNY --- PKGBUILD | 7 +- customization.cfg | 11 +- install.sh | 66 +- linux-tkg-config/prepare | 1324 +++++++++++++++++--------------------- 4 files changed, 638 insertions(+), 770 deletions(-) diff --git a/PKGBUILD b/PKGBUILD index 4a37531..1347b13 100644 --- a/PKGBUILD +++ b/PKGBUILD @@ -36,7 +36,12 @@ if [ -e "$_EXT_CONFIG_PATH" ]; then source "$_EXT_CONFIG_PATH" fi -_tkg_initscript +# Make sure we're in a clean state +if [ ! -e "$_where"/BIG_UGLY_FROGMINER ]; then + _tkg_initscript +else + source "$_where"/BIG_UGLY_FROGMINER +fi if [[ "$_sub" = rc* ]]; then _srcpath="linux-${_basekernel}-${_sub}" diff --git a/customization.cfg b/customization.cfg index 142ada8..495b5d2 100644 --- a/customization.cfg +++ b/customization.cfg @@ -42,6 +42,7 @@ _force_all_threads="true" _noccache="false" # Set to true to use modprobed db to clean config from unneeded modules. Speeds up compilation considerably. Requires root - https://wiki.archlinux.org/index.php/Modprobed-db +# Using this option can trigger user prompts if the config doesn't go smoothly. # !!!! Make sure to have a well populated db !!!! - Leave empty to be asked about it at build time _modprobeddb="false" @@ -84,6 +85,12 @@ _cpusched="" # For advanced users. _compiler="" +# Clang LTO mode, only available with the "llvm" compiler - options are "no", "full" or "thin". +# "no: do not enable LTO" +# "full: uses 1 thread for Linking, slow and uses more memory, theoretically with the highest performance gains." +# "thin: uses multiple threads, faster and uses less memory, may have a lower runtime performance than Full." +_lto_mode="" + # CPU sched_yield_type - Choose what sort of yield sched_yield will perform # For PDS and MuQSS: 0: No yield. (Recommended option for gaming on PDS and MuQSS) # 1: Yield only to better priority/deadline tasks. (Default - can be unstable with PDS on some platforms) @@ -110,7 +117,7 @@ _numadisable="false" # Set to "true" to enable misc additions - May contain temporary fixes pending upstream or changes that can break on non-Arch - Kernel default is "true" _misc_adds="true" -# Set to "1" to use CattaRappa mode (enabling full tickless), "2" for tickless idle only, or "0" for periodic ticks. +# Set to "0" for periodic ticks, "1" to use CattaRappa mode (enabling full tickless) and "2" for tickless idle only. # Full tickless can give higher performances in various cases but, depending on hardware, lower consistency. Just tickless idle can perform better on some platforms (mostly AMD based). _tickless="" @@ -166,7 +173,7 @@ _random_trust_cpu="false" # Valid values are "none", "smt", "mc", "mc-llc"(for zen), "smp", "all" - Kernel default is "smt" _runqueue_sharing="" -# Timer frequency - "100" "500", "750" or "1000" ("2000" can be set for cacule cpu sched, and will fallback to 1000 for other schedulers) - More options available in kernel config prompt when left empty depending on selected cpusched - Kernel default is "500" - For MuQSS, 100Hz is recommended +# Timer frequency - "100" "500", "750" or "1000" ("2000" can be set for cacule cpu sched, and will fallback to default if set while on another schedulers) - More options available in kernel config prompt when left empty depending on selected cpusched with the default option pointed with a ">" _timer_freq="" # Default CPU governor - "performance", "ondemand", "schedutil" or leave empty for default (schedutil) diff --git a/install.sh b/install.sh index 60d77aa..126fd9f 100755 --- a/install.sh +++ b/install.sh @@ -1,5 +1,15 @@ #!/bin/bash +# Stop the script at any ecountered error +set -e + +_where=`pwd` +srcdir="$_where" + +source customization.cfg + +source linux-tkg-config/prepare + msg2() { echo -e " \033[1;34m->\033[1;0m \033[1;1m$1\033[1;0m" >&2 } @@ -17,37 +27,10 @@ plain() { } _distro_prompt() { - - while true; do - echo "Which linux distribution are you running ?" - echo "if it's not on the list, chose the closest one to it: Fedora/Suse for RPM, Ubuntu/Debian for DEB" - echo " 1) Debian" - echo " 2) Fedora" - echo " 3) Suse" - echo " 4) Ubuntu" - echo " 5) Generic" - read -p "[1-5]: " _distro_index - - if [ "$_distro_index" = "1" ]; then - _distro="Debian" - break - elif [ "$_distro_index" = "2" ]; then - _distro="Fedora" - break - elif [ "$_distro_index" = "3" ]; then - _distro="Suse" - break - elif [ "$_distro_index" = "4" ]; then - _distro="Ubuntu" - break - elif [ "$_distro_index" = "5" ]; then - _distro="Generic" - break - else - echo "Wrong index." - fi - done - + echo "Which linux distribution are you running ?" + echo "if it's not on the list, chose the closest one to it: Fedora/Suse for RPM, Ubuntu/Debian for DEB" + _prompt_from_array "Debian" "Fedora" "Suse" "Ubuntu" "Generic" + _distro="${_selected_value}" } _install_dependencies() { @@ -123,7 +106,13 @@ _linux_git_branch_checkout() { msg2 "Reseting files to their original state" git reset --hard HEAD - git clean -f -d -x + + if [ "${_distro}" = "Generic" ]; then + msg2 "Please enter your sudo password so the script can clean root owned files from the kernel sources" + sudo git clean -fdx + else + git clean -f -d -x + fi fi if [[ "$_sub" = rc* ]]; then @@ -171,16 +160,6 @@ _linux_git_branch_checkout() { } -# Stop the script at any ecountered error -set -e - -_where=`pwd` -srcdir="$_where" - -source customization.cfg - -source linux-tkg-config/prepare - if [ "$1" != "install" ] && [ "$1" != "config" ] && [ "$1" != "uninstall-help" ]; then msg2 "Argument not recognised, options are: - config : interactive script that shallow clones the linux 5.x.y git tree into the folder linux-src-git, then applies extra patches and prepares the .config file @@ -282,9 +261,6 @@ if [ "$1" = "install" ] || [ "$1" = "config" ]; then # apply linux-tkg patching script _tkg_srcprep - # source cpuschedset since _cpusched isn't set - source "$srcdir"/cpuschedset - # Uppercase characters are not allowed in source package name for debian based distros if [ "$_distro" = "Debian" ] || [ "$_distro" = "Ubuntu" ] && [ "$_cpusched" = "MuQSS" ]; then _cpusched="muqss" diff --git a/linux-tkg-config/prepare b/linux-tkg-config/prepare index 6071f0c..5d3d315 100644 --- a/linux-tkg-config/prepare +++ b/linux-tkg-config/prepare @@ -1,51 +1,214 @@ #!/bin/bash -ver54=123 -ver57=19 -ver58=18 -ver59=16 -ver510=41 -ver511=22 -ver512=8 -ver513=rc4 +# Needed for prompting with the correct order +_supported_kernels=("5.13" "5.12" "5.11" "5.10" "5.9" "5.8" "5.7" "5.4") -_cpuschedselector() { - msg2 "Which CPU sched variant do you want to build/install?" - msg2 "Project C / BMQ is usually a good balance for gaming." - msg2 "Select \"CFS\" (linux kernel's default) if unsure." - select CPUSCHED in "${_CPUSCHEDARRAY[@]}" - do - case $CPUSCHED in - "CFS") - echo "_cpusched=\"cfs\"" > "${_path}"/cpuschedset - ;; - "PDS") - echo "_cpusched=\"pds\"" > "${_path}"/cpuschedset - ;; - "MuQSS") - echo "_cpusched=\"MuQSS\"" > "${_path}"/cpuschedset - ;; - "BMQ") - echo "_cpusched=\"bmq\"" > "${_path}"/cpuschedset - ;; - "Project C / PDS") - echo "_cpusched=\"pds\"" > "${_path}"/cpuschedset - ;; - "Project C / BMQ") - echo "_cpusched=\"bmq\"" > "${_path}"/cpuschedset - ;; - "Undead PDS (TkG)") - echo "_cpusched=\"upds\"" > "${_path}"/cpuschedset - ;; - "CacULE") - echo "_cpusched=\"cacule\"" > "${_path}"/cpuschedset - ;; - *) - esac - break +typeset -A _kver_subver_map +_kver_subver_map=( + ["5.4"]="123" + ["5.7"]="19" + ["5.8"]="18" + ["5.9"]="16" + ["5.10"]="41" + ["5.11"]="22" + ["5.12"]="8" + ["5.13"]="rc4" +) + +_undefine() { + for _config_name in "$@"; do + scripts/config -k --undefine "${_config_name}" done } +_enable() { + for _config_name in "$@"; do + scripts/config -k --enable "${_config_name}" + done +} + +_disable() { + for _config_name in "$@"; do + scripts/config -k --disable "${_config_name}" + done +} + +_module() { + for _config_name in "$@"; do + scripts/config -k --module "${_config_name}" + done +} + +_prompt_from_array() { + # Prompts from array, selects default index on empty user input + # Set the _default_index variable to enable default index selection + + if [ $# = "0" ]; then + warning "Prompting on an empty array, please report this issue." + exit 1 + fi + + _N=$(($#-1)) + _index=0 + for _value in "$@"; do + if [ "$_index" = "$_default_index" ]; then + plain " > ${_index}) ${_value}" + else + plain " ${_index}) ${_value}" + fi + _index=$(($_index + 1)) + done + while true; do + read -rp "[0-${_N}]: "; + if [[ -z "$REPLY" && -n "$_default_index" ]]; then + _selected_index="$_default_index" + break + elif [[ -n "$REPLY" && 0 -le "$REPLY" && "$REPLY" -le $_N ]]; then + _selected_index="$REPLY" + break + else + echo "Wrong selection: select any number in 0-$_N" + fi + done + + _natural_index=$(($_selected_index + 1)) + _selected_value="${!_natural_index}" + plain "Selected: ${_selected_value}" + + unset _natural_index + unset _default_index +} + +_set_kernel_version() { + + if [ -z "$_version" ] || ! [[ "${!_kver_subver_map[*]}" =~ "$_version" ]]; then + msg2 "Which kernel version do you want to install?" + + # Create a list of kernels versions with their sub-version added and prompt from it + _kernel_fullver_list=() + for _key in "${_supported_kernels[@]}"; do + _kernel_fullver_list+=("${_key}.${_kver_subver_map[$_key]}") + done + + #Default index corresponds to latest stable kernel + _default_index="1" + _prompt_from_array "${_kernel_fullver_list[@]}" + _version=${_supported_kernels[$_selected_index]} + fi + + # Note: _basekernel and _version variables can be merged + _basekernel="$_version" + _basever=`echo $_version | tr -d "."` + _sub=${_kver_subver_map[$_version]} + + echo -e "_basekernel='$_basekernel'\n_basever='$_basever'\n_sub='$_sub'" > "$_where"/BIG_UGLY_FROGMINER +} + +_set_cpu_scheduler() { + declare -A _sched_description_array + _sched_description_array=( + ["pds"]="Project C / PDS" + ["bmq"]="Project C / BMQ" + ["cfs"]="CFS (Completely Fair Scheduler) Linux kernel's default" + ["muqss"]="MuQSS (Multiple Queue Skiplist Scheduler)" + ["upds"]="Undead PDS (TkG)" + ["cacule"]="CacULE" + ) + + # CPU SCHED selector + if [ "$_basever" = "54" ] || [ "$_basever" = "57" ]; then + _avail_cpu_scheds=("pds" "bmq" "muqss" "cfs") + elif [ "$_basever" = "58" ]; then + _avail_cpu_scheds=("upds" "pds" "bmq" "cfs") + elif [[ "$_basever" =~ ^(59|510|511)$ ]]; then + _avail_cpu_scheds=("upds" "pds" "bmq" "muqss" "cfs") + elif [ "$_basever" = "512" ]; then + _avail_cpu_scheds=("pds" "bmq" "muqss" "cacule" "cfs") + elif [ "$_basever" = "513" ]; then + _avail_cpu_scheds=("pds" "bmq" "cacule" "cfs") + else + _avail_cpu_scheds=("cfs") + fi + + # Populate descriptions of the available CPU schedulers + _avail_cpu_scheds_text=() + for _sched in "${_avail_cpu_scheds[@]}"; do + _avail_cpu_scheds_text+=("${_sched_description_array[$_sched]}") + done + + if ! [[ ${_avail_cpu_scheds[*]} =~ "$_cpusched" ]]; then + warning "Your cpusched selection ( $_cpusched ) is not available for the selected kernel version." + if [ "$_nofallback" = "true" ]; then + warning "Since _nofallback is enabled, let's exit..." + exit 1 + else + warning "Please select another" + _cpusched="" + fi + fi + + if [ -z "$_cpusched" ]; then + msg2 "Which CPU sched variant do you want to build/install?" + msg2 "Project C (pds) / BMQ (bmq) is usually a good balance for gaming." + msg2 "Select \"cfs\" (linux kernel's default) if unsure." + + _default_index="0" + _prompt_from_array "${_avail_cpu_scheds_text[@]}" + _cpusched=${_avail_cpu_scheds[$_selected_index]} + fi + + echo -e "_cpusched='$_cpusched'" >> "$_where"/BIG_UGLY_FROGMINER +} + +_set_compiler(){ + if ! [[ "$_compiler" =~ ^(gcc|llvm)$ ]]; then + if [ -n "$_compiler" ] && [ "$_nofallback" = "true" ]; then + msg2 "Compiler \" $_compiler \" not recognized, exiting... " + exit 1 + else + plain "Which compiler do you want to use?" + _compiler_array_text=("GCC (recommended)" "Clang/LLVM") + _compiler_array=("gcc" "llvm") + + _default_index="0" + _prompt_from_array "${_compiler_array_text[@]}" + _compiler="${_compiler_array[$_selected_index]}" + fi + fi + + if [ "$_compiler" = "llvm" ]; then + _compiler_name="-llvm" + llvm_opt="LLVM=1" + if [ $_basever -ge 512 ]; then + if [[ -z "$_lto_mode" || ! "$_lto_mode" =~ ^(no|thin|full)$ ]]; then + plain "Would you like to enable Clang Link Time Optimizations (LTO) ? It may improve the performance of the kernel." + _lto_prompt_array=( + "No: do not enable LTO" + "Full: uses 1 thread for Linking, slow and uses more memory, theoretically with the highest performance gains." + "Thin: uses multiple threads, faster and uses less memory, may have a lower runtime performance than Full." + ) + _lto_mode_array=("no" "full" "thin") + + _default_index="0" + _prompt_from_array "${_lto_prompt_array[@]}" + _lto_mode="${_lto_mode_array[$_selected_index]}" + fi + if [ "$_lto_mode" != "no" ]; then + llvm_opt="LLVM=1 LLVM_IAS=1" + fi + elif [[ -n "$_lto_mode" && "$_lto_mode" != "no" ]]; then + warning "Clang LTO is only available on linux 5.12 onwards." + _lto_mode="no" + fi + else # GCC + _compiler_name="" + llvm_opt="" + fi + + echo -e "_compiler_name='$_compiler_name'\nllvm_opt='$llvm_opt'" >> "$_where"/BIG_UGLY_FROGMINER +} + + _tkg_initscript() { # Default to Arch @@ -61,107 +224,11 @@ _tkg_initscript() { _path="${_where}" fi - # _basever, _basekernel and _sub are saved to the file "versel" - # then this file is sourced at the end of these so these vars are accessible - # to the rest of the script - if [ -z "$_version" ] && [ ! -e "$_path"/versel ]; then - msg2 "Which kernel version do you want to install?" - plain "1. 5.4.$ver54 LTS\n 2. 5.7.$ver57 (EOL)\n 3. 5.8.$ver58 (EOL)\n 4. 5.9.$ver59 (EOL)\n 5. 5.10.$ver510 LTS\n 6. 5.11.$ver511 (EOL)\n > 7. 5.12.$ver512 (latest stable)\n 8. 5.13 $ver513" - read -rp "`echo $' choice[1-7?]'`" _VERSEL; - case $_VERSEL in - "1") - echo "_basever=54" > "$_path"/versel - echo "_basekernel=5.4" >> "$_path"/versel - echo "_sub=${ver54}" >> "$_path"/versel - ;; - "2") - echo "_basever=57" > "$_path"/versel - echo "_basekernel=5.7" >> "$_path"/versel - echo "_sub=${ver57}" >> "$_path"/versel - ;; - "3") - echo "_basever=58" > "$_path"/versel - echo "_basekernel=5.8" >> "$_path"/versel - echo "_sub=${ver58}" >> "$_path"/versel - ;; - "4") - echo "_basever=59" > "$_path"/versel - echo "_basekernel=5.9" >> "$_path"/versel - echo "_sub=${ver59}" >> "$_path"/versel - ;; - "5") - echo "_basever=510" > "$_path"/versel - echo "_basekernel=5.10" >> "$_path"/versel - echo "_sub=${ver510}" >> "$_path"/versel - ;; - "6") - echo "_basever=511" > "$_path"/versel - echo "_basekernel=5.11" >> "$_path"/versel - echo "_sub=${ver511}" >> "$_path"/versel - ;; - "8") - echo "_basever=513" > "$_path"/versel - echo "_basekernel=5.13" >> "$_path"/versel - echo "_sub=${ver513}" >> "$_path"/versel - ;; - *) - echo "_basever=512" > "$_path"/versel - echo "_basekernel=5.12" >> "$_path"/versel - echo "_sub=${ver512}" >> "$_path"/versel - ;; - esac - elif [ -n "$_version" ];then - case "$_version" in - "5.4") - echo "_basever=54" > "$_path"/versel - echo "_basekernel=5.4" >> "$_path"/versel - echo "_sub=${ver54}" >> "$_path"/versel - ;; - "5.7") - echo "_basever=57" > "$_path"/versel - echo "_basekernel=5.7" >> "$_path"/versel - echo "_sub=${ver57}" >> "$_path"/versel - ;; - "5.8") - echo "_basever=58" > "$_path"/versel - echo "_basekernel=5.8" >> "$_path"/versel - echo "_sub=${ver58}" >> "$_path"/versel - ;; - "5.9") - echo "_basever=59" > "$_path"/versel - echo "_basekernel=5.9" >> "$_path"/versel - echo "_sub=${ver59}" >> "$_path"/versel - ;; - "5.10") - echo "_basever=510" > "$_path"/versel - echo "_basekernel=5.10" >> "$_path"/versel - echo "_sub=${ver510}" >> "$_path"/versel - ;; - "5.11") - echo "_basever=511" > "$_path"/versel - echo "_basekernel=5.11" >> "$_path"/versel - echo "_sub=${ver511}" >> "$_path"/versel - ;; - "5.12") - echo "_basever=512" > "$_path"/versel - echo "_basekernel=5.12" >> "$_path"/versel - echo "_sub=${ver512}" >> "$_path"/versel - ;; - "5.13") - echo "_basever=513" > "$_path"/versel - echo "_basekernel=5.13" >> "$_path"/versel - echo "_sub=${ver513}" >> "$_path"/versel - ;; - *) - error "There is something wrong with your kernel version selection, exiting..." - exit 1 - esac - fi + # Select Kernel version + _set_kernel_version - # source versel early if present - if [ -e "${_path}"/versel ]; then - source "${_path}"/versel - fi + # Select CPU scheduler + _set_cpu_scheduler if [ "$_distro" != "Void" ]; then cp "$_where"/linux-tkg-patches/${_basekernel}/* "$_where" # copy patches inside the PKGBUILD's dir to preserve makepkg sourcing and md5sum checking @@ -171,120 +238,20 @@ _tkg_initscript() { cp "$_where"/linux-tkg-config/${_basekernel}/* "$_path" fi - if [ -z "$_OPTIPROFILE" ] && [ ! -e "$_path"/cpuschedset ]; then + if [ -z "$_OPTIPROFILE" ]; then # Prompt about optimized configurations. Available variable values will overwrite customization.cfg/external config ones. plain "Do you want to use a predefined optimized profile?" - read -rp "`echo $' > 1.Custom\n 2.Ryzen Desktop (Performance)\n 3.Other Desktop (Performance)\nchoice[1-3?]: '`" _OPTIPROFILE; + _default_index="0" + _prompt_from_array "Custom" "Ryzen Desktop (Performance)" "Other Desktop (Performance)" fi - if [ "$_OPTIPROFILE" = "2" ]; then + if [ "$_selected_index" = "1" ]; then source "$_where"/linux-tkg-config/ryzen-desktop-profile.cfg && msg2 "Ryzen Desktop (Performance) profile will be used." && msg2 "" - elif [ "$_OPTIPROFILE" = "3" ]; then + elif [ "$_selected_index" = "2" ]; then source "$_where"/linux-tkg-config/generic-desktop-profile.cfg && msg2 "Generic Desktop (Performance) profile will be used." && msg2 "" fi - # source cpuschedset early if present - if [ -e "${_path}"/cpuschedset ]; then - source "${_path}"/cpuschedset - fi - - # source compilerset early if present - if [ -e "${_path}"/compilerset ]; then - source "${_path}"/compilerset - fi - - # CPU SCHED selector - if [ "$_basever" = "54" ] || [ "$_basever" = "57" ]; then - _CPUSCHEDARRAY=("PDS" "MuQSS" "BMQ" "CFS") - _CPUSCHEDVARARRAY=("pds" "muqss" "MuQSS" "bmq" "cfs") - elif [ "$_basever" = "58" ]; then - _CPUSCHEDARRAY=("Undead PDS (TkG)" "Project C / PDS" "Project C / BMQ" "CFS") - _CPUSCHEDVARARRAY=("upds" "pds" "bmq" "cfs") - elif [ "$_basever" = "59" ] || [ "$_basever" = "510" ]; then - _CPUSCHEDARRAY=("Undead PDS (TkG)" "Project C / PDS" "Project C / BMQ" "MuQSS" "CFS") - _CPUSCHEDVARARRAY=("upds" "pds" "bmq" "muqss" "MuQSS" "cfs") - elif [ "$_basever" = "511" ]; then - _CPUSCHEDARRAY=("Undead PDS (TkG)" "Project C / PDS" "Project C / BMQ" "MuQSS" "CFS") - _CPUSCHEDVARARRAY=("upds" "pds" "bmq" "muqss" "MuQSS" "cfs") - elif [ "$_basever" = "512" ]; then - _CPUSCHEDARRAY=("Project C / PDS" "Project C / BMQ" "MuQSS" "CacULE" "CFS") - _CPUSCHEDVARARRAY=("pds" "bmq" "muqss" "MuQSS" "cacule" "cfs") - elif [ "$_basever" = "513" ]; then - _CPUSCHEDARRAY=("Project C / PDS" "Project C / BMQ" "CacULE" "CFS") - _CPUSCHEDVARARRAY=("pds" "bmq" "cacule" "cfs") - else - _CPUSCHEDARRAY=("CFS") - _CPUSCHEDVARARRAY=("cfs") - fi - - if [ -z "$_cpusched" ] && [ ! -e "${_path}"/cpuschedset ]; then - _cpuschedselector - elif [[ ${_CPUSCHEDVARARRAY[*]} =~ "$_cpusched" ]]; then - if ( [ "$_cpusched" = "muqss" ] || [ "$_cpusched" = "MuQSS" ] ); then - echo "_cpusched=\"MuQSS\"" > "${_path}"/cpuschedset - else - echo "_cpusched=\"$_cpusched\"" > "${_path}"/cpuschedset - fi - else - if ! [[ ${_CPUSCHEDVARARRAY[*]} =~ "$_cpusched" ]]; then - warning "Your cpusched selection ( $_cpusched ) is not available for the selected kernel version." - if [ "$_nofallback" = "true" ]; then - warning "Since _nofallback is enabled, let's exit..." - exit 1 - else - warning "Please select another:" - _cpuschedselector - fi - fi - fi - - if [ -n "$_custom_pkgbase" ]; then - echo "_custom_pkgbase=\"${_custom_pkgbase}\"" >> "${_path}"/cpuschedset - fi - - case $_compileroptlevel in - "2") - _compileropt="-O3" - ;; - "3") - _compileropt="-Os" - ;; - *) - _compileropt="-O2" - ;; - esac - -# Compiler selector - if [ -z "$_compiler" ] && [ ! -e "${_path}"/compilerset ]; then - plain "Which compiler do you want to use?" - read -rp "`echo $' > 1.GCC (recommended)\n 2.Clang/LLVM\nchoice[1-2?]: '`" _CONDITION_CMPLR; - if [ "$_CONDITION_CMPLR" = "2" ];then - echo "_compiler_name=\"-llvm\"" > ${_path}/compilerset - echo "llvm_opt=\"LLVM=1\"" >> ${_path}/compilerset - else - echo "_compiler_name=" >> ${_path}/compilerset - fi - elif [ "$_compiler" = "llvm" ]; then - echo "_compiler_name=\"-llvm\"" > ${_path}/compilerset - echo "llvm_opt=\"LLVM=1\"" >> ${_path}/compilerset - elif [ "$_compiler" = "gcc" ]; then - echo "_compiler_name=" >> ${_path}/compilerset - else - if [ "$_nofallback" != "true" ] && [ ! -e "${_path}"/compilerset ] && [ "$_compiler" != "llvm" ]; then - warning "Something is wrong with your compiler selection. Do you want to fallback to GCC (default)?" - read -rp "`echo $' > N/y : '`" _fallback; - fi - if [[ "$_fallback" =~ [yY] ]] || [ "$_nofallback" = "true" ]; then - echo "_compiler_name=" >> "${_path}"/compilerset - fi - if [ ! -e "${_path}"/compilerset ]; then - error "Exiting..." - exit 1 - fi - fi - - source "${_path}"/cpuschedset - source "${_path}"/compilerset - source "${_path}"/versel + # Set compiler + _set_compiler } user_patcher() { @@ -461,7 +428,7 @@ _tkg_srcprep() { rev=0 fi - if [ "${_cpusched}" = "MuQSS" ]; then + if [ "${_cpusched}" = "muqss" ]; then # MuQSS _msg="Applying MuQSS base patch" tkgpatch="$srcdir/0004-${_basekernel}-ck1.patch" && _tkg_patcher @@ -554,333 +521,354 @@ _tkg_srcprep() { cat "${_where}/${_configfile}" > ./.config fi + if [ "${_distro}" = "Arch" ]; then + # Reset local version string if ever it's in the .config file + scripts/config --set-str localversion "" + fi + if [ -z $_debug ]; then # Set some -tkg defaults - echo "# CONFIG_DYNAMIC_FAULT is not set" >> ./.config - sed -i -e 's/CONFIG_DEFAULT_FQ_CODEL=y/# CONFIG_DEFAULT_FQ_CODEL is not set/' ./.config - echo "CONFIG_DEFAULT_CAKE=y" >> ./.config + _disable "DYNAMIC_FAULT" "DEFAULT_FQ_CODEL" + _enable "DEFAULT_CAKE" if [ "$_basever" = "54" ]; then - echo "CONFIG_TP_SMAPI=m" >> ./.config - echo "CONFIG_RAID6_USE_PREFER_GEN=y" >> ./.config + _module "TP_SMAPI" + _enable "RAID6_USE_PREFER_GEN" fi if [ "$_basever" = "54" ] || [ "$_basever" = "59" ]; then - sed -i -e 's/CONFIG_RCU_BOOST_DELAY=500/CONFIG_RCU_BOOST_DELAY=0/' ./.config + scripts/config --set-val "RCU_BOOST_DELAY" "0" fi - echo "# CONFIG_NTP_PPS is not set" >> ./.config - echo "# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE_NODEF is not set" >> ./.config - sed -i -e 's/CONFIG_CRYPTO_LZ4=m/CONFIG_CRYPTO_LZ4=y/' ./.config - sed -i -e 's/CONFIG_CRYPTO_LZ4HC=m/CONFIG_CRYPTO_LZ4HC=y/' ./.config - sed -i -e 's/CONFIG_LZ4_COMPRESS=m/CONFIG_LZ4_COMPRESS=y/' ./.config - sed -i -e 's/CONFIG_LZ4HC_COMPRESS=m/CONFIG_LZ4HC_COMPRESS=y/' ./.config - sed -i -e 's/CONFIG_ZSWAP_COMPRESSOR_DEFAULT_LZO=y/# CONFIG_ZSWAP_COMPRESSOR_DEFAULT_LZO is not set/' ./.config - sed -i -e 's/# CONFIG_ZSWAP_COMPRESSOR_DEFAULT_LZ4 is not set/CONFIG_ZSWAP_COMPRESSOR_DEFAULT_LZ4=y/' ./.config - sed -i -e 's/CONFIG_ZSWAP_COMPRESSOR_DEFAULT="lzo"/CONFIG_ZSWAP_COMPRESSOR_DEFAULT="lz4"/' ./.config - sed -i -e 's/# CONFIG_CMDLINE_BOOL is not set/CONFIG_CMDLINE_BOOL=y/' ./.config + _disable "NTP_PPS" "CPU_FREQ_DEFAULT_GOV_PERFORMANCE_NODEF" "ZSWAP_COMPRESSOR_DEFAULT_LZO" + _enable "CRYPTO_LZ4" "CRYPTO_LZ4HC" "LZ4_COMPRESS" "LZ4HC_COMPRESS" "ZSWAP_COMPRESSOR_DEFAULT_LZ4" "CMDLINE_BOOL" + scripts/config --set-str "ZSWAP_COMPRESSOR_DEFAULT" "lz4" if [ "$_futex2" = "true" ] && [ "$_basever" != "54" ] && [ "$_basever" != "57" ] && [ "$_basever" != "58" ] && [ "$_basever" != "59" ]; then sed -i -e 's/# CONFIG_EXPERT is not set/CONFIG_EXPERT=y/' ./.config - echo -e "# CONFIG_DEBUG_RSEQ is not set\n -# CONFIG_PC104 is not set\n -# CONFIG_SLUB_MEMCG_SYSFS_ON is not set\n -# CONFIG_SLOB is not set\n -# CONFIG_PROCESSOR_SELECT is not set\n -# CONFIG_SUSPEND_SKIP_SYNC is not set\n -# CONFIG_DPM_WATCHDOG is not set\n -# CONFIG_ACPI_REDUCED_HARDWARE_ONLY is not set\n -# CONFIG_PCI_CNB20LE_QUIRK is not set\n -# CONFIG_ISA_BUS is not set\n -CONFIG_KVM_WERROR=y\n -# CONFIG_GCC_PLUGIN_CYC_COMPLEXITY is not set\n -# CONFIG_CFG80211_CERTIFICATION_ONUS is not set\n -# CONFIG_PCIE_BUS_TUNE_OFF is not set\n -CONFIG_PCIE_BUS_DEFAULT=y\n -# CONFIG_PCIE_BUS_SAFE is not set\n -# CONFIG_PCIE_BUS_PERFORMANCE is not set\n -# CONFIG_PCIE_BUS_PEER2PEER is not set\n -# CONFIG_PATA_PLATFORM is not set\n -# CONFIG_TTY_PRINTK is not set\n -# CONFIG_GPIO_SYSFS is not set\n -# CONFIG_VIDEO_TDA1997X is not set\n -# CONFIG_VIDEO_TLV320AIC23B is not set\n -# CONFIG_VIDEO_ADV7180 is not set\n -# CONFIG_VIDEO_ADV7183 is not set\n -# CONFIG_VIDEO_ADV7604 is not set\n -# CONFIG_VIDEO_ADV7842 is not set\n -# CONFIG_VIDEO_BT819 is not set\n -# CONFIG_VIDEO_BT856 is not set\n -# CONFIG_VIDEO_BT866 is not set\n -# CONFIG_VIDEO_KS0127 is not set\n -# CONFIG_VIDEO_ML86V7667 is not set\n -# CONFIG_VIDEO_SAA7110 is not set\n -# CONFIG_VIDEO_TC358743 is not set\n -# CONFIG_VIDEO_TVP514X is not set\n -# CONFIG_VIDEO_TVP7002 is not set\n -# CONFIG_VIDEO_TW9910 is not set\n -# CONFIG_VIDEO_VPX3220 is not set\n -# CONFIG_VIDEO_SAA7185 is not set\n -# CONFIG_VIDEO_ADV7170 is not set\n -# CONFIG_VIDEO_ADV7175 is not set\n -# CONFIG_VIDEO_ADV7343 is not set\n -# CONFIG_VIDEO_ADV7393 is not set\n -# CONFIG_VIDEO_ADV7511 is not set\n -# CONFIG_VIDEO_AD9389B is not set\n -# CONFIG_VIDEO_AK881X is not set\n -# CONFIG_VIDEO_THS8200 is not set\n -# CONFIG_VIDEO_THS7303 is not set\n -# CONFIG_VIDEO_I2C is not set\n -# CONFIG_VIDEO_ST_MIPID02 is not set\n -# CONFIG_VIDEO_GS1662 is not set\n -# CONFIG_MEDIA_TUNER_MSI001 is not set\n -# CONFIG_DVB_S5H1432 is not set\n -# CONFIG_DVB_DIB9000 is not set\n -# CONFIG_DVB_CXD2880 is not set\n -# CONFIG_DVB_MN88443X is not set\n -# CONFIG_DVB_LNBH29 is not set\n -# CONFIG_DVB_LGS8GL5 is not set\n -# CONFIG_DRM_DEBUG_DP_MST_TOPOLOGY_REFS is not set\n -# CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM is not set\n -# CONFIG_DRM_I915_WERROR is not set\n -# CONFIG_DRM_I915_DEBUG is not set\n -# CONFIG_DRM_I915_DEBUG_MMIO is not set\n -# CONFIG_DRM_I915_SW_FENCE_DEBUG_OBJECTS is not set\n -# CONFIG_DRM_I915_SW_FENCE_CHECK_DAG is not set\n -# CONFIG_DRM_I915_DEBUG_GUC is not set\n -# CONFIG_DRM_I915_SELFTEST is not set\n -# CONFIG_DRM_I915_LOW_LEVEL_TRACEPOINTS is not set\n -# CONFIG_DRM_I915_DEBUG_VBLANK_EVADE is not set\n -# CONFIG_DRM_I915_DEBUG_RUNTIME_PM is not set\n -# CONFIG_FB_INTEL is not set\n -# CONFIG_SND_SOC_SOF_DEVELOPER_SUPPORT is not set\n -# CONFIG_USB_KBD is not set\n -# CONFIG_USB_MOUSE is not set\n -# CONFIG_USB_OTG_DISABLE_EXTERNAL_HUB is not set\n -# CONFIG_HARDENED_USERCOPY_PAGESPAN is not set\n -CONFIG_PAHOLE_HAS_SPLIT_BTF=y\n -CONFIG_DEBUG_INFO_BTF_MODULES=y\n -# CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_32B is not set\n -# CONFIG_WIRELESS_WDS is not set\n -# CONFIG_UNWINDER_GUESS is not set\n -# CONFIG_TRIM_UNUSED_KSYMS is not set">> ./.config + echo -e "\r# start of config expert\r +# CONFIG_DEBUG_RSEQ is not set\r +# CONFIG_PC104 is not set\r +# CONFIG_SLUB_MEMCG_SYSFS_ON is not set\r +# CONFIG_SLOB is not set\r +# CONFIG_PROCESSOR_SELECT is not set\r +# CONFIG_SUSPEND_SKIP_SYNC is not set\r +# CONFIG_DPM_WATCHDOG is not set\r +# CONFIG_ACPI_REDUCED_HARDWARE_ONLY is not set\r +# CONFIG_PCI_CNB20LE_QUIRK is not set\r +# CONFIG_ISA_BUS is not set\r +CONFIG_KVM_WERROR=y\r +# CONFIG_GCC_PLUGIN_CYC_COMPLEXITY is not set\r +# CONFIG_CFG80211_CERTIFICATION_ONUS is not set\r +# CONFIG_PCIE_BUS_TUNE_OFF is not set\r +CONFIG_PCIE_BUS_DEFAULT=y\r +# CONFIG_PCIE_BUS_SAFE is not set\r +# CONFIG_PCIE_BUS_PERFORMANCE is not set\r +# CONFIG_PCIE_BUS_PEER2PEER is not set\r +# CONFIG_PATA_PLATFORM is not set\r +# CONFIG_TTY_PRINTK is not set\r +# CONFIG_GPIO_SYSFS is not set\r +# CONFIG_VIDEO_TDA1997X is not set\r +# CONFIG_VIDEO_TLV320AIC23B is not set\r +# CONFIG_VIDEO_ADV7180 is not set\r +# CONFIG_VIDEO_ADV7183 is not set\r +# CONFIG_VIDEO_ADV7604 is not set\r +# CONFIG_VIDEO_ADV7842 is not set\r +# CONFIG_VIDEO_BT819 is not set\r +# CONFIG_VIDEO_BT856 is not set\r +# CONFIG_VIDEO_BT866 is not set\r +# CONFIG_VIDEO_KS0127 is not set\r +# CONFIG_VIDEO_ML86V7667 is not set\r +# CONFIG_VIDEO_SAA7110 is not set\r +# CONFIG_VIDEO_TC358743 is not set\r +# CONFIG_VIDEO_TVP514X is not set\r +# CONFIG_VIDEO_TVP7002 is not set\r +# CONFIG_VIDEO_TW9910 is not set\r +# CONFIG_VIDEO_VPX3220 is not set\r +# CONFIG_VIDEO_SAA7185 is not set\r +# CONFIG_VIDEO_ADV7170 is not set\r +# CONFIG_VIDEO_ADV7175 is not set\r +# CONFIG_VIDEO_ADV7343 is not set\r +# CONFIG_VIDEO_ADV7393 is not set\r +# CONFIG_VIDEO_ADV7511 is not set\r +# CONFIG_VIDEO_AD9389B is not set\r +# CONFIG_VIDEO_AK881X is not set\r +# CONFIG_VIDEO_THS8200 is not set\r +# CONFIG_VIDEO_THS7303 is not set\r +# CONFIG_VIDEO_I2C is not set\r +# CONFIG_VIDEO_ST_MIPID02 is not set\r +# CONFIG_VIDEO_GS1662 is not set\r +# CONFIG_MEDIA_TUNER_MSI001 is not set\r +# CONFIG_DVB_S5H1432 is not set\r +# CONFIG_DVB_DIB9000 is not set\r +# CONFIG_DVB_CXD2880 is not set\r +# CONFIG_DVB_MN88443X is not set\r +# CONFIG_DVB_LNBH29 is not set\r +# CONFIG_DVB_LGS8GL5 is not set\r +# CONFIG_DRM_DEBUG_DP_MST_TOPOLOGY_REFS is not set\r +# CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM is not set\r +# CONFIG_DRM_I915_WERROR is not set\r +# CONFIG_DRM_I915_DEBUG is not set\r +# CONFIG_DRM_I915_DEBUG_MMIO is not set\r +# CONFIG_DRM_I915_SW_FENCE_DEBUG_OBJECTS is not set\r +# CONFIG_DRM_I915_SW_FENCE_CHECK_DAG is not set\r +# CONFIG_DRM_I915_DEBUG_GUC is not set\r +# CONFIG_DRM_I915_SELFTEST is not set\r +# CONFIG_DRM_I915_LOW_LEVEL_TRACEPOINTS is not set\r +# CONFIG_DRM_I915_DEBUG_VBLANK_EVADE is not set\r +# CONFIG_DRM_I915_DEBUG_RUNTIME_PM is not set\r +# CONFIG_FB_INTEL is not set\r +# CONFIG_SND_SOC_SOF_DEVELOPER_SUPPORT is not set\r +# CONFIG_USB_KBD is not set\r +# CONFIG_USB_MOUSE is not set\r +# CONFIG_USB_OTG_DISABLE_EXTERNAL_HUB is not set\r +# CONFIG_HARDENED_USERCOPY_PAGESPAN is not set\r +CONFIG_PAHOLE_HAS_SPLIT_BTF=y\r +CONFIG_DEBUG_INFO_BTF_MODULES=y\r +# CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_32B is not set\r +# CONFIG_WIRELESS_WDS is not set\r +# CONFIG_UNWINDER_GUESS is not set\r +# CONFIG_TRIM_UNUSED_KSYMS is not set\r +# end of config expert\n">> ./.config fi - echo "CONFIG_CMDLINE=\"${_custom_commandline}\"" >> ./.config - echo "# CONFIG_CMDLINE_OVERRIDE is not set" >> ./.config - echo "# CONFIG_X86_P6_NOP is not set" >> ./.config + scripts/config --set-str "CMDLINE" "${_custom_commandline}" + _disable "CMDLINE_OVERRIDE" "X86_P6_NOP" "CPU_FREQ_DEFAULT_GOV_ONDEMAND" "CPU_FREQ_DEFAULT_GOV_CONSERVATIVE" #echo "# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set" >> ./.config - echo "# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set" >> ./.config - echo "# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set" >> ./.config # openrgb - echo "CONFIG_I2C_NCT6775=m" >> ./.config + _module "I2C_NCT6775" # ccache fix if [ "$_noccache" != "true" ]; then if { [ "$_distro" = "Arch" ] && pacman -Qq ccache &> /dev/null; } || { [ "$_distro" = "Ubuntu" ] && dpkg -l ccache > /dev/null; }\ || { [ "$_distro" = "Void" ] && xbps-query -s ccache > /dev/null; } ; then - sed -i -e 's/CONFIG_GCC_PLUGINS=y/# CONFIG_GCC_PLUGINS is not set/' ./.config + _disable "GCC_PLUGINS" fi fi - # Prevent Debian to sign certs (Bios/UEFI) - if [ "$_distro" = "Debian" ]; then - #Help Debian cert compile problem. - sed -i -e 's#CONFIG_SYSTEM_TRUSTED_KEYS="debian/certs/test-signing-certs.pem"#CONFIG_SYSTEM_TRUSTED_KEYS=""#g' .config - #Help Debian UEFI cert compile problem - sed -i -e 's#CONFIG_SYSTEM_TRUSTED_KEYS="debian/certs/debian-uefi-certs.pem"#CONFIG_SYSTEM_TRUSTED_KEYS=""#g' .config + # Clang LTO + if [ "$_compiler_name" = "-llvm" ] && [ $_basever -ge 512 ]; then + if [ "$_lto_mode" = "full" ]; then + _enable LTO_CLANG_FULL + _disable LTO_CLANG_THIN + elif [ "$_lto_mode" = "thin" ]; then + _disable LTO_CLANG_FULL + _enable LTO_CLANG_THIN + fi fi - # Latest versions of Ubuntu require Canonical certifications. - if [ "$_distro" = "Ubuntu" ]; then - #Help Ubuntu cert compile problem. - sed -i -e 's#CONFIG_SYSTEM_TRUSTED_KEYS="debian/canonical-certs.pem"#CONFIG_SYSTEM_TRUSTED_KEYS=""#g' .config + # Void uses LibreSSL + if [ "$_distro" = "Void" ]; then + _disable "MODULE_SIG_SHA512" + _enable "MODULE_SIG_SHA1" + scripts/config --set-str "MODULE_SIG_HASH" "sha1" + fi + + # Prevent Debian and Ubuntu to sign stuff because it breaks stuff + if [[ "$_distro" = "Debian" || "$_distro" = "Ubuntu" ]]; then + #Help Debian cert compile problem. + scripts/config --set-str "SYSTEM_TRUSTED_KEYS" "" fi # Skip dbg package creation on non-Arch if [ "$_distro" != "Arch" ]; then - sed -i -e 's/CONFIG_DEBUG_INFO.*/CONFIG_DEBUG_INFO=n/' ./.config + _disable "DEBUG_INFO" fi + if [ "$_compiler_name" = "-llvm" ]; then - echo 'CONFIG_KCSAN=n' >> ./.config + _disable "KCSAN" if [ "$_basever" != "54" ] && [ "$_basever" != "57" ] && [ "$_basever" != "58" ]; then - echo 'CONFIG_INIT_STACK_ALL_PATTERN=n' >> ./.config + _disable "INIT_STACK_ALL_PATTERN" else - echo 'CONFIG_INIT_STACK_ALL=n' >> ./.config + _disable "INIT_STACK_ALL" fi - sed -i -e 's/# CONFIG_INIT_ON_FREE_DEFAULT_ON is not set/CONFIG_INIT_ON_FREE_DEFAULT_ON=y/' ./.config - sed -i -e 's/CONFIG_INIT_STACK_NONE=y/CONFIG_INIT_STACK_NONE=n/' ./.config - echo "CONFIG_INIT_STACK_ALL_ZERO=y" >> ./.config + _enable "INIT_ON_FREE_DEFAULT_ON" "INIT_STACK_ALL_ZERO" + _disable "INIT_STACK_NONE" fi if [ "$_font_autoselect" != "false" ]; then - sed -i -e 's/CONFIG_FONT_TER16x32=y/# CONFIG_FONT_TER16x32 is not set\nCONFIG_FONT_AUTOSELECT=y/' ./.config + _disable "FONT_TER16x32" + _enable "FONT_AUTOSELECT" fi # cpu opt - - if [ -n "$_processor_opt" ] && [[ "$_processor_opt" != native* ]]; then - echo "# CONFIG_MNATIVE is not set" >> ./.config - echo "# CONFIG_MNATIVE_AMD is not set" >> ./.config - echo "# CONFIG_MNATIVE_INTEL is not set" >> ./.config - fi - - if [ -n "$_processor_opt" ] && [[ "$_processor_opt" != generic* ]]; then - sed -i -e 's/CONFIG_GENERIC_CPU=y/# CONFIG_GENERIC_CPU is not set/' ./.config - echo "# CONFIG_GENERIC_CPU2 is not set" >> ./.config - echo "# CONFIG_GENERIC_CPU3 is not set" >> ./.config - echo "# CONFIG_GENERIC_CPU4 is not set" >> ./.config - elif [ -n "$_processor_opt" ] && [ "$_processor_opt" = "genericv2" ]; then - sed -i -e 's/CONFIG_GENERIC_CPU=y/# CONFIG_GENERIC_CPU is not set/' ./.config - echo "CONFIG_GENERIC_CPU2=y" >> ./.config - echo "# CONFIG_GENERIC_CPU3 is not set" >> ./.config - echo "# CONFIG_GENERIC_CPU4 is not set" >> ./.config - elif [ -n "$_processor_opt" ] && [ "$_processor_opt" = "genericv3" ]; then - sed -i -e 's/CONFIG_GENERIC_CPU=y/# CONFIG_GENERIC_CPU is not set/' ./.config - echo "# CONFIG_GENERIC_CPU2 is not set" >> ./.config - echo "CONFIG_GENERIC_CPU3=y" >> ./.config - echo "# CONFIG_GENERIC_CPU4 is not set" >> ./.config - elif [ -n "$_processor_opt" ] && [ "$_processor_opt" = "genericv4" ]; then - sed -i -e 's/CONFIG_GENERIC_CPU=y/# CONFIG_GENERIC_CPU is not set/' ./.config - echo "# CONFIG_GENERIC_CPU2 is not set" >> ./.config - echo "# CONFIG_GENERIC_CPU3 is not set" >> ./.config - echo "CONFIG_GENERIC_CPU4=y" >> ./.config - else - echo "# CONFIG_GENERIC_CPU2 is not set" >> ./.config - echo "# CONFIG_GENERIC_CPU3 is not set" >> ./.config - echo "# CONFIG_GENERIC_CPU4 is not set" >> ./.config - fi - - _cpu_marchs=("k8" "k8sse3" "k10" "barcelona" "bobcat" "jaguar" "bulldozer" "piledriver") + _cpu_marchs=("native_amd" "native_intel" "generic_cpu" "generic_cpu2" "generic_cpu3" "generic_cpu4") + _cpu_marchs+=("k8" "k8sse3" "k10" "barcelona" "bobcat" "jaguar" "bulldozer" "piledriver") _cpu_marchs+=("steamroller" "excavator" "zen" "zen2" "zen3" "mpsc" "atom" "core2" "nehalem" "westmere") _cpu_marchs+=("bonnell" "silvermont" "sandybridge" "ivybridge" "haswell" "broadwell" "skylake") _cpu_marchs+=("skylakex" "cannonlake" "icelake" "goldmont" "goldmontplus" "cascadelake") _cpu_marchs+=("cooperlake" "tigerlake" "sapphirerapids" "rocketlake" "alderlake") - _cpu_marchs+=("native" "native_amd" "native_intel") - if [ ! -z "$_processor_opt" ]; then # Don't populate when the config variable is empty - for _march in "${_cpu_marchs[@]}" - do - _march_upper=`echo ${_march} | tr '[:lower:]' '[:upper:]'` - if [ "$_processor_opt" = "$_march" ]; then - echo "CONFIG_M${_march_upper}=y/" >> ./.config - else - echo "# CONFIG_M${_march_upper} is not set" >> ./.config - fi - done + typeset -A _generic_march_map + _generic_march_map=( + ["generic"]="generic_cpu" + ["generic_v2"]="generic_cpu2" + ["generic_v3"]="generic_cpu3" + ["generic_v4"]="generic_cpu4" + ) + if [ -n "$_processor_opt" ]; then + # Replace customization.cfg convention with .config convention for generic + if [[ "${!_generic_march_map[@]}" =~ "$_processor_opt" ]]; then + _processor_opt="${_generic_march_map[$_processor_opt]}" + fi + if ! [[ "${_cpu_marchs[@]}" =~ "$_processor_opt" ]]; then + warning "the setup _processor_opt=\"${_processor_opt}\" not recognized. Prompting..." + _processor_opt="" + fi fi + if [ -z "$_processor_opt" ]; then + msg2 "Please select the desired CPU micro-architecture" + _default_index="2" + _prompt_from_array "${_cpu_marchs[@]}" + _processor_opt="${_selected_value}" + fi + + for _march in "${_cpu_marchs[@]}" + do + _march_upper=`echo "$_march" | tr '[a-z]' '[A-Z]'` + if [ "$_processor_opt" = "$_march" ]; then + if [[ "$_march" = "generic"* ]]; then + _enable "${_march_upper}" + else + _enable "M${_march_upper}" + fi + else + if [[ "$_march" = "generic"* ]]; then + _disable "${_march_upper}" + else + _disable "M${_march_upper}" + fi + fi + done + # Disable some debugging if [ "${_debugdisable}" = "true" ]; then - sed -i -e 's/CONFIG_SLUB_DEBUG=y/# CONFIG_SLUB_DEBUG is not set/' ./.config - sed -i -e 's/CONFIG_PM_DEBUG=y/# CONFIG_PM_DEBUG is not set/' ./.config - sed -i -e 's/CONFIG_PM_ADVANCED_DEBUG=y/# CONFIG_PM_ADVANCED_DEBUG is not set/' ./.config - sed -i -e 's/CONFIG_PM_SLEEP_DEBUG=y/# CONFIG_PM_SLEEP_DEBUG is not set/' ./.config - sed -i -e 's/CONFIG_ACPI_DEBUG=y/# CONFIG_ACPI_DEBUG is not set/' ./.config - sed -i -e 's/CONFIG_SCHED_DEBUG=y/# CONFIG_SCHED_DEBUG is not set/' ./.config - sed -i -e 's/CONFIG_LATENCYTOP=y/# CONFIG_LATENCYTOP is not set/' ./.config - sed -i -e 's/CONFIG_DEBUG_PREEMPT=y/# CONFIG_DEBUG_PREEMPT is not set/' ./.config + _disable "SLUB_DEBUG" "PM_DEBUG" "PM_ADVANCED_DEBUG" "PM_SLEEP_DEBUG" "ACPI_DEBUG" "SCHED_DEBUG" "LATENCYTOP" "DEBUG_PREEMPT" fi # TCP algorithms _tcp_cong_alg_list=("yeah" "bbr" "cubic" "vegas" "westwood" "reno") _user_set_tcp_alg="false" - ./scripts/config --enable TCP_CONG_ADVANCED + _enable "TCP_CONG_ADVANCED" for _alg in "${_tcp_cong_alg_list[@]}" do - ./scripts/config --enable TCP_CONG_${_alg} - ./scripts/config --disable DEFAULT_${_alg} + _alg_upper=`echo "$_alg" | tr '[a-z]' '[A-Z]'` + _enable "TCP_CONG_${_alg_upper}" if [ "$_tcp_cong_alg" = "$_alg" ];then _user_set_tcp_alg="true" - ./scripts/config --enable DEFAULT_${_alg} - ./scripts/config --set-str DEFAULT_TCP_CONG "${_alg}" + _enable "DEFAULT_${_alg_upper}" + scripts/config --set-str "DEFAULT_TCP_CONG" "${_alg}" + else + _disable "DEFAULT_${_alg_upper}" fi done if [ "$_user_set_tcp_alg" = "false" ];then - ./scripts/config --enable DEFAULT_CUBIC - ./scripts/config --set-str DEFAULT_TCP_CONG "cubic" + _enable "DEFAULT_CUBIC" + scripts/config --set-str DEFAULT_TCP_CONG "cubic" fi ####### - if [ "${_cpusched}" = "MuQSS" ]; then + if [ "${_cpusched}" = "muqss" ]; then # MuQSS default config - echo "CONFIG_SCHED_MUQSS=y" >> ./.config + _enable "SCHED_MUQSS" elif [ "${_cpusched}" = "pds" ]; then # PDS default config - echo "CONFIG_SCHED_ALT=y" >> ./.config - echo "CONFIG_SCHED_PDS=y" >> ./.config - echo "# CONFIG_SCHED_BMQ is not set" >> ./.config + _enable "SCHED_ALT" "SCHED_PDS" + _disable "SCHED_BMQ" + elif [ "${_cpusched}" = "cacule" ]; then + _enable "SCHED_AUTOGROUP" "CACULE_SCHED" + _disable "BSD_PROCESS_ACCT" "TASK_XACCT" "CGROUP_CPUACCT" "CGROUP_DEBUG" elif [ "${_cpusched}" = "upds" ]; then # PDS default config - echo "CONFIG_SCHED_PDS=y" >> ./.config + _enable "SCHED_PDS" elif [ "${_cpusched}" = "bmq" ]; then # BMQ default config - echo "CONFIG_SCHED_ALT=y" >> ./.config - echo "CONFIG_SCHED_BMQ=y" >> ./.config - echo "# CONFIG_SCHED_PDS is not set" >> ./.config - elif [ "${_cpusched}" = "cacule" ]; then - sed -i -e 's/# CONFIG_SCHED_AUTOGROUP is not set/CONFIG_SCHED_AUTOGROUP=y/' ./.config - sed -i -e 's/CONFIG_BSD_PROCESS_ACCT=y/# CONFIG_BSD_PROCESS_ACCT is not set/' ./.config - sed -i -e 's/CONFIG_TASK_XACCT=y/# CONFIG_TASK_XACCT is not set/' ./.config - sed -i -e 's/CONFIG_CGROUP_CPUACCT=y/# CONFIG_CGROUP_CPUACCT is not set/' ./.config - sed -i -e 's/CONFIG_CGROUP_DEBUG=y/# CONFIG_CGROUP_DEBUG is not set/' ./.config - echo "CONFIG_CACULE_SCHED=y" >> ./.config + _enable "SCHED_ALT" "SCHED_BMQ" + _disable "SCHED_PDS" fi - if [ "${_cpusched}" = "MuQSS" ] || [ "${_cpusched}" = "pds" ] || [ "${_cpusched}" = "bmq" ] || [ "${_cpusched}" = "upds" ]; then + if [[ "${_cpusched}" =~ ^(muqss|pds|bmq|upds)$ ]]; then # Disable CFS - sed -i -e 's/CONFIG_FAIR_GROUP_SCHED=y/# CONFIG_FAIR_GROUP_SCHED is not set/' ./.config - sed -i -e 's/CONFIG_CFS_BANDWIDTH=y/# CONFIG_CFS_BANDWIDTH is not set/' ./.config + _disable "FAIR_GROUP_SCHED" + _disable "CFS_BANDWIDTH" + + # for linux59-tkg _sched_yield_type is set to 0 + if [ "$_basever" = "59" ]; then + _sched_yield_type="0" + fi # sched yield type - if [ -n "$_sched_yield_type" ]; then - CONDITION0="$_sched_yield_type" - # in customization.cfg for linux59-tkg _sched_yield_type is set to 0 - elif [ "$_basever" = "59" ]; then - CONDITION0="0" - else + if ! [[ "$_sched_yield_type" =~ ^(0|1|2)$ ]]; then plain "" plain "CPU sched_yield_type - Choose what sort of yield sched_yield will perform." plain "" - plain "For PDS and MuQSS:" - plain "0: No yield." - plain "1: Yield only to better priority/deadline tasks." - plain "2: Expire timeslice and recalculate deadline." - plain "" - plain "For BMQ (experimental) - No recommended value yet, so try for yourself x) :" - plain "0: No yield." - plain "1: Deboost and requeue task. (default)" - plain "2: Set rq skip task." - if [ "${_cpusched}" = "MuQSS" ]; then - read -rp "`echo $'\n 0. Supposedly best option for gaming performance,\n but might lead to stability issues on some (AMD) platforms when combined with MuQSS\n > 1. Default and recommended option for MuQSS - could lead to stability issues on some (Intel) platforms\n 2. Can be a good option with low rr_interval on MuQSS\n [0-2?]: '`" CONDITION0; - else - read -rp "`echo $'\n > 0. Recommended option for gaming on PDS - "tkg" default\n 1. Default, but can lead to stability issues on some platforms\n 2. Can be a good option with low rr_interval on MuQSS\n [0-2?]: '`" CONDITION0; + + _default_index="0" + if [ "${_cpusched}" = "muqss" ]; then + plain "For MuQSS" + yield_type_array_text=( + "No yield.\n Supposedly best option for gaming performance but might lead to stability issues on some (AMD) platforms" + "Yield only to better priority/deadline tasks.\n Could lead to stability issues on some (Intel) platforms" + "Expire timeslice and recalculate deadline.\n Can be a good option with low rr_interval" + ) + elif [[ "${_cpusched}" =~ ^(pds|upds)$ ]]; then + plain "For (U)PDS" + yield_type_array_text=( + "No yield.\n Recommended option for gaming - \"tkg\" default" + "Yield only to better priority/deadline tasks.\n Could lead to stability issues on some (Intel) platforms" + "Expire timeslice and recalculate deadline.\n Can be a good option with low rr_interval" + ) + else #BMQ + plain "For BMQ (experimental) - No recommended value yet, so try for yourself x) :" + yield_type_array_text=( + "No yield." + "Deboost and requeue task." + "Set rq skip task." + ) fi + + _prompt_from_array "${yield_type_array_text[@]}" + _sched_yield_type="${_selected_index}" fi if [ "${_cpusched}" = "upds" ] || ( [ "$_basever" = "54" ] || [ "$_basever" = "57" ] && [ "${_cpusched}" = "pds" ] ); then _sched="pds" - elif [ "${_cpusched}" = "MuQSS" ] || ( [ "$_basever" != "54" ] && [ "$_cpusched" != "bmq" ] && [ "$_cpusched" != "pds" ] ) || ( [ "$_basever" = "54" ] && [ "$_cpusched" = "bmq" ] ); then + elif [ "${_cpusched}" = "muqss" ]; then + _sched="MuQSS" + elif ( [ "$_basever" != "54" ] && [ "$_cpusched" != "bmq" ] && [ "$_cpusched" != "pds" ] ) || ( [ "$_basever" = "54" ] && [ "$_cpusched" = "bmq" ] ); then _sched="${_cpusched}" else _sched="alt_core" fi - if [ "$CONDITION0" = "0" ]; then + if [ "$_sched_yield_type" = "0" ]; then sed -i -e 's/int sched_yield_type __read_mostly = 1;/int sched_yield_type __read_mostly = 0;/' ./kernel/sched/${_sched}.c - elif [ "$CONDITION0" = "1" ]; then + elif [ "$_sched_yield_type" = "1" ]; then msg2 "Using default CPU sched yield type (1)" - elif [ "$CONDITION0" = "2" ]; then + elif [ "$_sched_yield_type" = "2" ]; then sed -i -e 's/int sched_yield_type __read_mostly = 1;/int sched_yield_type __read_mostly = 2;/' ./kernel/sched/${_sched}.c - else - if [ "${_cpusched}" = "MuQSS" ]; then - msg2 "Using default CPU sched yield type (1)" - else - sed -i -e 's/int sched_yield_type __read_mostly = 1;/int sched_yield_type __read_mostly = 0;/' ./kernel/sched/${_sched}.c - fi fi fi # Round Robin interval - if [ "${_cpusched}" = "MuQSS" ] || [ "${_cpusched}" = "pds" ] || [ "${_cpusched}" = "bmq" ] || [ "${_cpusched}" = "upds" ]; then - if [ -n "$_rr_interval" ]; then - CONDITION1="$_rr_interval" + if [[ "${_cpusched}" =~ ^(muqss|pds|bmq|upds)$ ]]; then + _rr_interval_array=("2" "4" "6" "8") + _rr_interval_array_text=("2ms" "4ms" "6ms" "8ms") + + typeset -A _rr_interval_default_indexes + _rr_interval_default_indexes=( + ["muqss"]="2" + ["pds"]="1" + ["upds"]="1" + ["bmq"]="0" + ) + + _default_index="${_rr_interval_default_indexes[$_cpusched]}" + + #Remove whitespaces from variable + _rr_interval=`echo ${_rr_interval} | tr -d " "` + + if [ "${_rr_interval}" = "default" ]; then + _rr_interval="${_rr_interval_array[$_default_index]}" + elif [[ "$_rr_interval" =~ ^(1|2|3|4)$ ]]; then + _rr_interval=$(($_rr_interval * 2)) else plain "" plain "Round Robin interval is the longest duration two tasks with the same nice level will" @@ -888,231 +876,150 @@ CONFIG_DEBUG_INFO_BTF_MODULES=y\n plain "to the rr_interval in addition to a virtual deadline. When using yield_type 2, a low" plain "value can help offset the disadvantages of rescheduling a process that has yielded." plain "" - plain "MuQSS default: 6ms" - plain "PDS default: 4ms" - plain "BMQ default: 2ms" - read -rp "`echo $'\n > 0.Keep defaults\n 1.2ms\n 2.4ms\n 3.6ms\n 4.8ms\n [0-4?]: '`" CONDITION1; - fi - if [ "$CONDITION1" = "1" ]; then - msg2 "Using 2ms rr_interval" - _rrvalue="2" - elif [ "$CONDITION1" = "2" ]; then - msg2 "Using 4ms rr_interval" - _rrvalue="4" - elif [ "$CONDITION1" = "3" ]; then - msg2 "Using 6ms rr_interval" - _rrvalue="6" - elif [ "$CONDITION1" = "4" ]; then - msg2 "Using 8ms rr_interval" - _rrvalue="8" - else - msg2 "Using default rr_interval" - _rrvalue="default" + + _prompt_from_array "${_rr_interval_array_text[@]}" + _rr_interval="${_rr_interval_array[$_selected_index]}" fi + msg2 "Using ${_rr_interval}ms round robin interval" + if [ "$_basever" != "54" ]; then - if [ "$_rrvalue" != "default" ]; then - if [ "${_cpusched}" = "MuQSS" ]; then - sed -i -e "s/int rr_interval __read_mostly = 6;/int rr_interval __read_mostly = ${_rrvalue};/" ./kernel/sched/"${_cpusched}".c - elif [ "${_cpusched}" = "upds" ]; then - sed -i -e "s/#define SCHED_DEFAULT_RR (4)/#define SCHED_DEFAULT_RR (${_rrvalue})/" ./kernel/sched/pds.c - elif [ "${_cpusched}" = "bmq" ] || [ "${_cpusched}" = "pds" ]; then - sed -i -e "s/u64 sched_timeslice_ns __read_mostly = (4 * 1000 * 1000);/u64 sched_timeslice_ns __read_mostly = (${_rrvalue} * 1000 * 1000);/" ./kernel/sched/${_sched}.c - fi - if [ "${_cpusched}" == "bmq" ]; then - echo "CONFIG_SCHED_TIMESLICE=2" >> ./.config - fi - else - if [ "${_cpusched}" = "bmq" ] || [ "${_cpusched}" = "pds" ]; then - sed -i -e "s/u64 sched_timeslice_ns __read_mostly = (4 * 1000 * 1000);/u64 sched_timeslice_ns __read_mostly = (2 * 1000 * 1000);/" ./kernel/sched/${_sched}.c - fi + if [ "${_cpusched}" = "muqss" ]; then + sed -i -e "s/int rr_interval __read_mostly = 6;/int rr_interval __read_mostly = ${_rr_interval};/" ./kernel/sched/"${_sched}".c + elif [ "${_cpusched}" = "upds" ]; then + sed -i -e "s/#define SCHED_DEFAULT_RR (4)/#define SCHED_DEFAULT_RR (${_rr_interval})/" ./kernel/sched/pds.c + elif [ "${_cpusched}" = "bmq" ] || [ "${_cpusched}" = "pds" ]; then + sed -i -e "s/u64 sched_timeslice_ns __read_mostly = (4 * 1000 * 1000);/u64 sched_timeslice_ns __read_mostly = (${_rr_interval} * 1000 * 1000);/" ./kernel/sched/${_sched}.c + fi + if [ "${_cpusched}" = "bmq" ]; then + scripts/config --set-val "SCHED_TIMESLICE" "2" fi else - if [ "$_rrvalue" != "default" ]; then - if [ "${_cpusched}" == "MuQSS" ]; then - sed -i -e "s/int rr_interval __read_mostly = 6;/int rr_interval __read_mostly = ${_rrvalue};/" ./kernel/sched/"${_cpusched}".c - elif [ "${_cpusched}" == "pds" ]; then - sed -i -e "s/#define SCHED_DEFAULT_RR (4)/#define SCHED_DEFAULT_RR (${_rrvalue})/" ./kernel/sched/"${_cpusched}".c - elif [ "${_cpusched}" == "bmq" ]; then - echo "CONFIG_SCHED_TIMESLICE=${_rrvalue}" >> ./.config - fi - else - if [ "${_cpusched}" == "bmq" ]; then - echo "CONFIG_SCHED_TIMESLICE=2" >> ./.config - fi + if [ "${_cpusched}" == "muqss" ]; then + sed -i -e "s/int rr_interval __read_mostly = 6;/int rr_interval __read_mostly = ${_rr_interval};/" ./kernel/sched/"${_sched}".c + elif [ "${_cpusched}" == "pds" ]; then + sed -i -e "s/#define SCHED_DEFAULT_RR (4)/#define SCHED_DEFAULT_RR (${_rr_interval})/" ./kernel/sched/"${_sched}".c + elif [ "${_cpusched}" == "bmq" ]; then + scripts/config --set-val "SCHED_TIMESLICE" "${_rr_interval}" fi fi fi # zenify - if [ "$_zenify" = "true" ]; then - echo "CONFIG_ZENIFY=y" >> ./.config - elif [ "$_zenify" = "false" ]; then - echo "# CONFIG_ZENIFY is not set" >> ./.config + if [ "$_zenify" = "false" ]; then + _disable "ZENIFY" + else + _enable "ZENIFY" fi # compiler optimization level if [ "$_compileroptlevel" = "1" ]; then if [ "$_basever" != "54" ]; then - echo "# CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE_O3 is not set" >> ./.config + _disable "CC_OPTIMIZE_FOR_PERFORMANCE_O3" else - echo "# CONFIG_CC_OPTIMIZE_HARDER is not set" >> ./.config + _disable "CC_OPTIMIZE_HARDER" fi elif [ "$_compileroptlevel" = "2" ]; then - sed -i -e 's/CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y/# CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE is not set/' ./.config + _disable "CC_OPTIMIZE_FOR_PERFORMANCE" if [ "$_basever" != "54" ]; then - echo "CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE_O3=y" >> ./.config + _enable "CC_OPTIMIZE_FOR_PERFORMANCE_O3" else - echo "CONFIG_CC_OPTIMIZE_HARDER=y" >> ./.config + _enable "CC_OPTIMIZE_HARDER" fi elif [ "$_compileroptlevel" = "3" ]; then - sed -i -e 's/CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y/# CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE is not set/' ./.config - sed -i -e 's/# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set/CONFIG_CC_OPTIMIZE_FOR_SIZE=y/' ./.config + _disable "CC_OPTIMIZE_FOR_PERFORMANCE" + _enable "CC_OPTIMIZE_FOR_SIZE" if [ "$_basever" != "54" ]; then - echo "# CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE_O3 is not set" >> ./.config + _disable "CC_OPTIMIZE_FOR_PERFORMANCE_O3" else - echo "# CONFIG_CC_OPTIMIZE_HARDER is not set" >> ./.config + _disable "CC_OPTIMIZE_HARDER" fi fi # irq threading if [ "$_irq_threading" = "true" ]; then - echo "CONFIG_FORCE_IRQ_THREADING=y" >> ./.config + _enable "FORCE_IRQ_THREADING" elif [ "$_irq_threading" = "false" ]; then - echo "# CONFIG_FORCE_IRQ_THREADING is not set" >> ./.config + _disable "FORCE_IRQ_THREADING" fi # smt nice if [ "$_smt_nice" = "true" ]; then - echo "CONFIG_SMT_NICE=y" >> ./.config + _enable "SMT_NICE" elif [ "$_smt_nice" = "false" ]; then - echo "# CONFIG_SMT_NICE is not set" >> ./.config + _disable "SMT_NICE" fi # random trust cpu if [ "$_random_trust_cpu" = "true" ]; then - sed -i -e 's/# CONFIG_RANDOM_TRUST_CPU is not set/CONFIG_RANDOM_TRUST_CPU=y/' ./.config + _enable "RANDOM_TRUST_CPU" fi # rq sharing - if [ "$_runqueue_sharing" = "none" ]; then - echo -e "CONFIG_RQ_NONE=y\n# CONFIG_RQ_SMT is not set\n# CONFIG_RQ_MC is not set\n# CONFIG_RQ_MC_LLC is not set\n# CONFIG_RQ_SMP is not set\n# CONFIG_RQ_ALL is not set" >> ./.config - elif [ -z "$_runqueue_sharing" ] || [ "$_runqueue_sharing" = "smt" ]; then - echo -e "# CONFIG_RQ_NONE is not set\nCONFIG_RQ_SMT=y\n# CONFIG_RQ_MC is not set\n# CONFIG_RQ_MC_LLC is not set\n# CONFIG_RQ_SMP is not set\n# CONFIG_RQ_ALL is not set" >> ./.config - elif [ "$_runqueue_sharing" = "mc" ]; then - echo -e "# CONFIG_RQ_NONE is not set\n# CONFIG_RQ_SMT is not set\nCONFIG_RQ_MC=y\n# CONFIG_RQ_MC_LLC is not set\n# CONFIG_RQ_SMP is not set\n# CONFIG_RQ_ALL is not set" >> ./.config - elif [ "$_runqueue_sharing" = "smp" ]; then - echo -e "# CONFIG_RQ_NONE is not set\n# CONFIG_RQ_SMT is not set\n# CONFIG_RQ_MC is not set\n# CONFIG_RQ_MC_LLC is not set\nCONFIG_RQ_SMP=y\n# CONFIG_RQ_ALL is not set" >> ./.config - elif [ "$_runqueue_sharing" = "all" ]; then - echo -e "# CONFIG_RQ_NONE is not set\n# CONFIG_RQ_SMT is not set\n# CONFIG_RQ_MC is not set\n# CONFIG_RQ_MC_LLC is not set\n# CONFIG_RQ_SMP is not set\nCONFIG_RQ_ALL=y" >> ./.config - elif [ "$_runqueue_sharing" = "mc-llc" ]; then - echo -e "# CONFIG_RQ_NONE is not set\n# CONFIG_RQ_SMT is not set\n# CONFIG_RQ_MC is not set\nCONFIG_RQ_MC_LLC=y\n# CONFIG_RQ_SMP is not set\n# CONFIG_RQ_ALL is not set" >> ./.config + if [ "${_cpusched}" = "muqss" ]; then + _disable "RQ_NONE" "RQ_SMT" "RQ_MC" "RQ_MC_LLC" "RQ_SMP" "RQ_ALL" + if [ "$_runqueue_sharing" = "none" ]; then + _enable "RQ_NONE" + elif [ -z "$_runqueue_sharing" ] || [ "$_runqueue_sharing" = "smt" ]; then + _enable "RQ_SMT" + elif [ "$_runqueue_sharing" = "mc" ]; then + _enable "RQ_MC" + elif [ "$_runqueue_sharing" = "smp" ]; then + _enable "RQ_SMP" + elif [ "$_runqueue_sharing" = "all" ]; then + _enable "RQ_ALL" + elif [ "$_runqueue_sharing" = "mc-llc" ]; then + _enable "RQ_MC_LLC" + fi fi # timer freq - if [ -n "$_timer_freq" ] && [ "$_timer_freq" != "300" ]; then - sed -i -e 's/CONFIG_HZ_300=y/# CONFIG_HZ_300 is not set/' ./.config - sed -i -e 's/CONFIG_HZ_300_NODEF=y/# CONFIG_HZ_300_NODEF is not set/' ./.config - if [ "$_timer_freq" = "2000" ] && [ "${_cpusched}" != "cacule" ]; then - _timer_freq="1000" - elif [ "$_timer_freq" = "2000" ] && [ "${_cpusched}" = "cacule" ]; then - sed -i -e 's/CONFIG_HZ=300/CONFIG_HZ=2000/' ./.config - echo "CONFIG_HZ_2000=y" >> ./.config - echo "# CONFIG_HZ_500 is not set" >> ./.config - echo "# CONFIG_HZ_500_NODEF is not set" >> ./.config - echo "# CONFIG_HZ_750 is not set" >> ./.config - echo "# CONFIG_HZ_750_NODEF is not set" >> ./.config - echo "# CONFIG_HZ_1000 is not set" >> ./.config - echo "# CONFIG_HZ_1000_NODEF is not set" >> ./.config - echo "# CONFIG_HZ_250_NODEF is not set" >> ./.config - echo "# CONFIG_HZ_300_NODEF is not set" >> ./.config - fi - if [ "$_timer_freq" = "1000" ]; then - sed -i -e 's/# CONFIG_HZ_1000 is not set/CONFIG_HZ_1000=y/' ./.config - sed -i -e 's/CONFIG_HZ=300/CONFIG_HZ=1000/' ./.config - echo "# CONFIG_HZ_500 is not set" >> ./.config - echo "# CONFIG_HZ_500_NODEF is not set" >> ./.config - echo "# CONFIG_HZ_750 is not set" >> ./.config - echo "# CONFIG_HZ_750_NODEF is not set" >> ./.config - echo "CONFIG_HZ_1000_NODEF=y" >> ./.config - echo "# CONFIG_HZ_250_NODEF is not set" >> ./.config - echo "# CONFIG_HZ_300_NODEF is not set" >> ./.config - echo "# CONFIG_HZ_2000 is not set" >> ./.config - elif [ "$_timer_freq" = "750" ]; then - sed -i -e 's/CONFIG_HZ=300/CONFIG_HZ=750/' ./.config - echo "# CONFIG_HZ_500 is not set" >> ./.config - echo "# CONFIG_HZ_500_NODEF is not set" >> ./.config - echo "CONFIG_HZ_750=y" >> ./.config - echo "CONFIG_HZ_750_NODEF=y" >> ./.config - echo "# CONFIG_HZ_1000_NODEF is not set" >> ./.config - echo "# CONFIG_HZ_250_NODEF is not set" >> ./.config - echo "# CONFIG_HZ_300_NODEF is not set" >> ./.config - echo "# CONFIG_HZ_2000 is not set" >> ./.config - elif [ "$_timer_freq" = "500" ]; then - sed -i -e 's/CONFIG_HZ=300/CONFIG_HZ=500/' ./.config - echo "CONFIG_HZ_500=y" >> ./.config - echo "CONFIG_HZ_500_NODEF=y" >> ./.config - echo "# CONFIG_HZ_750 is not set" >> ./.config - echo "# CONFIG_HZ_750_NODEF is not set" >> ./.config - echo "# CONFIG_HZ_1000_NODEF is not set" >> ./.config - echo "# CONFIG_HZ_250_NODEF is not set" >> ./.config - echo "# CONFIG_HZ_300_NODEF is not set" >> ./.config - echo "# CONFIG_HZ_2000 is not set" >> ./.config - elif [ "$_timer_freq" = "100" ]; then - sed -i -e 's/CONFIG_HZ=300/CONFIG_HZ=100/' ./.config - echo "# CONFIG_HZ_500 is not set" >> ./.config - echo "# CONFIG_HZ_750 is not set" >> ./.config - echo "# CONFIG_HZ_1000_NODEF is not set" >> ./.config - echo "# CONFIG_HZ_750_NODEF is not set" >> ./.config - echo "# CONFIG_HZ_500_NODEF is not set" >> ./.config - echo "# CONFIG_HZ_250_NODEF is not set" >> ./.config - echo "# CONFIG_HZ_300_NODEF is not set" >> ./.config - echo "CONFIG_HZ_100=y" >> ./.config - echo "CONFIG_HZ_100_NODEF=y" >> ./.config - echo "# CONFIG_HZ_2000 is not set" >> ./.config - fi - elif [ "${_cpusched}" = "MuQSS" ] && [ -z "$_timer_freq" ]; then - sed -i -e 's/CONFIG_HZ=300/CONFIG_HZ=100/' ./.config - echo "# CONFIG_HZ_500 is not set" >> ./.config - echo "# CONFIG_HZ_750 is not set" >> ./.config - echo "# CONFIG_HZ_1000_NODEF is not set" >> ./.config - echo "# CONFIG_HZ_750_NODEF is not set" >> ./.config - echo "# CONFIG_HZ_500_NODEF is not set" >> ./.config - echo "# CONFIG_HZ_250_NODEF is not set" >> ./.config - echo "# CONFIG_HZ_300_NODEF is not set" >> ./.config - echo "CONFIG_HZ_100=y" >> ./.config - echo "CONFIG_HZ_100_NODEF=y" >> ./.config - echo "# CONFIG_HZ_2000 is not set" >> ./.config - elif [ "${_cpusched}" = "cacule" ] && [ -z "$_timer_freq" ]; then - sed -i -e 's/CONFIG_HZ=300/CONFIG_HZ=1000/' ./.config - echo "# CONFIG_HZ_500 is not set" >> ./.config - echo "# CONFIG_HZ_750 is not set" >> ./.config - echo "# CONFIG_HZ_1000_NODEF is not set" >> ./.config - echo "# CONFIG_HZ_750_NODEF is not set" >> ./.config - echo "# CONFIG_HZ_500_NODEF is not set" >> ./.config - echo "# CONFIG_HZ_250_NODEF is not set" >> ./.config - echo "# CONFIG_HZ_300_NODEF is not set" >> ./.config - echo "CONFIG_HZ_1000=y" >> ./.config - echo "# CONFIG_HZ_100 is not set" >> ./.config - echo "# CONFIG_HZ_100_NODEF is not set" >> ./.config - else - sed -i -e 's/CONFIG_HZ_300=y/# CONFIG_HZ_300 is not set/' ./.config - sed -i -e 's/CONFIG_HZ_300_NODEF=y/# CONFIG_HZ_300_NODEF is not set/' ./.config - sed -i -e 's/CONFIG_HZ=300/CONFIG_HZ=500/' ./.config - echo "CONFIG_HZ_500=y" >> ./.config - echo "CONFIG_HZ_500_NODEF=y" >> ./.config - echo "# CONFIG_HZ_250_NODEF is not set" >> ./.config - echo "# CONFIG_HZ_300_NODEF is not set" >> ./.config + _avail_timer_frequencies=("100" "250" "300" "500" "750" "1000") + _avail_timer_frequencies_text=("100 Hz" "250 Hz" "300 Hz" "500 Hz" "750 Hz" "1000 Hz") + if [ "$_cpusched" = "cacule" ]; then + _avail_timer_frequencies+=("2000") + _avail_timer_frequencies_text+=("2000 Hz") fi + typeset -A _default_timer_frequencies_index + _default_timer_frequencies_index=( + ["pds"]="3" + ["muqss"]="1" + ["cacule"]="5" + ["upds"]="3" + ["cfs"]="3" + ["bmq"]="3" + ) + + if [[ -n "$_timer_freq" && ! "${_avail_timer_frequencies[*]}" =~ "$_timer_freq" ]]; then + warning "The entered timer frequency, ${_timer_freq}Hz, is not available, prompting..." + _timer_freq="" + fi + + # Default to 500Hz if _timer_freq is not set + if [ -z "$_timer_freq" ]; then + _default_index="${_default_timer_frequencies_index[$_cpusched]}" + msg2 "Which kernel interrupt timer frequency would you like to use ?" + msg2 "Higher Hz means lower latency (but higher overhead / less throughput). So it's a double edged sword" + msg2 "Pick default (aka press enter with empty input) if unsure" + _prompt_from_array "${_avail_timer_frequencies_text[@]}" + _timer_freq="${_avail_timer_frequencies[$_selected_index]}" + fi + + for _freq in "${_avail_timer_frequencies[@]}"; do + if [ "$_freq" = "$_timer_freq" ]; then + _enable "HZ_${_freq}" "HZ_${_freq}_NODEF" + else + _disable "HZ_${_freq}" "HZ_${_freq}_NODEF" + fi + done + # default cpu gov if [ "$_default_cpu_gov" = "performance" ]; then - sed -i -e 's/CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL=y/# CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL is not set/' ./.config - sed -i -e 's/# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set/CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y/' ./.config - sed -i -e 's/# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE_NODEF is not set/CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE_NODEF=y/' ./.config + _disable "CPU_FREQ_DEFAULT_GOV_SCHEDUTIL" + _enable "CPU_FREQ_DEFAULT_GOV_PERFORMANCE" "CPU_FREQ_DEFAULT_GOV_PERFORMANCE_NODEF" elif [ "$_default_cpu_gov" = "ondemand" ]; then - sed -i -e 's/CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL=y/# CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL is not set/' ./.config - sed -i -e 's/# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set/CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y/' ./.config - sed -i -e 's/CONFIG_CPU_FREQ_GOV_ONDEMAND=m/CONFIG_CPU_FREQ_GOV_ONDEMAND=y/' ./.config + _disable "CPU_FREQ_DEFAULT_GOV_SCHEDUTIL" + _enable "CPU_FREQ_DEFAULT_GOV_ONDEMAND" "CPU_FREQ_GOV_ONDEMAND" fi # ftrace @@ -1123,8 +1030,7 @@ CONFIG_DEBUG_INFO_BTF_MODULES=y\n read -rp "`echo $' > N/y : '`" CONDITION2; fi if [[ "$CONDITION2" =~ [yY] ]] || [ "$_ftracedisable" = "true" ]; then - sed -i -e 's/CONFIG_FUNCTION_TRACER=y/# CONFIG_FUNCTION_TRACER is not set/' ./.config - sed -i -e 's/CONFIG_FUNCTION_GRAPH_TRACER=y/# CONFIG_FUNCTION_GRAPH_TRACER is not set/' ./.config + _disable "FUNCTION_TRACER" "FUNCTION_GRAPH_TRACER" fi # disable numa @@ -1136,48 +1042,31 @@ CONFIG_DEBUG_INFO_BTF_MODULES=y\n fi if [[ "$CONDITION3" =~ [yY] ]] || [ "$_numadisable" = "true" ]; then # disable NUMA since 99.9% of users do not have multiple CPUs but do have multiple cores in one CPU - sed -i -e 's/CONFIG_NUMA=y/# CONFIG_NUMA is not set/' \ - -i -e '/CONFIG_AMD_NUMA=y/d' \ - -i -e '/CONFIG_X86_64_ACPI_NUMA=y/d' \ - -i -e '/CONFIG_NODES_SPAN_OTHER_NODES=y/d' \ - -i -e '/# CONFIG_NUMA_EMU is not set/d' \ - -i -e '/CONFIG_NODES_SHIFT=6/d' \ - -i -e '/CONFIG_NEED_MULTIPLE_NODES=y/d' \ - -i -e '/CONFIG_USE_PERCPU_NUMA_NODE_ID=y/d' \ - -i -e '/CONFIG_ACPI_NUMA=y/d' ./.config + _disable "NUMA" "AMD_NUMA" "ACPI_NUMA" "X86_64_ACPI_NUMA" "NODES_SPAN_OTHER_NODES" "NUMA_EMU" "NODES_SHIFT" "NEED_MULTIPLE_NODES" "USE_PERCPU_NUMA_NODE_ID" fi # tickless - if [ -z "$_tickless" ]; then - plain "" + if [[ -z "$_tickless" || ! "$_tickless" =~ ^(0|1|2)$ ]]; then + # Set to "1" to use CattaRappa mode (enabling full tickless), "2" for tickless idle only, or "0" for periodic ticks. plain "Use CattaRappa mode (Tickless/Dynticks) ?" - plain "Can give higher performances in many cases but lower consistency on some hardware." - plain "Just tickless idle can perform better with some platforms (mostly AMD) or CPU schedulers (mostly MuQSS)." - read -rp "`echo $'\n 0.No, use periodic ticks\n 1.Yes, full tickless baby!\n > 2.Just tickless idle plz\n [0-2?]: '`" CONDITION4; + _tickless_array_text=( + "No, use periodic ticks." + "Yes, full tickless baby!\n Can give higher performances in many cases but lower consistency on some hardware." + "Just tickless idle plz.\n Just tickless idle can perform better with some platforms (mostly AMD) or CPU schedulers (mostly MuQSS)." + ) + _default_index="2" + _prompt_from_array "${_tickless_array_text[@]}" + _tickless="${_selected_index}" fi - if [ "$CONDITION4" = "0" ] || [ "$_tickless" = "0" ]; then - echo "# CONFIG_NO_HZ_FULL_NODEF is not set" >> ./.config - sed -i -e 's/# CONFIG_HZ_PERIODIC is not set/CONFIG_HZ_PERIODIC=y/' ./.config - sed -i -e 's/CONFIG_NO_HZ_IDLE=y/# CONFIG_NO_HZ_IDLE is not set/' ./.config - sed -i -e 's/CONFIG_NO_HZ_FULL=y/# CONFIG_NO_HZ_FULL is not set/' ./.config - sed -i -e 's/CONFIG_NO_HZ=y/# CONFIG_NO_HZ is not set/' ./.config - sed -i -e 's/CONFIG_NO_HZ_COMMON=y/# CONFIG_NO_HZ_COMMON is not set/' ./.config - elif [ "$CONDITION4" = "2" ] || [ "$_tickless" = "1" ]; then - echo "CONFIG_NO_HZ_FULL_NODEF=y" >> ./.config - sed -i -e 's/CONFIG_HZ_PERIODIC=y/# CONFIG_HZ_PERIODIC is not set/' ./.config - sed -i -e 's/CONFIG_NO_HZ_IDLE=y/# CONFIG_NO_HZ_IDLE is not set/' ./.config - sed -i -e 's/# CONFIG_NO_HZ_FULL is not set/CONFIG_NO_HZ_FULL=y/' ./.config - sed -i -e 's/# CONFIG_NO_HZ is not set/CONFIG_NO_HZ=y/' ./.config - sed -i -e 's/# CONFIG_NO_HZ_COMMON is not set/CONFIG_NO_HZ_COMMON=y/' ./.config - echo "CONFIG_CONTEXT_TRACKING=y" >> ./.config - echo "# CONFIG_CONTEXT_TRACKING_FORCE is not set" >> ./.config + if [ "$_tickless" = "0" ]; then + _disable "NO_HZ_FULL_NODEF" "NO_HZ_IDLE" "NO_HZ_FULL" "NO_HZ" "NO_HZ_COMMON" + _enable "HZ_PERIODIC" + elif [ "$_tickless" = "1" ]; then + _disable "HZ_PERIODIC" "NO_HZ_IDLE" "CONTEXT_TRACKING_FORCE" + _enable "NO_HZ_FULL_NODEF" "NO_HZ_FULL" "NO_HZ" "NO_HZ_COMMON" "CONTEXT_TRACKING" else - echo "# CONFIG_NO_HZ_FULL_NODEF is not set" >> ./.config - sed -i -e 's/CONFIG_HZ_PERIODIC=y/# CONFIG_HZ_PERIODIC is not set/' ./.config - sed -i -e 's/# CONFIG_NO_HZ_IDLE is not set/CONFIG_NO_HZ_IDLE=y/' ./.config - sed -i -e 's/CONFIG_NO_HZ_FULL=y/# CONFIG_NO_HZ_FULL is not set/' ./.config - sed -i -e 's/# CONFIG_NO_HZ is not set/CONFIG_NO_HZ=y/' ./.config - sed -i -e 's/# CONFIG_NO_HZ_COMMON is not set/CONFIG_NO_HZ_COMMON=y/' ./.config + _disable "NO_HZ_FULL_NODEF" "HZ_PERIODIC" "NO_HZ_FULL" + _enable "NO_HZ_IDLE" "NO_HZ" "NO_HZ_COMMON" fi # acs override @@ -1207,12 +1096,10 @@ CONFIG_DEBUG_INFO_BTF_MODULES=y\n if [[ "$CONDITION8" =~ [yY] ]] || [ "$_bcachefs" = "true" ]; then _msg="Patching Bcache filesystem support override" _tkg_patcher - echo "CONFIG_BCACHEFS_FS=m" >> ./.config - echo "CONFIG_BCACHEFS_QUOTA=y" >> ./.config - echo "CONFIG_BCACHEFS_POSIX_ACL=y" >> ./.config - echo "# CONFIG_BCACHEFS_DEBUG is not set" >> ./.config - echo "# CONFIG_BCACHEFS_TESTS is not set" >> ./.config - echo "# CONFIG_DEBUG_CLOSURES is not set" >> ./.config + + _module "BCACHEFS_FS" + _enable "BCACHEFS_QUOTA" "BCACHEFS_POSIX_ACL" + _disable "BCACHEFS_DEBUG" "BCACHEFS_TESTS" "DEBUG_CLOSURES" fi fi @@ -1245,7 +1132,7 @@ CONFIG_DEBUG_INFO_BTF_MODULES=y\n if [[ "$CONDITION10" =~ [yY] ]] || [ "$_futex2" = "true" ]; then _msg="Patching futex2 support" _tkg_patcher - echo "CONFIG_FUTEX2=y" >> ./.config + _enable "FUTEX2" fi fi @@ -1262,7 +1149,7 @@ CONFIG_DEBUG_INFO_BTF_MODULES=y\n if [[ "$CONDITION_winesync" =~ [yY] ]] || [ "$_winesync" = "true" ]; then _msg="Patching winesync/fastsync support" _tkg_patcher - echo "CONFIG_WINESYNC=m" >> ./.config + _module "WINESYNC" echo "KERNEL==\"winesync\", MODE=\"0644\"" > ../winesync.rules echo "winesync" > ../winesync.conf fi @@ -1281,15 +1168,9 @@ CONFIG_DEBUG_INFO_BTF_MODULES=y\n read -rp "`echo $' > N/y : '`" CONDITION12; fi if [[ "$CONDITION12" =~ [yY] ]] || [ "$_anbox" = "true" ]; then - echo "CONFIG_ASHMEM=y" >> ./.config - echo "CONFIG_ION=y" >> ./.config - echo "CONFIG_ION_CMA_HEAP=y" >> ./.config - echo "# CONFIG_ION_SYSTEM_HEAP is not set" >> ./.config - echo "CONFIG_ANDROID=y" >> ./.config - echo "CONFIG_ANDROID_BINDER_IPC=y" >> ./.config - echo "CONFIG_ANDROID_BINDERFS=y" >>./.config - echo 'CONFIG_ANDROID_BINDER_DEVICES="binder,hwbinder,vndbinder"' >>./.config - echo "# CONFIG_ANDROID_BINDER_IPC_SELFTEST is not set" >> ./.config + _enable "ASHMEM" "ION" "ION_CMA_HEAP" "ANDROID" "ANDROID_BINDER_IPC" "ANDROID_BINDERFS" + _disable "ION_SYSTEM_HEAP" "ANDROID_BINDER_IPC_SELFTEST" + scripts/config --set-str "ANDROID_BINDER_DEVICES" "binder,hwbinder,vndbinder" warning "Please make sure to read up on how to use this; https://github.com/Frogging-Family/linux-tkg#anbox-usage" if [[ "$CONDITION12" =~ [yY] ]]; then read -rp "Press enter to continue..." @@ -1349,9 +1230,9 @@ CONFIG_DEBUG_INFO_BTF_MODULES=y\n exit 1 fi # Workaround for: https://github.com/Tk-Glitch/PKGBUILDS/issues/404. - echo "# CONFIG_GPIO_BT8XX is not set" >> ./.config - echo "# CONFIG_SND_SE6X is not set" >> ./.config - + # Long live #404! + _disable "GPIO_BT8XX" "SND_SE6X" + make LSMOD=$_modprobeddb_db_path localmodconfig ${llvm_opt} fi @@ -1455,10 +1336,6 @@ CONFIG_DEBUG_INFO_BTF_MODULES=y\n } exit_cleanup() { - # Remove state tracker - rm -f "$_where"/cpuschedset - rm -f "$_where"/compilerset - rm -f "$_where"/versel # Remove temporarily copied files rm -rf "$_where"/*.patch @@ -1468,6 +1345,9 @@ exit_cleanup() { rm -f "$_where"/cleanup rm -f "$_where"/prepare + # Remove state tracker + rm -f "$_where"/BIG_UGLY_FROGMINER + # Remove winesync rules file rm -f "$_where"/winesync.rules