Initial commit

This commit is contained in:
Pavle Portic 2020-02-10 01:10:02 +01:00
commit 510d3f3a0d
Signed by: TheEdgeOfRage
GPG Key ID: 6758ACE46AA2A849
14 changed files with 96473 additions and 0 deletions

3
.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
bin/
compiled/
output/

29
compile.sh Executable file
View File

@ -0,0 +1,29 @@
#!/bin/bash
#
# compile.sh
# Copyright (C) 2020 pavle <pavle.portic@tilda.center>
#
# Distributed under terms of the BSD 3-Clause license.
#
export MAKEFLAGS='-j16'
version='5.5.2'
cd config
configs=$(ls -1 config_* | sed 's#^config_\(.\+\)#\1#')
cd ..
mkdir -p compiled
for c in $configs; do
if ls -1 compiled | grep $c >/dev/null; then
continue
fi
cp config/config_$c linux/config
cd linux
makepkg -sf
cp linux-$version*.pkg.tar.zst ../compiled/linux-$version-$c.pkg.tar.zst
cd ..
done

10679
config/config_DEFAULT Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

10674
config/config_MEMCG Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

10667
config/config_RETPOLINE Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

10679
config/config_USERFAULTFD Normal file

File diff suppressed because it is too large Load Diff

201
linux/PKGBUILD Normal file
View File

@ -0,0 +1,201 @@
# Maintainer: Jan Alexander Steffens (heftig) <jan.steffens@gmail.com>
pkgbase=linux
pkgver=5.5.2.arch2
pkgrel=2
pkgdesc='Linux'
_srctag=v${pkgver%.*}-${pkgver##*.}
url="https://git.archlinux.org/linux.git/log/?h=$_srctag"
arch=(x86_64)
license=(GPL2)
makedepends=(
bc kmod libelf
xmlto python-sphinx python-sphinx_rtd_theme graphviz imagemagick
git
)
options=('!strip')
_srcname=archlinux-linux
source=(
"$_srcname::git+https://git.archlinux.org/linux.git?signed#tag=$_srctag"
config # the main kernel config file
)
validpgpkeys=(
'ABAF11C65A2970B130ABE3C479BE3E4300411886' # Linus Torvalds
'647F28654894E3BD457199BE38DBBDC86092693E' # Greg Kroah-Hartman
'8218F88849AAC522E94CF470A5E9288C4FA415FA' # Jan Alexander Steffens (heftig)
)
sha256sums=('SKIP'
'SKIP')
export KBUILD_BUILD_HOST=archlinux
export KBUILD_BUILD_USER=$pkgbase
export KBUILD_BUILD_TIMESTAMP="$(date -Ru${SOURCE_DATE_EPOCH:+d @$SOURCE_DATE_EPOCH})"
prepare() {
cd $_srcname
echo "Setting version..."
scripts/setlocalversion --save-scmversion
echo "-$pkgrel" > localversion.10-pkgrel
echo "${pkgbase#linux}" > localversion.20-pkgname
local src
for src in "${source[@]}"; do
src="${src%%::*}"
src="${src##*/}"
[[ $src = *.patch ]] || continue
echo "Applying patch $src..."
patch -Np1 < "../$src"
done
echo "Setting config..."
cp ../config .config
# make olddefconfig
make oldconfig
make -s kernelrelease > version
echo "Prepared $pkgbase version $(<version)"
}
build() {
cd $_srcname
make bzImage modules htmldocs
}
_package() {
pkgdesc="The $pkgdesc kernel and modules"
depends=(coreutils kmod initramfs)
optdepends=('crda: to set the correct wireless channels of your country'
'linux-firmware: firmware images needed for some devices')
cd $_srcname
local kernver="$(<version)"
local modulesdir="$pkgdir/usr/lib/modules/$kernver"
echo "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"
echo "Installing modules..."
make INSTALL_MOD_PATH="$pkgdir/usr" modules_install
# remove build and source links
rm "$modulesdir"/{source,build}
echo "Fixing permissions..."
chmod -Rc u=rwX,go=rX "$pkgdir"
}
_package-headers() {
pkgdesc="Headers and scripts for building modules for the $pkgdesc kernel"
cd $_srcname
local builddir="$pkgdir/usr/lib/modules/$(<version)/build"
echo "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}
echo "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
echo "Installing KConfig files..."
find . -name 'Kconfig*' -exec install -Dm644 {} "$builddir/{}" \;
echo "Removing unneeded architectures..."
local arch
for arch in "$builddir"/arch/*/; do
[[ $arch = */x86/ ]] && continue
echo "Removing $(basename "$arch")"
rm -r "$arch"
done
echo "Removing documentation..."
rm -r "$builddir/Documentation"
echo "Removing broken symlinks..."
find -L "$builddir" -type l -printf 'Removing %P\n' -delete
echo "Removing loose objects..."
find "$builddir" -type f -name '*.o' -printf 'Removing %P\n' -delete
echo "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)
echo "Adding symlink..."
mkdir -p "$pkgdir/usr/src"
ln -sr "$builddir" "$pkgdir/usr/src/$pkgbase"
echo "Fixing permissions..."
chmod -Rc u=rwX,go=rX "$pkgdir"
}
_package-docs() {
pkgdesc="Documentation for the $pkgdesc kernel"
cd $_srcname
local builddir="$pkgdir/usr/lib/modules/$(<version)/build"
echo "Installing documentation..."
local src dst
while read -rd '' src; do
dst="${src#Documentation/}"
dst="$builddir/Documentation/${dst#output/}"
install -Dm644 "$src" "$dst"
done < <(find Documentation -name '.*' -prune -o ! -type d -print0)
echo "Adding symlink..."
mkdir -p "$pkgdir/usr/share/doc"
ln -sr "$builddir/Documentation" "$pkgdir/usr/share/doc/$pkgbase"
echo "Fixing permissions..."
chmod -Rc u=rwX,go=rX "$pkgdir"
}
pkgname=("$pkgbase" "$pkgbase-headers" "$pkgbase-docs")
for _p in "${pkgname[@]}"; do
eval "package_$_p() {
$(declare -f "_package${_p#$pkgbase}")
_package${_p#$pkgbase}
}"
done
# vim:set ts=8 sts=2 sw=2 et:

10679
linux/config Normal file

File diff suppressed because it is too large Load Diff

127
run.py Executable file
View File

@ -0,0 +1,127 @@
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# vim:fenc=utf-8
import logging
import re
import subprocess
from csv import DictWriter
CONFIGS = [
'DEFAULT',
'HARDENED_USERCOPY',
'MEMCG',
'PAGE_TABLE_ISOLATION',
'RETPOLINE',
'SLAB_FREELIST_RANDOM',
'TRANSPARENT_HUGEPAGE_ALWAYS',
'USERFAULTFD',
]
PASSES = 5
VERSION = '5.5.2'
pattern = re.compile(r'(\w+) ?(.*) (\d+)us')
def load_current():
with open('current', 'r') as f:
return f.read()
def set_current(current):
with open('current', 'w') as f:
return f.write(current)
def run_bench_script():
result = subprocess.run(['bash', 'run_bench.sh'], capture_output=True)
return result.stdout.decode('UTF-8')
def parse_results(output):
results = {}
for line in output.split('\n'):
matches = pattern.match(line.strip())
if matches is None:
continue
results[matches.group(1)] = {
'params': matches.group(2),
'time': int(matches.group(3)),
}
return results
def accumulate(accumulated_results, results):
for key, value in results.items():
if key in accumulated_results:
accumulated_results[key]['time'] += value['time']
else:
accumulated_results[key] = value.copy()
def average(accumulated_results):
results = []
for key, value in accumulated_results.items():
results.append({
'name': key,
'params': value['params'],
'time': int(value['time'] / PASSES),
})
return results
def save_results(current, results):
logging.info(f'saving results: {results}')
with open(f'output/{current}.csv', 'w', newline='') as csvfile:
fieldnames = ['name', 'params', 'time']
writer = DictWriter(csvfile, fieldnames=fieldnames, delimiter=',')
writer.writeheader()
writer.writerows(results)
def prepare_next(current):
current_index = CONFIGS.index(current)
if current_index == len(CONFIGS) - 1:
return False
next = CONFIGS[current_index + 1]
logging.info(f'Setting {next} as next config')
package = f'/home/pavle/compiled/linux-{VERSION}-{next}.pkg.tar.zst'
set_current(next)
subprocess.run(['sudo', 'pacman', '-U', '--noconfirm', package])
subprocess.run(['sudo', 'efibootmgr', '-n', '0007'])
return True
def run_benchmark(current):
accumulated_results = {}
for i in range(PASSES):
logging.info(f'pass {i+1} of {PASSES}')
output = run_bench_script()
logging.debug(f'raw benchmark output: {output}')
results = parse_results(output)
accumulate(accumulated_results, results)
logging.debug(f'pass results: {results}')
logging.debug(f'accumulated results: {accumulated_results}')
final_results = average(accumulated_results)
logging.debug(f'Final results: {final_results}')
save_results(current, final_results)
def main():
current = load_current()
logging.info(f'Current config: {current}')
run_benchmark(current)
if prepare_next(current):
subprocess.run(['sudo', 'reboot'])
if __name__ == '__main__':
logging.basicConfig(level=logging.INFO)
main()

27
run_bench.sh Executable file
View File

@ -0,0 +1,27 @@
#!/bin/bash
# THREAD number_of_threads
bin/thread 100000
# FORK number_of_forks
bin/fork 16 | tail -n 1
# READ number_of_reads
bin/read 10000000
# WRITTE number_of_writtes
bin/write 10000000
# MMAP_MUNMAP number_of_maps/unmaps number_of_pages
bin/mmap_munmap 10000000 1
# RECV
bin/recv &
sleep 1
# SEND number_of_messages text
bin/send 10000000 a
# PAGE_FAULT number_of_faults
bin/page_fault 1000000