1085 lines
46 KiB
Bash
1085 lines
46 KiB
Bash
# Based on the file created for Arch Linux by:
|
|
# Tobias Powalowski <tpowa@archlinux.org>
|
|
# Thomas Baechler <thomas@archlinux.org>
|
|
|
|
# Contributor: Tk-Glitch <ti3nou at gmail dot com>
|
|
|
|
plain ' .---.` `.---.'
|
|
plain ' `/syhhhyso- -osyhhhys/`'
|
|
plain ' .syNMdhNNhss/``.---.``/sshNNhdMNys.'
|
|
plain ' +sdMh.`+MNsssssssssssssssNM+`.hMds+'
|
|
plain ' :syNNdhNNhssssssssssssssshNNhdNNys:'
|
|
plain ' /ssyhhhysssssssssssssssssyhhhyss/'
|
|
plain ' .ossssssssssssssssssssssssssssso.'
|
|
plain ' :sssssssssssssssssssssssssssssssss:'
|
|
plain ' /sssssssssssssssssssssssssssssssssss/'
|
|
plain ' :sssssssssssssoosssssssoosssssssssssss:'
|
|
plain ' osssssssssssssoosssssssoossssssssssssso'
|
|
plain ' osssssssssssyyyyhhhhhhhyyyyssssssssssso'
|
|
plain ' /yyyyyyhhdmmmmNNNNNNNNNNNmmmmdhhyyyyyy/'
|
|
plain ' smmmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNmmms'
|
|
plain ' /dNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNd/'
|
|
plain ' `:sdNNNNNNNNNNNNNNNNNNNNNNNNNds:`'
|
|
plain ' `-+shdNNNNNNNNNNNNNNNdhs+-`'
|
|
plain ' `.-:///////:-.`'
|
|
|
|
_where="$PWD" # track basedir as different Arch based distros are moving srcdir around
|
|
|
|
cp "$_where"/linux54-tkg-patches/* "$_where" # copy patches inside the PKGBUILD's dir to preserve makepkg sourcing and md5sum checking
|
|
cp "$_where"/linux54-tkg-config/* "$_where" # copy config files and hooks inside the PKGBUILD's dir to preserve makepkg sourcing and md5sum checking
|
|
|
|
source "$_where"/customization.cfg # load default configuration from file
|
|
|
|
# Load external configuration file if present. Available variable values will overwrite customization.cfg ones.
|
|
if [ -e "$_EXT_CONFIG_PATH" ]; then
|
|
source "$_EXT_CONFIG_PATH" && msg2 "External configuration file $_EXT_CONFIG_PATH will be used to override customization.cfg values." && msg2 ""
|
|
fi
|
|
|
|
if [ -z "$_OPTIPROFILE" ] && [ ! -e "$_where"/cpuschedset ]; 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;
|
|
fi
|
|
if [ "$_OPTIPROFILE" == "2" ]; then
|
|
source "$_where"/ryzen-desktop-profile.cfg && msg2 "Ryzen Desktop (Performance) profile will be used." && msg2 ""
|
|
elif [ "$_OPTIPROFILE" == "3" ]; then
|
|
source "$_where"/generic-desktop-profile.cfg && msg2 "Generic Desktop (Performance) profile will be used." && msg2 ""
|
|
fi
|
|
|
|
# source cpuschedset early if present
|
|
if [ -e "$_where"/cpuschedset ]; then
|
|
source "$_where"/cpuschedset
|
|
fi
|
|
|
|
# CPU SCHED selector
|
|
if [ -z "$_cpusched" ] && [ ! -e "$_where"/cpuschedset ]; then
|
|
plain "What CPU sched variant do you want to build/install?"
|
|
read -rp "`echo $' > 1.PDS\n 2.MuQSS\n 3.BMQ\n 4.CFS\nchoice[1-4?]: '`" CONDITION;
|
|
if [ "$CONDITION" == "2" ]; then
|
|
echo "_cpusched=\"MuQSS\"" > "$_where"/cpuschedset
|
|
elif [ "$CONDITION" == "3" ]; then
|
|
echo "_cpusched=\"bmq\"" > "$_where"/cpuschedset
|
|
elif [ "$CONDITION" == "4" ]; then
|
|
echo "_cpusched=\"cfs\"" > "$_where"/cpuschedset
|
|
else
|
|
echo "_cpusched=\"pds\"" > "$_where"/cpuschedset
|
|
fi
|
|
if [ -n "$_custom_pkgbase" ]; then
|
|
echo "_custom_pkgbase=\"${_custom_pkgbase}\"" >> "$_where"/cpuschedset
|
|
fi
|
|
elif [ "$_cpusched" == "muqss" ] || [ "$_cpusched" == "MuQSS" ]; then
|
|
echo "_cpusched=\"MuQSS\"" > "$_where"/cpuschedset
|
|
elif [ "$_cpusched" == "pds" ]; then
|
|
echo "_cpusched=\"pds\"" > "$_where"/cpuschedset
|
|
elif [ "$_cpusched" == "bmq" ]; then
|
|
echo "_cpusched=\"bmq\"" > "$_where"/cpuschedset
|
|
else
|
|
echo "_cpusched=\"cfs\"" > "$_where"/cpuschedset
|
|
fi
|
|
|
|
source "$_where"/cpuschedset
|
|
|
|
_basever=54
|
|
if [ -n "$_custom_pkgbase" ]; then
|
|
pkgbase="${_custom_pkgbase}"
|
|
else
|
|
pkgbase=linux"${_basever}"-tkg-"${_cpusched}"
|
|
fi
|
|
pkgname=("${pkgbase}" "${pkgbase}-headers")
|
|
_basekernel=5.4
|
|
_sub=48
|
|
pkgver="${_basekernel}"."${_sub}"
|
|
pkgrel=64
|
|
pkgdesc='Linux-tkg'
|
|
arch=('x86_64') # no i686 in here
|
|
url="http://www.kernel.org/"
|
|
license=('GPL2')
|
|
makedepends=('xmlto' 'docbook-xsl' 'kmod' 'inetutils' 'bc' 'libelf' 'patchutils' 'flex' 'python-sphinx' 'python-sphinx_rtd_theme' 'graphviz' 'imagemagick' 'git')
|
|
optdepends=('schedtool')
|
|
options=('!strip')
|
|
source=("https://www.kernel.org/pub/linux/kernel/v5.x/linux-${_basekernel}.tar.xz"
|
|
"https://www.kernel.org/pub/linux/kernel/v5.x/patch-${pkgver}.xz"
|
|
'config.x86_64' # stock Arch config
|
|
'config_hardened.x86_64' # hardened Arch config
|
|
90-cleanup.hook
|
|
cleanup
|
|
# ARCH Patches
|
|
0001-add-sysctl-to-disallow-unprivileged-CLONE_NEWUSER-by.patch
|
|
# TkG
|
|
0002-clear-patches.patch
|
|
0003-glitched-base.patch
|
|
0003-glitched-cfs.patch
|
|
0004-glitched-ondemand-muqss.patch
|
|
0004-glitched-muqss.patch
|
|
0004-5.4-ck1.patch
|
|
0005-glitched-ondemand-pds.patch
|
|
0005-glitched-pds.patch
|
|
0005-v5.4_undead-pds099o.patch
|
|
0006-add-acs-overrides_iommu.patch
|
|
0007-v5.4-fsync.patch
|
|
#0008-5.4-bcachefs.patch
|
|
0009-glitched-bmq.patch
|
|
0009-bmq_v5.4-r2.patch
|
|
0011-ZFS-fix.patch
|
|
0012-linux-hardened.patch
|
|
)
|
|
sha256sums=('bf338980b1670bca287f9994b7441c2361907635879169c64ae78364efc5f491'
|
|
'd9765b6202925693377e7ec71c2f514f563c9abf708722da76cb5939f0566c82'
|
|
'b7f23bbc09b6c571b76f851f0389386a6f3a64f3d7b1b8509c8550228b0f4537'
|
|
'1f4a20d6eaaa0d969af93152a65191492400c6aa838fc1c290b0dd29bb6019d8'
|
|
'1e15fc2ef3fa770217ecc63a220e5df2ddbcf3295eb4a021171e7edd4c6cc898'
|
|
'66a03c246037451a77b4d448565b1d7e9368270c7d02872fbd0b5d024ed0a997'
|
|
'31dc68e84aecfb7d069efb1305049122c65694676be8b955634abcf0675922a2'
|
|
'd02bf5ca08fd610394b9d3a0c3b176d74af206f897dee826e5cbaec97bb4a4aa'
|
|
'55db7c30c6d5e7d88cf38a4c757e447faf11a7440afbc081c3da12757073cca7'
|
|
'7058e57fd68367b029adc77f2a82928f1433daaf02c8c279cb2d13556c8804d7'
|
|
'c605f638d74c61861ebdc36ebd4cb8b6475eae2f6273e1ccb2bbb3e10a2ec3fe'
|
|
'bc69d6e5ee8172b0242c8fa72d13cfe2b8d2b6601468836908a7dfe8b78a3bbb'
|
|
'e7638aabd2041dd8a03096462f9d5d4aa58680ee0f690703ccb1912047dac4f4'
|
|
'62496f9ca788996181ef145f96ad26291282fcc3fb95cdc04080dcf84365be33'
|
|
'eac7e5d6201528e64f4bdf5e286c842511e1afc52e1518dc8e7d11932bbe0a99'
|
|
'db03fbd179ec78941eefe1c0edde4c19071bc603511d0b5c06c04e412994b62e'
|
|
'19661ec0d39f9663452b34433214c755179894528bf73a42f6ba52ccf572832a'
|
|
'2d9260b80b43bbd605cf420d6bd53aa7262103dfd77196ba590ece5600b6dc0d'
|
|
'3832f828a9f402b153fc9a6829c5a4eaf6091804bcda3a0423c8e1b57e26420d'
|
|
'6a6a736cf1b3513d108bfd36f60baf50bb36b33aec21ab0d0ffad13602b7ff75'
|
|
'49262ce4a8089fa70275aad742fc914baa28d9c384f710c9a62f64796d13e104'
|
|
'aeb31404c26ee898d007b1f66cb9572c9884ad8eca14edc4587d68f6cba6de46')
|
|
|
|
export KBUILD_BUILD_HOST=archlinux
|
|
export KBUILD_BUILD_USER=$pkgbase
|
|
export KBUILD_BUILD_TIMESTAMP="$(date -Ru${SOURCE_DATE_EPOCH:+d @$SOURCE_DATE_EPOCH})"
|
|
|
|
user_patcher() {
|
|
# To patch the user because all your base are belong to us
|
|
local _patches=("$_where"/*."${_userpatch_ext}revert")
|
|
if [ ${#_patches[@]} -ge 2 ] || [ -e "${_patches}" ]; then
|
|
if [ "$_user_patches_no_confirm" != "true" ]; then
|
|
msg2 "Found ${#_patches[@]} 'to revert' userpatches for ${_userpatch_target}:"
|
|
printf '%s\n' "${_patches[@]}"
|
|
read -rp "Do you want to install it/them? - Be careful with that ;)"$'\n> N/y : ' _CONDITION;
|
|
fi
|
|
if [ "$_CONDITION" == "y" ] || [ "$_user_patches_no_confirm" == "true" ]; then
|
|
for _f in "${_patches[@]}"; do
|
|
if [ -e "${_f}" ]; then
|
|
msg2 "######################################################"
|
|
msg2 ""
|
|
msg2 "Reverting your own ${_userpatch_target} patch ${_f}"
|
|
msg2 ""
|
|
msg2 "######################################################"
|
|
patch -Np1 -R < "${_f}"
|
|
echo "Reverted your own patch ${_f}" >> "$_where"/last_build_config.log
|
|
fi
|
|
done
|
|
fi
|
|
fi
|
|
|
|
_patches=("$_where"/*."${_userpatch_ext}patch")
|
|
if [ ${#_patches[@]} -ge 2 ] || [ -e "${_patches}" ]; then
|
|
if [ "$_user_patches_no_confirm" != "true" ]; then
|
|
msg2 "Found ${#_patches[@]} userpatches for ${_userpatch_target}:"
|
|
printf '%s\n' "${_patches[@]}"
|
|
read -rp "Do you want to install it/them? - Be careful with that ;)"$'\n> N/y : ' _CONDITION;
|
|
fi
|
|
if [ "$_CONDITION" == "y" ] || [ "$_user_patches_no_confirm" == "true" ]; then
|
|
for _f in "${_patches[@]}"; do
|
|
if [ -e "${_f}" ]; then
|
|
msg2 "######################################################"
|
|
msg2 ""
|
|
msg2 "Applying your own ${_userpatch_target} patch ${_f}"
|
|
msg2 ""
|
|
msg2 "######################################################"
|
|
patch -Np1 < "${_f}"
|
|
echo "Applied your own patch ${_f}" >> "$_where"/last_build_config.log
|
|
fi
|
|
done
|
|
fi
|
|
fi
|
|
}
|
|
|
|
prepare() {
|
|
rm -rf $pkgdir # Nuke the entire pkg folder so it'll get regenerated clean on next build
|
|
|
|
ln -s "${_where}/customization.cfg" "${srcdir}" # workaround
|
|
|
|
cd "${srcdir}/linux-${_basekernel}"
|
|
|
|
msg2 "Setting version..."
|
|
scripts/setlocalversion --save-scmversion
|
|
echo "-$pkgrel-tkg-${_cpusched}" > localversion.10-pkgrel
|
|
echo "" > localversion.20-pkgname
|
|
|
|
# add upstream patch
|
|
patch -p1 -i ../patch-"${pkgver}"
|
|
|
|
# ARCH Patches
|
|
if [ "${_configfile}" == "config_hardened.x86_64" ] && [ "${_cpusched}" == "cfs" ]; then
|
|
msg2 "Using linux hardened patchset"
|
|
patch -Np1 -i ../0012-linux-hardened.patch
|
|
else
|
|
patch -Np1 -i ../0001-add-sysctl-to-disallow-unprivileged-CLONE_NEWUSER-by.patch
|
|
fi
|
|
|
|
# TkG
|
|
patch -Np1 -i ../0002-clear-patches.patch
|
|
|
|
patch -Np1 -i ../0003-glitched-base.patch
|
|
|
|
if [ "${_cpusched}" == "MuQSS" ]; then
|
|
# MuQSS
|
|
patch -Np1 -i ../0004-5.4-ck1.patch
|
|
if [ "${_aggressive_ondemand}" == "true" ]; then
|
|
patch -Np1 -i ../0004-glitched-ondemand-muqss.patch
|
|
fi
|
|
patch -Np1 -i ../0004-glitched-muqss.patch
|
|
elif [ "${_cpusched}" == "pds" ]; then
|
|
# PDS-mq
|
|
patch -Np1 -i ../0005-v5.4_undead-pds099o.patch
|
|
if [ "${_aggressive_ondemand}" == "true" ]; then
|
|
patch -Np1 -i ../0005-glitched-ondemand-pds.patch
|
|
fi
|
|
patch -Np1 -i ../0005-glitched-pds.patch
|
|
elif [ "${_cpusched}" == "bmq" ]; then
|
|
# BMQ
|
|
patch -Np1 -i ../0009-bmq_v5.4-r2.patch
|
|
patch -Np1 -i ../0009-glitched-bmq.patch
|
|
else
|
|
patch -Np1 -i ../0003-glitched-cfs.patch
|
|
fi
|
|
|
|
if [ -z "${_configfile}" ]; then
|
|
_configfile="config.x86_64"
|
|
fi
|
|
|
|
cat "${srcdir}/${_configfile}" > ./.config
|
|
|
|
# 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
|
|
echo "CONFIG_NR_TTY_DEVICES=63" >> ./.config
|
|
echo "CONFIG_TP_SMAPI=m" >> ./.config
|
|
echo "CONFIG_RAID6_USE_PREFER_GEN=y" >> ./.config
|
|
echo "# CONFIG_NTP_PPS 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_RCU_BOOST_DELAY=500/CONFIG_RCU_BOOST_DELAY=0/' ./.config
|
|
if [ "$_noccache" != "true" ] && pacman -Qq ccache &> /dev/null; then
|
|
sed -i -e 's/CONFIG_GCC_PLUGINS=y/# CONFIG_GCC_PLUGINS is not set/' ./.config
|
|
fi
|
|
|
|
# Inject cpuopts options
|
|
echo "# CONFIG_MK8SSE3 is not set" >> ./.config
|
|
echo "# CONFIG_MK10 is not set" >> ./.config
|
|
echo "# CONFIG_MBARCELONA is not set" >> ./.config
|
|
echo "# CONFIG_MBOBCAT is not set" >> ./.config
|
|
echo "# CONFIG_MJAGUAR is not set" >> ./.config
|
|
echo "# CONFIG_MBULLDOZER is not set" >> ./.config
|
|
echo "# CONFIG_MPILEDRIVER is not set" >> ./.config
|
|
echo "# CONFIG_MSTEAMROLLER is not set" >> ./.config
|
|
echo "# CONFIG_MEXCAVATOR is not set" >> ./.config
|
|
echo "# CONFIG_MZEN is not set" >> ./.config
|
|
echo "# CONFIG_MZEN2 is not set" >> ./.config
|
|
echo "# CONFIG_MATOM is not set" >> ./.config
|
|
echo "# CONFIG_MNEHALEM is not set" >> ./.config
|
|
echo "# CONFIG_MWESTMERE is not set" >> ./.config
|
|
echo "# CONFIG_MSILVERMONT is not set" >> ./.config
|
|
echo "# CONFIG_MSANDYBRIDGE is not set" >> ./.config
|
|
echo "# CONFIG_MIVYBRIDGE is not set" >> ./.config
|
|
echo "# CONFIG_MHASWELL is not set" >> ./.config
|
|
echo "# CONFIG_MBROADWELL is not set" >> ./.config
|
|
echo "# CONFIG_MSKYLAKE is not set" >> ./.config
|
|
echo "# CONFIG_MSKYLAKEX is not set" >> ./.config
|
|
echo "# CONFIG_MCANNONLAKE is not set" >> ./.config
|
|
echo "# CONFIG_MICELAKE is not set" >> ./.config
|
|
|
|
# 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
|
|
fi
|
|
|
|
if [ "${_cpusched}" == "MuQSS" ]; then
|
|
# MuQSS default config
|
|
echo "CONFIG_SCHED_MUQSS=y" >> ./.config
|
|
elif [ "${_cpusched}" == "pds" ]; then
|
|
# PDS default config
|
|
echo "CONFIG_SCHED_PDS=y" >> ./.config
|
|
elif [ "${_cpusched}" == "bmq" ]; then
|
|
# BMQ default config
|
|
echo "CONFIG_SCHED_BMQ=y" >> ./.config
|
|
fi
|
|
|
|
if [ "${_cpusched}" == "MuQSS" ] || [ "${_cpusched}" == "pds" ] || [ "${_cpusched}" == "bmq" ]; 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
|
|
sed -i -e 's/CONFIG_CGROUP_CPUACCT=y/# CONFIG_CGROUP_CPUACCT is not set/' ./.config
|
|
sed -i -e 's/CONFIG_SCHED_AUTOGROUP=y/# CONFIG_SCHED_AUTOGROUP is not set/' ./.config
|
|
# sched yield type
|
|
if [ -n "$_sched_yield_type" ]; then
|
|
CONDITION0="$_sched_yield_type"
|
|
else
|
|
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."
|
|
read -rp "`echo $'\n > 0. Recommended option for gaming on PDS and MuQSS - "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;
|
|
fi
|
|
if [ "$CONDITION0" == "1" ]; then
|
|
msg2 "Using default CPU sched yield type (1)"
|
|
elif [ "$CONDITION0" == "2" ]; then
|
|
sed -i -e 's/int sched_yield_type __read_mostly = 1;/int sched_yield_type __read_mostly = 2;/' ./kernel/sched/"${_cpusched}".c
|
|
else
|
|
sed -i -e 's/int sched_yield_type __read_mostly = 1;/int sched_yield_type __read_mostly = 0;/' ./kernel/sched/"${_cpusched}".c
|
|
fi
|
|
fi
|
|
|
|
# Round Robin interval
|
|
if [ "${_cpusched}" == "MuQSS" ] || [ "${_cpusched}" == "pds" ] || [ "${_cpusched}" == "bmq" ]; then
|
|
if [ -n "$_rr_interval" ]; then
|
|
CONDITION1="$_rr_interval"
|
|
else
|
|
plain ""
|
|
plain "Round Robin interval is the longest duration two tasks with the same nice level will"
|
|
plain "be delayed for. When CPU time is requested by a task, it receives a time slice equal"
|
|
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 (worth a shot with MuQSS + yield_type 2)\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"
|
|
fi
|
|
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
|
|
fi
|
|
fi
|
|
|
|
# zenify
|
|
if [ "$_zenify" == "true" ]; then
|
|
echo "CONFIG_ZENIFY=y" >> ./.config
|
|
elif [ "$_zenify" == "false" ]; then
|
|
echo "# CONFIG_ZENIFY is not set" >> ./.config
|
|
fi
|
|
|
|
# compiler optimization level
|
|
if [ "$_compileroptlevel" == "1" ]; then
|
|
echo "# CONFIG_CC_OPTIMIZE_HARDER is not set" >> ./.config
|
|
elif [ "$_compileroptlevel" == "2" ]; then
|
|
sed -i -e 's/CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y/# CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE is not set/' ./.config
|
|
echo "CONFIG_CC_OPTIMIZE_HARDER=y" >> ./.config
|
|
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
|
|
echo "# CONFIG_CC_OPTIMIZE_HARDER is not set" >> ./.config
|
|
fi
|
|
|
|
# cpu opt
|
|
if [ -n "$_processor_opt" ] && [ "$_processor_opt" != "native" ]; then
|
|
echo "# CONFIG_MNATIVE 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
|
|
fi
|
|
|
|
if [ "$_processor_opt" == "native" ]; then
|
|
echo "CONFIG_MNATIVE=y" >> ./.config
|
|
elif [ "$_processor_opt" == "k8" ]; then
|
|
sed -i -e 's/# CONFIG_MK8 is not set/CONFIG_MK8=y/' ./.config
|
|
elif [ "$_processor_opt" == "k8sse3" ]; then
|
|
sed -i -e 's/# CONFIG_MK8SSE3 is not set/CONFIG_MK8SSE3=y/' ./.config
|
|
elif [ "$_processor_opt" == "k10" ]; then
|
|
sed -i -e 's/# CONFIG_MK10 is not set/CONFIG_MK10=y/' ./.config
|
|
elif [ "$_processor_opt" == "barcelona" ]; then
|
|
sed -i -e 's/# CONFIG_MBARCELONA is not set/CONFIG_MBARCELONA=y/' ./.config
|
|
elif [ "$_processor_opt" == "bobcat" ]; then
|
|
sed -i -e 's/# CONFIG_MBOBCAT is not set/CONFIG_MBOBCAT=y/' ./.config
|
|
elif [ "$_processor_opt" == "jaguar" ]; then
|
|
sed -i -e 's/# CONFIG_MJAGUAR is not set/CONFIG_MJAGUAR=y/' ./.config
|
|
elif [ "$_processor_opt" == "bulldozer" ]; then
|
|
sed -i -e 's/# CONFIG_MBULLDOZER is not set/CONFIG_MBULLDOZER=y/' ./.config
|
|
elif [ "$_processor_opt" == "piledriver" ]; then
|
|
sed -i -e 's/# CONFIG_MPILEDRIVER is not set/CONFIG_MPILEDRIVER=y/' ./.config
|
|
elif [ "$_processor_opt" == "steamroller" ]; then
|
|
sed -i -e 's/# CONFIG_MSTEAMROLLER is not set/CONFIG_MSTEAMROLLER=y/' ./.config
|
|
elif [ "$_processor_opt" == "excavator" ]; then
|
|
sed -i -e 's/# CONFIG_MEXCAVATOR is not set/CONFIG_MEXCAVATOR=y/' ./.config
|
|
elif [ "$_processor_opt" == "zen" ]; then
|
|
sed -i -e 's/# CONFIG_MZEN is not set/CONFIG_MZEN=y/' ./.config
|
|
elif [ "$_processor_opt" == "zen2" ]; then
|
|
sed -i -e 's/# CONFIG_MZEN2 is not set/CONFIG_MZEN2=y/' ./.config
|
|
elif [ "$_processor_opt" == "mpsc" ]; then
|
|
sed -i -e 's/# CONFIG_MPSC is not set/CONFIG_MPSC=y/' ./.config
|
|
elif [ "$_processor_opt" == "atom" ]; then
|
|
sed -i -e 's/# CONFIG_MATOM is not set/CONFIG_MATOM=y/' ./.config
|
|
elif [ "$_processor_opt" == "core2" ]; then
|
|
sed -i -e 's/# CONFIG_MCORE2 is not set/CONFIG_MCORE2=y/' ./.config
|
|
elif [ "$_processor_opt" == "nehalem" ]; then
|
|
sed -i -e 's/# CONFIG_MNEHALEM is not set/CONFIG_MNEHALEM=y/' ./.config
|
|
elif [ "$_processor_opt" == "westmere" ]; then
|
|
sed -i -e 's/# CONFIG_MWESTMERE is not set/CONFIG_MWESTMERE=y/' ./.config
|
|
elif [ "$_processor_opt" == "silvermont" ]; then
|
|
sed -i -e 's/# CONFIG_MSILVERMONT is not set/CONFIG_MSILVERMONT=y/' ./.config
|
|
elif [ "$_processor_opt" == "sandybridge" ]; then
|
|
sed -i -e 's/# CONFIG_MSANDYBRIDGE is not set/CONFIG_MSANDYBRIDGE=y/' ./.config
|
|
elif [ "$_processor_opt" == "ivybridge" ]; then
|
|
sed -i -e 's/# CONFIG_MIVYBRIDGE is not set/CONFIG_MIVYBRIDGE=y/' ./.config
|
|
elif [ "$_processor_opt" == "haswell" ]; then
|
|
sed -i -e 's/# CONFIG_MHASWELL is not set/CONFIG_MHASWELL=y/' ./.config
|
|
elif [ "$_processor_opt" == "broadwell" ]; then
|
|
sed -i -e 's/# CONFIG_MBROADWELL is not set/CONFIG_MBROADWELL=y/' ./.config
|
|
elif [ "$_processor_opt" == "skylake" ]; then
|
|
sed -i -e 's/# CONFIG_MSKYLAKE is not set/CONFIG_MSKYLAKE=y/' ./.config
|
|
elif [ "$_processor_opt" == "skylakex" ]; then
|
|
sed -i -e 's/# CONFIG_MSKYLAKEX is not set/CONFIG_MSKYLAKEX=y/' ./.config
|
|
elif [ "$_processor_opt" == "cannonlake" ]; then
|
|
sed -i -e 's/# CONFIG_MCANNONLAKE is not set/CONFIG_MCANNONLAKE=y/' ./.config
|
|
elif [ "$_processor_opt" == "icelake" ]; then
|
|
sed -i -e 's/# CONFIG_MICELAKE is not set/CONFIG_MICELAKE=y/' ./.config
|
|
fi
|
|
|
|
# irq threading
|
|
if [ "$_irq_threading" == "true" ]; then
|
|
echo "CONFIG_FORCE_IRQ_THREADING=y" >> ./.config
|
|
elif [ "$_irq_threading" == "false" ]; then
|
|
echo "# CONFIG_FORCE_IRQ_THREADING is not set" >> ./.config
|
|
fi
|
|
|
|
# smt nice
|
|
if [ "$_smt_nice" == "true" ]; then
|
|
echo "CONFIG_SMT_NICE=y" >> ./.config
|
|
elif [ "$_smt_nice" == "false" ]; then
|
|
echo "# CONFIG_SMT_NICE is not set" >> ./.config
|
|
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
|
|
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 [ "$_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
|
|
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" == "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
|
|
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
|
|
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
|
|
fi
|
|
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
|
|
fi
|
|
|
|
# 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
|
|
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
|
|
fi
|
|
|
|
# ACPI_CPUFREQ disablement
|
|
if [ "$_disable_acpi_cpufreq" == "true" ]; then
|
|
sed -i -e 's/CONFIG_X86_ACPI_CPUFREQ=m/# CONFIG_X86_ACPI_CPUFREQ is not set/' ./.config
|
|
fi
|
|
|
|
# ftrace
|
|
if [ -z "$_ftracedisable" ]; then
|
|
plain ""
|
|
plain "Disable FUNCTION_TRACER/GRAPH_TRACER? Lowers overhead but limits debugging"
|
|
plain "and analyzing of kernel functions."
|
|
read -rp "`echo $' > N/y : '`" CONDITION2;
|
|
fi
|
|
if [ "$CONDITION2" == "y" ] || [ "$_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
|
|
fi
|
|
|
|
# disable numa
|
|
if [ -z "$_numadisable" ]; then
|
|
plain ""
|
|
plain "Disable NUMA? Lowers overhead, but breaks CUDA/NvEnc on Nvidia if disabled."
|
|
plain "https://bbs.archlinux.org/viewtopic.php?id=239174"
|
|
read -rp "`echo $' > N/y : '`" CONDITION3;
|
|
fi
|
|
if [ "$CONDITION3" == "y" ] || [ "$_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
|
|
fi
|
|
|
|
# tickless
|
|
if [ -z "$_tickless" ]; then
|
|
plain ""
|
|
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 on some platforms (mostly AMD based)."
|
|
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;
|
|
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" == "2" ]; then
|
|
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
|
|
else
|
|
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
|
|
fi
|
|
|
|
# voluntary preempt
|
|
if [ -z "$_voluntary_preempt" ]; then
|
|
plain ""
|
|
plain "Use explicit preemption points?"
|
|
plain "It can improve latency on PDS (at the cost of throughput)"
|
|
plain "and improve throughput on other schedulers (at the cost of latency)"
|
|
read -rp "`echo $' > N/y : '`" CONDITION5;
|
|
fi
|
|
if [ "$CONDITION5" == "y" ] || [ "$_voluntary_preempt" == "true" ]; then
|
|
sed -i -e 's/CONFIG_PREEMPT=y/# CONFIG_PREEMPT is not set/' ./.config
|
|
sed -i -e 's/CONFIG_PREEMPT_LL=y/# CONFIG_PREEMPT_LL is not set/' ./.config
|
|
sed -i -e 's/# CONFIG_PREEMPT_VOLUNTARY is not set/CONFIG_PREEMPT_VOLUNTARY=y/' ./.config
|
|
fi
|
|
|
|
# Open Firmware support
|
|
if [ -z "$_OFenable" ]; then
|
|
plain ""
|
|
plain "Enable Device Tree and Open Firmware support?"
|
|
read -rp "`echo $' > N/y : '`" CONDITION6;
|
|
fi
|
|
if [ "$CONDITION6" == "y" ] || [ "$_OFenable" == "true" ]; then
|
|
sed -i -e 's/# CONFIG_OF is not set/CONFIG_OF=y/' ./.config
|
|
fi
|
|
|
|
# acs override
|
|
if [ -z "$_acs_override" ]; then
|
|
plain ""
|
|
plain "Use ACS override patch?"
|
|
plain "https://wiki.archlinux.org/index.php/PCI_passthrough_via_OVMF#Bypassing_the_IOMMU_groups_.28ACS_override_patch.29"
|
|
read -rp "`echo $' > N/y : '`" CONDITION7;
|
|
fi
|
|
if [ "$CONDITION7" == "y" ] || [ "$_acs_override" == "true" ]; then
|
|
patch -Np1 -i ../0006-add-acs-overrides_iommu.patch
|
|
fi
|
|
|
|
# bcachefs
|
|
# if [ -z "$_bcachefs" ]; then
|
|
# plain ""
|
|
# plain "Add Bcache filesystem support? You'll have to install bcachefs-tools-git from AUR for utilities."
|
|
# plain "https://bcachefs.org/"
|
|
# read -rp "`echo $' > N/y : '`" CONDITION8;
|
|
# fi
|
|
# if [ "$CONDITION8" == "y" ] || [ "$_bcachefs" == "true" ]; then
|
|
# patch -Np1 -i ../0008-5.4-bcachefs.patch
|
|
# 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
|
|
# fi
|
|
|
|
# fsync support
|
|
if [ -z "$_fsync" ]; then
|
|
plain ""
|
|
plain "Enable support for fsync, an experimental replacement for esync in Valve Proton 4.11+"
|
|
plain "https://steamcommunity.com/games/221410/announcements/detail/2957094910196249305"
|
|
read -rp "`echo $' > N/y : '`" CONDITION9;
|
|
fi
|
|
if [ "$CONDITION9" == "y" ] || [ "$_fsync" == "true" ]; then
|
|
patch -Np1 -i ../0007-v5.4-fsync.patch
|
|
fi
|
|
|
|
# ZFS fix
|
|
if [ -z "$_zfsfix" ]; then
|
|
plain ""
|
|
plain "Add back missing symbol for AES-NI/AVX support on ZFS"
|
|
plain "https://github.com/NixOS/nixpkgs/blob/master/pkgs/os-specific/linux/kernel/export_kernel_fpu_functions_5_3.patch"
|
|
read -rp "`echo $' > N/y : '`" CONDITION11;
|
|
fi
|
|
if [ "$CONDITION11" == "y" ] || [ "$_zfsfix" == "true" ]; then
|
|
patch -Np1 -i ../0011-ZFS-fix.patch
|
|
fi
|
|
|
|
# Community patches
|
|
if [ -n "$_community_patches" ]; then
|
|
if [ ! -d "$_where/../../community-patches" ]; then
|
|
cd "$_where/../.." && git clone https://github.com/Frogging-Family/community-patches.git && cd "${srcdir}/linux-${_basekernel}"
|
|
fi
|
|
_community_patches=($_community_patches)
|
|
for _p in ${_community_patches[@]}; do
|
|
ln -s "$_where"/../../community-patches/linux54-tkg/$_p "$_where"/
|
|
done
|
|
fi
|
|
|
|
# userpatches
|
|
if [ "$_user_patches" == "true" ]; then
|
|
_userpatch_target="linux-${_basekernel}"
|
|
_userpatch_ext="my"
|
|
user_patcher
|
|
fi
|
|
|
|
# Community patches removal
|
|
for _p in ${_community_patches[@]}; do
|
|
rm -f "$_where"/$_p
|
|
done
|
|
|
|
# don't run depmod on 'make install'. We'll do this ourselves in packaging
|
|
sed -i '2iexit 0' scripts/depmod.sh
|
|
|
|
# get kernel version
|
|
make prepare
|
|
|
|
# modprobed-db
|
|
if [ -z "$_modprobeddb" ]; then
|
|
plain ""
|
|
plain "Use modprobed db to clean config from unneeded modules?"
|
|
plain "Speeds up compilation considerably. Requires root."
|
|
plain "https://wiki.archlinux.org/index.php/Modprobed-db"
|
|
plain "!!!! Make sure to have a well populated db !!!!"
|
|
read -rp "`echo $' > N/y : '`" CONDITIONMPDB;
|
|
fi
|
|
if [ "$CONDITIONMPDB" == "y" ] || [ "$_modprobeddb" == "true" ]; then
|
|
sudo modprobed-db recall
|
|
make localmodconfig
|
|
fi
|
|
|
|
if [ true = "$_config_fragments" ]; then
|
|
local fragments=()
|
|
mapfile -d '' -t fragments < <(find "$_where"/ -type f -name "*.myfrag" -print0)
|
|
|
|
if [ true = "$_config_fragments_no_confirm" ]; then
|
|
printf 'Using config fragment %s\n' "${fragments[@]#$_where/}"
|
|
else
|
|
for i in "${!fragments[@]}"; do
|
|
while true; do
|
|
read -r -p 'Found config fragment '"${fragments[$i]#$_where/}"', apply it? [y/N] ' CONDITIONMPDB
|
|
CONDITIONMPDB="$(printf '%s' "$CONDITIONMPDB" | tr '[:upper:]' '[:lower:]')"
|
|
case "$CONDITIONMPDB" in
|
|
y|yes)
|
|
break;;
|
|
n|no|'')
|
|
unset fragments[$i]
|
|
break;;
|
|
*)
|
|
echo 'Please answer with yes or no'
|
|
esac
|
|
done
|
|
done
|
|
fi
|
|
|
|
if [ 0 -lt "${#fragments[@]}" ]; then
|
|
scripts/kconfig/merge_config.sh -m .config "${fragments[@]}"
|
|
fi
|
|
fi
|
|
|
|
# menuconfig / nconfig
|
|
if [ -z "$_menunconfig" ]; then
|
|
plain ""
|
|
plain "*Optional* For advanced users - Do you want to use make menuconfig or nconfig"
|
|
plain "to configure the kernel before building it?"
|
|
plain "If you do, make sure your terminal is currently"
|
|
plain "at least 19 lines by 80 columns large or you'll get an error :D"
|
|
read -rp "`echo $' > 0. nope\n 1. menuconfig\n 2. nconfig\n choice[0-2?]: '`" CONDITIONMNC;
|
|
_menunconfig="$CONDITIONMNC"
|
|
fi
|
|
if [ 1 = "$_menunconfig" ]; then
|
|
cp .config .config.orig
|
|
make menuconfig
|
|
elif [ 2 = "$_menunconfig" ]; then
|
|
cp .config .config.orig
|
|
make nconfig
|
|
else
|
|
# rewrite configuration
|
|
yes "" | make config >/dev/null
|
|
fi
|
|
if [ 1 = "$_menunconfig" ] || [ 2 = "$_menunconfig" ]; then
|
|
if [ -z "${_diffconfig}" ]; then
|
|
while true; do
|
|
read -r -p 'Generate a config fragment from your changes? [y/N] ' CONDITIONF
|
|
CONDITIONF="$(printf '%s' "$CONDITIONF" | tr '[:upper:]' '[:lower:]')"
|
|
case "$CONDITIONF" in
|
|
y|yes)
|
|
_diffconfig=true
|
|
break;;
|
|
n|no|'')
|
|
_diffconfig=false
|
|
break;;
|
|
*)
|
|
echo 'Please answer with yes or no'
|
|
esac
|
|
done
|
|
fi
|
|
if [ true = "$_diffconfig" ]; then
|
|
if [ -z "$_diffconfig_name" ]; then
|
|
IFS= read -r -p 'Filename for the config fragment [leave empty to not generate fragment]: ' _diffconfig_name
|
|
fi
|
|
if [ -z "$_diffconfig_name" ]; then
|
|
echo 'No file name given, not generating config fragment.'
|
|
else (
|
|
prev_pwd="${PWD:-$(pwd)}"
|
|
cd "$_where"
|
|
"${prev_pwd}/scripts/diffconfig" -m "${prev_pwd}/.config.orig" "${prev_pwd}/.config" > "$_diffconfig_name"
|
|
) fi
|
|
fi
|
|
rm .config.orig
|
|
fi
|
|
|
|
make -s kernelrelease > version
|
|
msg2 "Prepared %s version %s" "$pkgbase" "$(<version)"
|
|
}
|
|
|
|
build() {
|
|
cd "${srcdir}/linux-${_basekernel}"
|
|
|
|
# Use custom compiler paths if defined
|
|
if [ -n "${CUSTOM_GCC_PATH}" ]; then
|
|
PATH=${CUSTOM_GCC_PATH}/bin:${CUSTOM_GCC_PATH}/lib:${CUSTOM_GCC_PATH}/include:${PATH}
|
|
fi
|
|
|
|
if [ "$_force_all_threads" == "true" ]; then
|
|
_force_all_threads=-j$(nproc)
|
|
else
|
|
_force_all_threads=${MAKEFLAGS}
|
|
fi
|
|
|
|
# ccache
|
|
if [ "$_noccache" != "true" ] && pacman -Qq ccache &> /dev/null; then
|
|
export PATH="/usr/lib/ccache/bin/:$PATH"
|
|
export CCACHE_SLOPPINESS="file_macro,locale,time_macros"
|
|
export CCACHE_NOHASHDIR="true"
|
|
msg2 'ccache was found and will be used'
|
|
fi
|
|
|
|
# build!
|
|
_runtime=$( time ( schedtool -B -n 1 -e ionice -n 1 make $_force_all_threads LOCALVERSION= bzImage modules 2>&1 ) 3>&1 1>&2 2>&3 ) || _runtime=$( time ( make $_force_all_threads LOCALVERSION= bzImage modules 2>&1 ) 3>&1 1>&2 2>&3 )
|
|
}
|
|
|
|
hackbase() {
|
|
pkgdesc="The $pkgdesc kernel and modules"
|
|
depends=('coreutils' 'kmod' 'initramfs')
|
|
optdepends=('linux-docs: Kernel hackers manual - HTML documentation that comes with the Linux kernel.'
|
|
'crda: to set the correct wireless channels of your country.'
|
|
'linux-firmware: Firmware files for Linux'
|
|
'modprobed-db: Keeps track of EVERY kernel module that has ever been probed. Useful for make localmodconfig.'
|
|
'nvidia-tkg: NVIDIA drivers for all installed kernels - non-dkms version.'
|
|
'nvidia-dkms-tkg: NVIDIA drivers for all installed kernels - dkms version.'
|
|
'update-grub: Simple wrapper around grub-mkconfig.')
|
|
provides=("linux=${pkgver}" "${pkgbase}")
|
|
|
|
cd "${srcdir}/linux-${_basekernel}"
|
|
|
|
# get kernel version
|
|
local _kernver="$(<version)"
|
|
local modulesdir="$pkgdir/usr/lib/modules/$_kernver"
|
|
|
|
msg2 "Installing boot image..."
|
|
# systemd expects to find the kernel here to allow hibernation
|
|
# https://github.com/systemd/systemd/commit/edda44605f06a41fb86b7ab8128dcf99161d2344
|
|
install -Dm644 "$(make -s image_name)" "$modulesdir/vmlinuz"
|
|
|
|
# Used by mkinitcpio to name the kernel
|
|
echo "$pkgbase" | install -Dm644 /dev/stdin "$modulesdir/pkgbase"
|
|
|
|
msg2 "Installing modules..."
|
|
make INSTALL_MOD_PATH="$pkgdir/usr" modules_install
|
|
|
|
# remove build and source links
|
|
rm "$modulesdir"/{source,build}
|
|
|
|
# install cleanup pacman hook and script
|
|
sed -e "s|cleanup|${pkgbase}-cleanup|g" "${srcdir}"/90-cleanup.hook |
|
|
install -Dm644 /dev/stdin "${pkgdir}/usr/share/libalpm/hooks/90-${pkgbase}.hook"
|
|
install -Dm755 "${srcdir}"/cleanup "${pkgdir}/usr/share/libalpm/scripts/${pkgbase}-cleanup"
|
|
|
|
msg2 "Fixing permissions..."
|
|
chmod -Rc u=rwX,go=rX "$pkgdir"
|
|
}
|
|
|
|
hackheaders() {
|
|
pkgdesc="Headers and scripts for building modules for the $pkgdesc kernel"
|
|
provides=("linux-headers=${pkgver}" "${pkgbase}-headers=${pkgver}")
|
|
|
|
cd "${srcdir}/linux-${_basekernel}"
|
|
local builddir="${pkgdir}/usr/lib/modules/$(<version)/build"
|
|
|
|
msg2 "Installing build files..."
|
|
install -Dt "$builddir" -m644 .config Makefile Module.symvers System.map \
|
|
localversion.* version vmlinux
|
|
install -Dt "$builddir/kernel" -m644 kernel/Makefile
|
|
install -Dt "$builddir/arch/x86" -m644 arch/x86/Makefile
|
|
cp -t "$builddir" -a scripts
|
|
|
|
# add objtool for external module building and enabled VALIDATION_STACK option
|
|
install -Dt "$builddir/tools/objtool" tools/objtool/objtool
|
|
|
|
# add xfs and shmem for aufs building
|
|
mkdir -p "$builddir"/{fs/xfs,mm}
|
|
|
|
msg2 "Installing headers..."
|
|
cp -t "$builddir" -a include
|
|
cp -t "$builddir/arch/x86" -a arch/x86/include
|
|
install -Dt "$builddir/arch/x86/kernel" -m644 arch/x86/kernel/asm-offsets.s
|
|
|
|
install -Dt "$builddir/drivers/md" -m644 drivers/md/*.h
|
|
install -Dt "$builddir/net/mac80211" -m644 net/mac80211/*.h
|
|
|
|
# http://bugs.archlinux.org/task/13146
|
|
install -Dt "$builddir/drivers/media/i2c" -m644 drivers/media/i2c/msp3400-driver.h
|
|
|
|
# http://bugs.archlinux.org/task/20402
|
|
install -Dt "$builddir/drivers/media/usb/dvb-usb" -m644 drivers/media/usb/dvb-usb/*.h
|
|
install -Dt "$builddir/drivers/media/dvb-frontends" -m644 drivers/media/dvb-frontends/*.h
|
|
install -Dt "$builddir/drivers/media/tuners" -m644 drivers/media/tuners/*.h
|
|
|
|
msg2 "Installing KConfig files..."
|
|
find . -name 'Kconfig*' -exec install -Dm644 {} "$builddir/{}" \;
|
|
|
|
msg2 "Removing unneeded architectures..."
|
|
local arch
|
|
for arch in "$builddir"/arch/*/; do
|
|
[[ $arch = */x86/ ]] && continue
|
|
echo "Removing $(basename "$arch")"
|
|
rm -r "$arch"
|
|
done
|
|
|
|
msg2 "Removing documentation..."
|
|
rm -r "$builddir/Documentation"
|
|
|
|
msg2 "Removing broken symlinks..."
|
|
find -L "$builddir" -type l -printf 'Removing %P\n' -delete
|
|
|
|
msg2 "Removing loose objects..."
|
|
find "$builddir" -type f -name '*.o' -printf 'Removing %P\n' -delete
|
|
|
|
msg2 "Stripping build tools..."
|
|
local file
|
|
while read -rd '' file; do
|
|
case "$(file -bi "$file")" in
|
|
application/x-sharedlib\;*) # Libraries (.so)
|
|
strip -v $STRIP_SHARED "$file" ;;
|
|
application/x-archive\;*) # Libraries (.a)
|
|
strip -v $STRIP_STATIC "$file" ;;
|
|
application/x-executable\;*) # Binaries
|
|
strip -v $STRIP_BINARIES "$file" ;;
|
|
application/x-pie-executable\;*) # Relocatable binaries
|
|
strip -v $STRIP_SHARED "$file" ;;
|
|
esac
|
|
done < <(find "$builddir" -type f -perm -u+x ! -name vmlinux -print0)
|
|
|
|
msg2 "Adding symlink..."
|
|
mkdir -p "$pkgdir/usr/src"
|
|
ln -sr "$builddir" "$pkgdir/usr/src/$pkgbase"
|
|
|
|
msg2 "Fixing permissions..."
|
|
chmod -Rc u=rwX,go=rX "$pkgdir"
|
|
|
|
if [ $_NUKR == "true" ]; then
|
|
rm -rf "$srcdir" # Nuke the entire src folder so it'll get regenerated clean on next build
|
|
fi
|
|
}
|
|
|
|
source /dev/stdin <<EOF
|
|
package_${pkgbase}() {
|
|
hackbase
|
|
}
|
|
|
|
package_${pkgbase}-headers() {
|
|
hackheaders
|
|
}
|
|
EOF
|
|
|
|
function exit_cleanup {
|
|
# Remove state tracker
|
|
rm -f "$_where"/cpuschedset
|
|
|
|
# Remove temporarily copied files
|
|
rm -rf "$_where"/*.patch
|
|
rm -rf "$_where"/*-profile.cfg
|
|
rm -f "$_where"/config*
|
|
rm -f "$_where"/*.hook
|
|
rm -f "$_where"/cleanup
|
|
|
|
# Community patches removal in case of failure
|
|
for _p in ${_community_patches[@]}; do
|
|
rm -f "$_where"/"$_p"
|
|
done
|
|
|
|
if [ "$_NUKR" == "true" ]; then
|
|
rm -rf "$_where"/src/*
|
|
# Double tap
|
|
rm -rf "$srcdir"/linux-*
|
|
rm -rf "$srcdir"/*.xz
|
|
rm -rf "$srcdir"/*.patch
|
|
rm -rf "$srcdir"/*-profile.cfg
|
|
rm -f "$srcdir"/config.x86_64
|
|
rm -f "$srcdir"/customization.cfg
|
|
else
|
|
# Meh
|
|
rm -rf "$srcdir"/linux-${_basekernel}/Documentation/filesystems/aufs/*
|
|
rm -f "$srcdir"/linux-${_basekernel}/Documentation/ABI/testing/*-aufs
|
|
rm -rf "$srcdir"/linux-${_basekernel}/fs/aufs/*
|
|
rm -f "$srcdir"/linux-${_basekernel}/include/uapi/linux/aufs*
|
|
|
|
rm -f "$srcdir"/linux-${_basekernel}/mm/prfile.c
|
|
|
|
rm -f "$srcdir"/linux-${_basekernel}/block/bfq*
|
|
rm -f "$srcdir"/linux-${_basekernel}/Documentation/tp_smapi.txt
|
|
|
|
rm -f "$srcdir"/linux-${_basekernel}/drivers/platform/x86/thinkpad_ec.c
|
|
rm -f "$srcdir"/linux-${_basekernel}/include/linux/thinkpad_ec.h
|
|
rm -f "$srcdir"/linux-${_basekernel}/drivers/platform/x86/tp_smapi.c
|
|
|
|
rm -rf "$srcdir"/linux-${_basekernel}/drivers/scsi/vhba/*
|
|
|
|
rm -rf "$srcdir"/linux-${_basekernel}/fs/exfat/*
|
|
rm -f "$srcdir"/linux-${_basekernel}/include/trace/events/fs.h
|
|
|
|
rm -f "$srcdir"/linux-${_basekernel}/Documentation/scheduler/sched-PDS-mq.txt
|
|
rm -f "$srcdir"/linux-${_basekernel}/include/linux/skip_list.h
|
|
rm -f "$srcdir"/linux-${_basekernel}/kernel/sched/pds.c
|
|
rm -f "$srcdir"/linux-${_basekernel}/kernel/sched/pds_sched.h
|
|
|
|
rm -f "$srcdir"/linux-${_basekernel}/Documentation/scheduler/sched-BMQ.txt
|
|
rm -f "$srcdir"/linux-${_basekernel}/kernel/sched/bmq.c
|
|
rm -f "$srcdir"/linux-${_basekernel}/kernel/sched/bmq_sched.h
|
|
|
|
rm -f "$srcdir"/linux-${_basekernel}/Documentation/scheduler/sched-BFS.txt
|
|
rm -f "$srcdir"/linux-${_basekernel}/Documentation/scheduler/sched-MuQSS.txt
|
|
rm -rf "$srcdir"/linux-${_basekernel}/arch/blackfin/*
|
|
rm -f "$srcdir"/linux-${_basekernel}/arch/powerpc/configs/c2k_defconfig
|
|
rm -f "$srcdir"/linux-${_basekernel}/arch/score/configs/spct6600_defconfig
|
|
rm -f "$srcdir"/linux-${_basekernel}/arch/tile/configs/tilegx_defconfig
|
|
rm -f "$srcdir"/linux-${_basekernel}/arch/tile/configs/tilepro_defconfig
|
|
rm -f "$srcdir"/linux-${_basekernel}/drivers/staging/lustre/lnet/lnet/lib-eq.c
|
|
rm -f "$srcdir"/linux-${_basekernel}/kernel/sched/MuQSS*
|
|
rm -f "$srcdir"/linux-${_basekernel}/kernel/skip_list.c
|
|
|
|
rm -f "$srcdir"/linux-${_basekernel}/Documentation/vm/uksm.txt
|
|
rm -f "$srcdir"/linux-${_basekernel}/include/linux/sradix-tree.h
|
|
rm -f "$srcdir"/linux-${_basekernel}/include/linux/uksm.h
|
|
rm -f "$srcdir"/linux-${_basekernel}/lib/sradix-tree.c
|
|
rm -f "$srcdir"/linux-${_basekernel}/mm/uksm.c
|
|
fi
|
|
|
|
remove_deps
|
|
|
|
msg2 'exit cleanup done\n'
|
|
if [ -n "$_runtime" ]; then
|
|
msg2 "compilation time : \n$_runtime"
|
|
fi
|
|
}
|
|
|
|
trap exit_cleanup EXIT
|