diff options
author | blacksky3 | 2023-06-16 21:17:33 -0400 |
---|---|---|
committer | blacksky3 | 2023-06-16 21:17:33 -0400 |
commit | c868798400bd86626be05c35f28efcaf8bed5af8 (patch) | |
tree | 5f3e1036ac7637a2a978242c5d3b0cdb0eb7fc8c | |
parent | e4386cd337ea2cd13074c671711de775d296f1b4 (diff) | |
download | aur-c868798400bd86626be05c35f28efcaf8bed5af8.tar.gz |
initial rework
-rw-r--r-- | .SRCINFO | 55 | ||||
-rw-r--r-- | 0001-ZEN-Add-sysctl-and-CONFIG-to-disallow-unprivileged-C.patch | 154 | ||||
-rw-r--r-- | 0001-linux6.1.y-bore2.4.0.patch | 421 | ||||
-rw-r--r-- | 0002-constgran-vanilla-max.patch | 86 | ||||
-rw-r--r-- | PKGBUILD | 1312 |
5 files changed, 1003 insertions, 1025 deletions
@@ -1,56 +1,41 @@ pkgbase = linux-bore - pkgdesc = Linux BORE scheduler Kernel by CachyOS with other patches and improvements - pkgver = 6.0.12 + pkgdesc = The Linux kernel and modules with Masahito Suzuki BORE CPU scheduler and Arch patches + pkgver = 6.3.8 pkgrel = 1 - url = https://github.com/CachyOS/linux-cachyos + url = https://www.kernel.org/ arch = x86_64 - arch = x86_64_v3 license = GPL2 makedepends = bc + makedepends = kmod makedepends = libelf makedepends = pahole makedepends = cpio makedepends = perl makedepends = tar makedepends = xz + makedepends = xmlto + makedepends = git + makedepends = bison + makedepends = flex makedepends = zstd + makedepends = make + makedepends = patch makedepends = gcc makedepends = gcc-libs makedepends = glibc makedepends = binutils - makedepends = make - makedepends = patch options = !strip - source = https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.0.12.tar.xz - source = config - source = config-rt - source = auto-cpu-optimization.sh - source = https://raw.githubusercontent.com/cachyos/kernel-patches/master/6.0/all/0001-cachyos-base-all.patch - source = https://raw.githubusercontent.com/cachyos/kernel-patches/master/6.0/misc/0001-Add-latency-priority-for-CFS-class.patch - source = https://raw.githubusercontent.com/cachyos/kernel-patches/master/6.0/sched/0001-bore-cachy.patch - sha256sums = 89b730edf8942b49e02f9894244205886c9a214d629b35b88c4ff06ee9304f01 - sha256sums = 5ef4000fa382d718bc88a2c898534c94349bc38125fb0a5e6f90987c64338bc2 - sha256sums = 8e3332029a7e6574b8c5d1f98e5391a20871b889e0a65fc351584c26b9e2b0ef - sha256sums = e1d45b5842079a5f0f53d7ea2d66ffa3f1497766f3ccffcf13ed00f1ac67f95e - sha256sums = e56d2483f4abf9a6c935d3bd37d9b5892024daff957f58bc96eec23bfb181d8a - sha256sums = 8a29fd18c2deb36cf0bbfb16a84819d86fa476ef4792d07dd627c945c0b55f4b - sha256sums = 4b135afcb13e2a852048e99ee96f74eb4ba785039a447b43d3e87e03494e29d7 + source = https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.3.8.tar.xz + source = https://gitlab.archlinux.org/archlinux/packaging/packages/linux/-/raw/e7308a977d83f3cf94ed228b0f6b9b65a4d9139c/config + source = 0001-linux6.1.y-bore2.4.0.patch + source = 0002-constgran-vanilla-max.patch + source = 0001-ZEN-Add-sysctl-and-CONFIG-to-disallow-unprivileged-C.patch + sha256sums = 4323d421250e2e444c35d36f4aa8ddb56591dedc25c68d359d19c4ef9dd20955 + sha256sums = 6508516de94ed941ae755d89807610dc51fe1229dbfecdf8a82604a8d33242ce + sha256sums = e788c1d25df2ffa710c3be4786dd477a82e8271d2950ddca89b56957035b4a5f + sha256sums = 466d7231d2bba65edb53da48e0ec444499e4ba526e9067b517fb78bf09973486 + sha256sums = d4edb692d0a1772af639730d898282e92a3c06acc46e5a55429315b2a5763e82 pkgname = linux-bore - pkgdesc = The Linux BORE scheduler Kernel by CachyOS with other patches and improvements kernel and modules - depends = coreutils - depends = kmod - depends = initramfs - optdepends = wireless-regdb: to set the correct wireless channels of your country - optdepends = linux-firmware: firmware images needed for some devices - optdepends = modprobed-db: Keeps track of EVERY kernel module that has ever been probed - useful for those of us who make localmodconfig - optdepends = uksmd: Userspace KSM helper daemon - provides = VIRTUALBOX-GUEST-MODULES - provides = WIREGUARD-MODULE - provides = KSMBD-MODULE - provides = UKSMD-BUILTIN pkgname = linux-bore-headers - pkgdesc = Headers and scripts for building modules for the Linux BORE scheduler Kernel by CachyOS with other patches and improvements kernel - depends = pahole - depends = linux-bore diff --git a/0001-ZEN-Add-sysctl-and-CONFIG-to-disallow-unprivileged-C.patch b/0001-ZEN-Add-sysctl-and-CONFIG-to-disallow-unprivileged-C.patch new file mode 100644 index 000000000000..b48186b1a10b --- /dev/null +++ b/0001-ZEN-Add-sysctl-and-CONFIG-to-disallow-unprivileged-C.patch @@ -0,0 +1,154 @@ +From d73ae82da61377a3f89ec5eded369fd186cbd165 Mon Sep 17 00:00:00 2001 +From: "Jan Alexander Steffens (heftig)" <jan.steffens@gmail.com> +Date: Mon, 16 Sep 2019 04:53:20 +0200 +Subject: [PATCH] ZEN: Add sysctl and CONFIG to disallow unprivileged + CLONE_NEWUSER + +Our default behavior continues to match the vanilla kernel. +--- + include/linux/user_namespace.h | 4 ++++ + init/Kconfig | 16 ++++++++++++++++ + kernel/fork.c | 14 ++++++++++++++ + kernel/sysctl.c | 12 ++++++++++++ + kernel/user_namespace.c | 7 +++++++ + 5 files changed, 53 insertions(+) + +diff --git a/include/linux/user_namespace.h b/include/linux/user_namespace.h +index 45f09bec0..87b20e2ee 100644 +--- a/include/linux/user_namespace.h ++++ b/include/linux/user_namespace.h +@@ -148,6 +148,8 @@ static inline void set_userns_rlimit_max(struct user_namespace *ns, + + #ifdef CONFIG_USER_NS + ++extern int unprivileged_userns_clone; ++ + static inline struct user_namespace *get_user_ns(struct user_namespace *ns) + { + if (ns) +@@ -181,6 +183,8 @@ extern bool current_in_userns(const struct user_namespace *target_ns); + struct ns_common *ns_get_owner(struct ns_common *ns); + #else + ++#define unprivileged_userns_clone 0 ++ + static inline struct user_namespace *get_user_ns(struct user_namespace *ns) + { + return &init_user_ns; +diff --git a/init/Kconfig b/init/Kconfig +index c88bb30a8..32ba96d94 100644 +--- a/init/Kconfig ++++ b/init/Kconfig +@@ -1249,6 +1249,22 @@ config USER_NS + + If unsure, say N. + ++config USER_NS_UNPRIVILEGED ++ bool "Allow unprivileged users to create namespaces" ++ default y ++ depends on USER_NS ++ help ++ When disabled, unprivileged users will not be able to create ++ new namespaces. Allowing users to create their own namespaces ++ has been part of several recent local privilege escalation ++ exploits, so if you need user namespaces but are ++ paranoid^Wsecurity-conscious you want to disable this. ++ ++ This setting can be overridden at runtime via the ++ kernel.unprivileged_userns_clone sysctl. ++ ++ If unsure, say Y. ++ + config PID_NS + bool "PID Namespaces" + default y +diff --git a/kernel/fork.c b/kernel/fork.c +index 1ec1e9ea4..90e639a39 100644 +--- a/kernel/fork.c ++++ b/kernel/fork.c +@@ -98,6 +98,10 @@ + #include <linux/bpf.h> + #include <linux/stackprotector.h> + ++#ifdef CONFIG_USER_NS ++#include <linux/user_namespace.h> ++#endif ++ + #include <asm/pgalloc.h> + #include <linux/uaccess.h> + #include <asm/mmu_context.h> +@@ -2032,6 +2036,10 @@ static __latent_entropy struct task_struct *copy_process( + if ((clone_flags & (CLONE_NEWUSER|CLONE_FS)) == (CLONE_NEWUSER|CLONE_FS)) + return ERR_PTR(-EINVAL); + ++ if ((clone_flags & CLONE_NEWUSER) && !unprivileged_userns_clone) ++ if (!capable(CAP_SYS_ADMIN)) ++ return ERR_PTR(-EPERM); ++ + /* + * Thread groups must share signals as well, and detached threads + * can only be started up within the thread group. +@@ -3182,6 +3190,12 @@ int ksys_unshare(unsigned long unshare_flags) + if (unshare_flags & CLONE_NEWNS) + unshare_flags |= CLONE_FS; + ++ if ((unshare_flags & CLONE_NEWUSER) && !unprivileged_userns_clone) { ++ err = -EPERM; ++ if (!capable(CAP_SYS_ADMIN)) ++ goto bad_unshare_out; ++ } ++ + err = check_unshare_flags(unshare_flags); + if (err) + goto bad_unshare_out; +diff --git a/kernel/sysctl.c b/kernel/sysctl.c +index 1c240d2c9..2971581a2 100644 +--- a/kernel/sysctl.c ++++ b/kernel/sysctl.c +@@ -81,6 +81,9 @@ + #ifdef CONFIG_RT_MUTEXES + #include <linux/rtmutex.h> + #endif ++#ifdef CONFIG_USER_NS ++#include <linux/user_namespace.h> ++#endif + + /* shared constants to be used in various sysctls */ + const int sysctl_vals[] = { 0, 1, 2, 3, 4, 100, 200, 1000, 3000, INT_MAX, 65535, -1 }; +@@ -1645,6 +1648,15 @@ static struct ctl_table kern_table[] = { + .mode = 0644, + .proc_handler = proc_dointvec, + }, ++#ifdef CONFIG_USER_NS ++ { ++ .procname = "unprivileged_userns_clone", ++ .data = &unprivileged_userns_clone, ++ .maxlen = sizeof(int), ++ .mode = 0644, ++ .proc_handler = proc_dointvec, ++ }, ++#endif + #ifdef CONFIG_PROC_SYSCTL + { + .procname = "tainted", +diff --git a/kernel/user_namespace.c b/kernel/user_namespace.c +index 1d8e47bed..fec01d016 100644 +--- a/kernel/user_namespace.c ++++ b/kernel/user_namespace.c +@@ -22,6 +22,13 @@ + #include <linux/bsearch.h> + #include <linux/sort.h> + ++/* sysctl */ ++#ifdef CONFIG_USER_NS_UNPRIVILEGED ++int unprivileged_userns_clone = 1; ++#else ++int unprivileged_userns_clone; ++#endif ++ + static struct kmem_cache *user_ns_cachep __read_mostly; + static DEFINE_MUTEX(userns_state_mutex); + +-- +2.41.0 + diff --git a/0001-linux6.1.y-bore2.4.0.patch b/0001-linux6.1.y-bore2.4.0.patch new file mode 100644 index 000000000000..12e8f7290d27 --- /dev/null +++ b/0001-linux6.1.y-bore2.4.0.patch @@ -0,0 +1,421 @@ +From e27a03de3de1923af334499d1160715d8facc013 Mon Sep 17 00:00:00 2001 +From: Masahito S <firelzrd@gmail.com> +Date: Thu, 8 Jun 2023 07:50:42 +0900 +Subject: [PATCH] linux6.1.y-bore2.4.0 + +--- + include/linux/sched.h | 10 +++ + init/Kconfig | 20 ++++++ + kernel/sched/core.c | 62 ++++++++++++++++++ + kernel/sched/debug.c | 3 + + kernel/sched/fair.c | 136 ++++++++++++++++++++++++++++++++++++++++ + kernel/sched/features.h | 8 +++ + 6 files changed, 239 insertions(+) + +diff --git a/include/linux/sched.h b/include/linux/sched.h +index ffb6eb55c..160343f67 100644 +--- a/include/linux/sched.h ++++ b/include/linux/sched.h +@@ -555,6 +555,12 @@ struct sched_entity { + u64 sum_exec_runtime; + u64 vruntime; + u64 prev_sum_exec_runtime; ++#ifdef CONFIG_SCHED_BORE ++ u64 prev_burst_time; ++ u64 burst_time; ++ u64 max_burst_time; ++ u8 penalty_score; ++#endif // CONFIG_SCHED_BORE + + u64 nr_migrations; + +@@ -989,6 +995,10 @@ struct task_struct { + struct list_head children; + struct list_head sibling; + struct task_struct *group_leader; ++#ifdef CONFIG_SCHED_BORE ++ u64 child_burst_cache; ++ u64 child_burst_last_cached; ++#endif // CONFIG_SCHED_BORE + + /* + * 'ptraced' is the list of tasks this task is using ptrace() on. +diff --git a/init/Kconfig b/init/Kconfig +index 0c214af99..43f67c63e 100644 +--- a/init/Kconfig ++++ b/init/Kconfig +@@ -1283,6 +1283,26 @@ config CHECKPOINT_RESTORE + + If unsure, say N here. + ++config SCHED_BORE ++ bool "Burst-Oriented Response Enhancer" ++ default y ++ help ++ In Desktop and Mobile computing, one might prefer interactive ++ tasks to keep responsive no matter what they run in the background. ++ ++ Enabling this kernel feature modifies the scheduler to discriminate ++ tasks by their burst time (runtime since it last went sleeping or ++ yielding state) and prioritize those that run less bursty. ++ Such tasks usually include window compositor, widgets backend, ++ terminal emulator, video playback, games and so on. ++ With a little impact to scheduling fairness, it may improve ++ responsiveness especially under heavy background workload. ++ ++ You can turn it off by setting the sysctl kernel.sched_bore = 0. ++ Enabling this feature implies NO_GENTLE_FAIR_SLEEPERS by default. ++ ++ If unsure say Y here. ++ + config SCHED_AUTOGROUP + bool "Automatic process group scheduling" + select CGROUPS +diff --git a/kernel/sched/core.c b/kernel/sched/core.c +index 9ebfd4841..8d050203f 100644 +--- a/kernel/sched/core.c ++++ b/kernel/sched/core.c +@@ -4364,6 +4364,57 @@ int wake_up_state(struct task_struct *p, unsigned int state) + return try_to_wake_up(p, state, 0); + } + ++#ifdef CONFIG_SCHED_BORE ++#define CHILD_BURST_CUTOFF_BITS 9 ++extern unsigned int sched_burst_cache_lifetime; ++ ++void __init sched_init_bore(void) { ++ init_task.child_burst_cache = 0; ++ init_task.child_burst_last_cached = 0; ++ init_task.se.prev_burst_time = 0; ++ init_task.se.burst_time = 0; ++ init_task.se.max_burst_time = 0; ++} ++ ++void inline __sched_fork_bore(struct task_struct *p) { ++ p->child_burst_cache = 0; ++ p->child_burst_last_cached = 0; ++ p->se.burst_time = 0; ++} ++ ++static inline void update_task_child_burst_time_cache(struct task_struct *p) { ++ u64 sum = 0, avg_burst_time = 0; ++ u32 cnt = 0; ++ struct task_struct *child; ++ ++ read_lock(&tasklist_lock); ++ list_for_each_entry(child, &p->children, sibling) { ++ cnt++; ++ sum += child->se.max_burst_time >> CHILD_BURST_CUTOFF_BITS; ++ } ++ read_unlock(&tasklist_lock); ++ ++ if (cnt) avg_burst_time = div_u64(sum, cnt) << CHILD_BURST_CUTOFF_BITS; ++ p->child_burst_cache = max(avg_burst_time, p->se.max_burst_time); ++} ++ ++static void update_task_initial_burst_time(struct task_struct *task) { ++ struct sched_entity *se = &task->se; ++ struct task_struct *par = task->real_parent; ++ u64 ktime = ktime_to_ns(ktime_get()); ++ ++ if (likely(par)) { ++ if (par->child_burst_last_cached + sched_burst_cache_lifetime < ktime) { ++ par->child_burst_last_cached = ktime; ++ update_task_child_burst_time_cache(par); ++ } ++ se->prev_burst_time = max(se->prev_burst_time, par->child_burst_cache); ++ } ++ ++ se->max_burst_time = se->prev_burst_time; ++} ++#endif // CONFIG_SCHED_BORE ++ + /* + * Perform scheduler related setup for a newly forked process p. + * p is forked by current. +@@ -4380,6 +4431,9 @@ static void __sched_fork(unsigned long clone_flags, struct task_struct *p) + p->se.prev_sum_exec_runtime = 0; + p->se.nr_migrations = 0; + p->se.vruntime = 0; ++#ifdef CONFIG_SCHED_BORE ++ __sched_fork_bore(p); ++#endif // CONFIG_SCHED_BORE + INIT_LIST_HEAD(&p->se.group_node); + + #ifdef CONFIG_FAIR_GROUP_SCHED +@@ -4594,6 +4648,9 @@ late_initcall(sched_core_sysctl_init); + int sched_fork(unsigned long clone_flags, struct task_struct *p) + { + __sched_fork(clone_flags, p); ++#ifdef CONFIG_SCHED_BORE ++ update_task_initial_burst_time(p); ++#endif // CONFIG_SCHED_BORE + /* + * We mark the process as NEW here. This guarantees that + * nobody will actually run it, and a signal or other external +@@ -9674,6 +9731,11 @@ void __init sched_init(void) + BUG_ON(&dl_sched_class != &stop_sched_class + 1); + #endif + ++#ifdef CONFIG_SCHED_BORE ++ sched_init_bore(); ++ printk(KERN_INFO "BORE (Burst-Oriented Response Enhancer) CPU Scheduler modification 2.4.0 by Masahito Suzuki"); ++#endif // CONFIG_SCHED_BORE ++ + wait_bit_init(); + + #ifdef CONFIG_FAIR_GROUP_SCHED +diff --git a/kernel/sched/debug.c b/kernel/sched/debug.c +index 1637b65ba..752c43a9f 100644 +--- a/kernel/sched/debug.c ++++ b/kernel/sched/debug.c +@@ -547,6 +547,9 @@ print_task(struct seq_file *m, struct rq *rq, struct task_struct *p) + SPLIT_NS(schedstat_val_or_zero(p->stats.sum_sleep_runtime)), + SPLIT_NS(schedstat_val_or_zero(p->stats.sum_block_runtime))); + ++#ifdef CONFIG_SCHED_BORE ++ SEQ_printf(m, " %2d", p->se.penalty_score); ++#endif + #ifdef CONFIG_NUMA_BALANCING + SEQ_printf(m, " %d %d", task_node(p), task_numa_group_id(p)); + #endif +diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c +index 88821ab00..b7a116888 100644 +--- a/kernel/sched/fair.c ++++ b/kernel/sched/fair.c +@@ -19,6 +19,9 @@ + * + * Adaptive scheduling granularity, math enhancements by Peter Zijlstra + * Copyright (C) 2007 Red Hat, Inc., Peter Zijlstra ++ * ++ * Burst-Oriented Response Enhancer (BORE) CPU Scheduler ++ * Copyright (C) 2021-2023 Masahito Suzuki <firelzrd@gmail.com> + */ + #include <linux/energy_model.h> + #include <linux/mmap_lock.h> +@@ -126,6 +129,61 @@ static unsigned int normalized_sysctl_sched_wakeup_granularity = 1000000UL; + + const_debug unsigned int sysctl_sched_migration_cost = 500000UL; + ++#ifdef CONFIG_SCHED_BORE ++unsigned int __read_mostly sched_bore = 1; ++unsigned int __read_mostly sched_burst_cache_lifetime = 15000000; ++unsigned int __read_mostly sched_burst_penalty_offset = 12; ++unsigned int __read_mostly sched_burst_penalty_scale = 1292; ++unsigned int __read_mostly sched_burst_smoothness = 1; ++static int three = 3; ++static int sixty_four = 64; ++static int maxval_12_bits = 4095; ++ ++#define FIXED_SHIFT 10 ++#define FIXED_ONE (1 << FIXED_SHIFT) ++typedef u32 fixed; ++ ++static void update_burst_score(struct sched_entity *se) { ++ u64 burst_time = se->max_burst_time; ++ ++ int msb = fls64(burst_time); ++ fixed integer_part = msb << FIXED_SHIFT; ++ fixed fractional_part = burst_time << (64 - msb) << 1 >> (64 - FIXED_SHIFT); ++ fixed greed = integer_part | fractional_part; ++ ++ fixed tolerance = sched_burst_penalty_offset << FIXED_SHIFT; ++ fixed penalty = max(0, (s32)greed - (s32)tolerance); ++ fixed scaled_penalty = penalty * sched_burst_penalty_scale >> 10; ++ ++ u8 score = min(39U, scaled_penalty >> FIXED_SHIFT); ++ se->penalty_score = score; ++} ++ ++static inline u64 penalty_scale(u64 delta, struct sched_entity *se) { ++ return mul_u64_u32_shr(delta, sched_prio_to_wmult[se->penalty_score], 22); ++} ++ ++static inline u64 __binary_smooth(u64 new, u64 old, unsigned int smoothness) { ++ return (new + old * ((1 << smoothness) - 1)) >> smoothness; ++} ++ ++void restart_burst(struct sched_entity *se) { ++ se->max_burst_time = se->prev_burst_time = __binary_smooth( ++ se->burst_time, se->prev_burst_time, sched_burst_smoothness); ++ se->burst_time = 0; ++} ++ ++#define calc_delta_fair(delta, se) __calc_delta_fair(delta, se, true) ++#define calc_delta_fair_unscaled(delta, se) __calc_delta_fair(delta, se, false) ++static inline u64 ++__calc_delta_fair(u64 delta, struct sched_entity *se, bool bscale); ++ ++static s64 wakeup_preempt_backstep_delta(u64 rtime, struct sched_entity *se) { ++ u64 delta = calc_delta_fair_unscaled(rtime, se); ++ return delta - penalty_scale(delta, se); ++} ++#endif // CONFIG_SCHED_BORE ++ + int sched_thermal_decay_shift; + static int __init setup_sched_thermal_decay_shift(char *str) + { +@@ -180,6 +238,51 @@ static unsigned int sysctl_sched_cfs_bandwidth_slice = 5000UL; + + #ifdef CONFIG_SYSCTL + static struct ctl_table sched_fair_sysctls[] = { ++#ifdef CONFIG_SCHED_BORE ++ { ++ .procname = "sched_bore", ++ .data = &sched_bore, ++ .maxlen = sizeof(unsigned int), ++ .mode = 0644, ++ .proc_handler = &proc_dointvec_minmax, ++ .extra1 = SYSCTL_ZERO, ++ .extra2 = SYSCTL_ONE, ++ }, ++ { ++ .procname = "sched_burst_cache_lifetime", ++ .data = &sched_burst_cache_lifetime, ++ .maxlen = sizeof(unsigned int), ++ .mode = 0644, ++ .proc_handler = proc_dointvec, ++ }, ++ { ++ .procname = "sched_burst_penalty_offset", ++ .data = &sched_burst_penalty_offset, ++ .maxlen = sizeof(unsigned int), ++ .mode = 0644, ++ .proc_handler = &proc_dointvec_minmax, ++ .extra1 = SYSCTL_ZERO, ++ .extra2 = &sixty_four, ++ }, ++ { ++ .procname = "sched_burst_penalty_scale", ++ .data = &sched_burst_penalty_scale, ++ .maxlen = sizeof(unsigned int), ++ .mode = 0644, ++ .proc_handler = &proc_dointvec_minmax, ++ .extra1 = SYSCTL_ZERO, ++ .extra2 = &maxval_12_bits, ++ }, ++ { ++ .procname = "sched_burst_smoothness", ++ .data = &sched_burst_smoothness, ++ .maxlen = sizeof(unsigned int), ++ .mode = 0644, ++ .proc_handler = &proc_dointvec_minmax, ++ .extra1 = SYSCTL_ZERO, ++ .extra2 = &three, ++ }, ++#endif // CONFIG_SCHED_BORE + { + .procname = "sched_child_runs_first", + .data = &sysctl_sched_child_runs_first, +@@ -691,11 +794,19 @@ int sched_update_scaling(void) + /* + * delta /= w + */ ++#ifdef CONFIG_SCHED_BORE ++static inline u64 ++__calc_delta_fair(u64 delta, struct sched_entity *se, bool bscale) ++#else // CONFIG_SCHED_BORE + static inline u64 calc_delta_fair(u64 delta, struct sched_entity *se) ++#endif // CONFIG_SCHED_BORE + { + if (unlikely(se->load.weight != NICE_0_LOAD)) + delta = __calc_delta(delta, NICE_0_LOAD, &se->load); + ++#ifdef CONFIG_SCHED_BORE ++ if (bscale && sched_bore) delta = penalty_scale(delta, se); ++#endif // CONFIG_SCHED_BORE + return delta; + } + +@@ -905,6 +1016,14 @@ static void update_curr(struct cfs_rq *cfs_rq) + curr->sum_exec_runtime += delta_exec; + schedstat_add(cfs_rq->exec_clock, delta_exec); + ++#ifdef CONFIG_SCHED_BORE ++ curr->burst_time += delta_exec; ++ curr->max_burst_time = max(curr->max_burst_time, curr->burst_time); ++ update_burst_score(curr); ++ if (sched_bore) ++ curr->vruntime += penalty_scale(calc_delta_fair(delta_exec, curr), curr); ++ else ++#endif // CONFIG_SCHED_BORE + curr->vruntime += calc_delta_fair(delta_exec, curr); + update_min_vruntime(cfs_rq); + +@@ -6188,6 +6307,9 @@ static void dequeue_task_fair(struct rq *rq, struct task_struct *p, int flags) + util_est_dequeue(&rq->cfs, p); + + for_each_sched_entity(se) { ++#ifdef CONFIG_SCHED_BORE ++ if (task_sleep) restart_burst(se); ++#endif // CONFIG_SCHED_BORE + cfs_rq = cfs_rq_of(se); + dequeue_entity(cfs_rq, se, flags); + +@@ -7531,7 +7653,11 @@ static unsigned long wakeup_gran(struct sched_entity *se) + * This is especially important for buddies when the leftmost + * task is higher priority than the buddy. + */ ++#ifdef CONFIG_SCHED_BORE ++ return calc_delta_fair_unscaled(gran, se); ++#else // CONFIG_SCHED_BORE + return calc_delta_fair(gran, se); ++#endif // CONFIG_SCHED_BORE + } + + /* +@@ -7552,6 +7678,13 @@ static int + wakeup_preempt_entity(struct sched_entity *curr, struct sched_entity *se) + { + s64 gran, vdiff = curr->vruntime - se->vruntime; ++#ifdef CONFIG_SCHED_BORE ++ if (sched_bore) { ++ u64 rtime = curr->sum_exec_runtime - curr->prev_sum_exec_runtime; ++ vdiff += wakeup_preempt_backstep_delta(rtime, curr) ++ - wakeup_preempt_backstep_delta(rtime, se); ++ } ++#endif // CONFIG_SCHED_BORE + + if (vdiff <= 0) + return -1; +@@ -7897,6 +8030,9 @@ static void yield_task_fair(struct rq *rq) + struct task_struct *curr = rq->curr; + struct cfs_rq *cfs_rq = task_cfs_rq(curr); + struct sched_entity *se = &curr->se; ++#ifdef CONFIG_SCHED_BORE ++ restart_burst(se); ++#endif // CONFIG_SCHED_BORE + + /* + * Are we the only task in the tree? +diff --git a/kernel/sched/features.h b/kernel/sched/features.h +index ee7f23c76..3115bde98 100644 +--- a/kernel/sched/features.h ++++ b/kernel/sched/features.h +@@ -4,7 +4,11 @@ + * them to run sooner, but does not allow tons of sleepers to + * rip the spread apart. + */ ++#ifdef CONFIG_SCHED_BORE ++SCHED_FEAT(GENTLE_FAIR_SLEEPERS, false) ++#else // CONFIG_SCHED_BORE + SCHED_FEAT(GENTLE_FAIR_SLEEPERS, true) ++#endif // CONFIG_SCHED_BORE + + /* + * Place new tasks ahead so that they do not starve already running +@@ -17,7 +21,11 @@ SCHED_FEAT(START_DEBIT, true) + * wakeup-preemption), since its likely going to consume data we + * touched, increases cache locality. + */ ++#ifdef CONFIG_SCHED_BORE ++SCHED_FEAT(NEXT_BUDDY, true) ++#else // CONFIG_SCHED_BORE + SCHED_FEAT(NEXT_BUDDY, false) ++#endif // CONFIG_SCHED_BORE + + /* + * Prefer to schedule the task that ran last (when we did +-- +2.25.1 + diff --git a/0002-constgran-vanilla-max.patch b/0002-constgran-vanilla-max.patch new file mode 100644 index 000000000000..2685403496a2 --- /dev/null +++ b/0002-constgran-vanilla-max.patch @@ -0,0 +1,86 @@ +From 6758adc6a354f18a32b704e8f8ef1f6021515e51 Mon Sep 17 00:00:00 2001 +From: Masahito S <firelzrd@gmail.com> +Date: Fri, 28 Apr 2023 01:07:13 +0900 +Subject: [PATCH] constgran v4 sched: Make latency / granularity constant + tunable_scaling = 1 (logarithmic) -> 0 (constant) latency_ns = variable + 6-24ms -> constant 12.8ms min_granularity_ns = variable 0.75-3ms -> constant + 1.6ms wakeup_granularity_ns = variable 1-4ms -> constant 6.4ms + +--- + kernel/sched/fair.c | 31 +++++++++++++++++++++++++++---- + 1 file changed, 27 insertions(+), 4 deletions(-) + +diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c +index f8f1efa5f..87923da0f 100644 +--- a/kernel/sched/fair.c ++++ b/kernel/sched/fair.c +@@ -70,10 +70,16 @@ + * (to see the precise effective timeslice length of your workload, + * run vmstat and monitor the context-switches (cs) field) + * +- * (default: 6ms * (1 + ilog(ncpus)), units: nanoseconds) ++ * (BORE default: 24ms constant, units: nanoseconds) ++ * (CFS default: 6ms * (1 + ilog(ncpus)), units: nanoseconds) + */ ++#ifdef CONFIG_SCHED_BORE ++unsigned int sysctl_sched_latency = 24000000ULL; ++static unsigned int normalized_sysctl_sched_latency = 24000000ULL; ++#else // CONFIG_SCHED_BORE + unsigned int sysctl_sched_latency = 6000000ULL; + static unsigned int normalized_sysctl_sched_latency = 6000000ULL; ++#endif // CONFIG_SCHED_BORE + + /* + * The initial- and re-scaling of tunables is configurable +@@ -84,17 +90,28 @@ static unsigned int normalized_sysctl_sched_latency = 6000000ULL; + * SCHED_TUNABLESCALING_LOG - scaled logarithmical, *1+ilog(ncpus) + * SCHED_TUNABLESCALING_LINEAR - scaled linear, *ncpus + * +- * (default SCHED_TUNABLESCALING_LOG = *(1+ilog(ncpus)) ++ * (BORE default SCHED_TUNABLESCALING_NONE = *1 constant) ++ * (CFS default SCHED_TUNABLESCALING_LOG = *(1+ilog(ncpus)) + */ ++#ifdef CONFIG_SCHED_BORE ++unsigned int sysctl_sched_tunable_scaling = SCHED_TUNABLESCALING_NONE; ++#else // CONFIG_SCHED_BORE + unsigned int sysctl_sched_tunable_scaling = SCHED_TUNABLESCALING_LOG; ++#endif // CONFIG_SCHED_BORE + + /* + * Minimal preemption granularity for CPU-bound tasks: + * +- * (default: 0.75 msec * (1 + ilog(ncpus)), units: nanoseconds) ++ * (BORE default: 3 msec constant, units: nanoseconds) ++ * (CFS default: 0.75 msec * (1 + ilog(ncpus)), units: nanoseconds) + */ ++#ifdef CONFIG_SCHED_BORE ++unsigned int sysctl_sched_min_granularity = 3000000ULL; ++static unsigned int normalized_sysctl_sched_min_granularity = 3000000ULL; ++#else // CONFIG_SCHED_BORE + unsigned int sysctl_sched_min_granularity = 750000ULL; + static unsigned int normalized_sysctl_sched_min_granularity = 750000ULL; ++#endif // CONFIG_SCHED_BORE + + /* + * Minimal preemption granularity for CPU-bound SCHED_IDLE tasks. +@@ -122,10 +139,16 @@ unsigned int sysctl_sched_child_runs_first __read_mostly; + * and reduces their over-scheduling. Synchronous workloads will still + * have immediate wakeup/sleep latencies. + * +- * (default: 1 msec * (1 + ilog(ncpus)), units: nanoseconds) ++ * (BORE default: 4 msec constant, units: nanoseconds) ++ * (CFS default: 1 msec * (1 + ilog(ncpus)), units: nanoseconds) + */ ++#ifdef CONFIG_SCHED_BORE ++unsigned int sysctl_sched_wakeup_granularity = 4000000UL; ++static unsigned int normalized_sysctl_sched_wakeup_granularity = 4000000UL; ++#else // CONFIG_SCHED_BORE + unsigned int sysctl_sched_wakeup_granularity = 1000000UL; + static unsigned int normalized_sysctl_sched_wakeup_granularity = 1000000UL; ++#endif // CONFIG_SCHED_BORE + + const_debug unsigned int sysctl_sched_migration_cost = 500000UL; + +-- +2.25.1 + @@ -1,1016 +1,348 @@ -# Maintainer: Peter Jung ptr1337 <admin@ptr1337.dev> && Piotr Gorski <piotrgorski@cachyos.org> -# Contributor: Jan Alexander Steffens (heftig) <jan.steffens@gmail.com> -# Contributor: Tobias Powalowski <tpowa@archlinux.org> -# Contributor: Thomas Baechler <thomas@archlinux.org> - -### Selecting CachyOS config -# ATTENTION - one of two predefined values should be selected! -# 'yes' - enable CachyOS config -# 'no' - disable CachyOS config -_cachy_config=${_cachy_config-'yes'} - -### Selecting the CPU scheduler -# ATTENTION - one of seven predefined values should be selected! -# 'bmq' - select 'BitMap Queue CPU scheduler' -# 'pds' - select 'Priority and Deadline based Skip list multiple queue CPU scheduler' -# 'cacule' - select 'CacULE scheduler' -# 'cacule-rdb' - select 'CacULE-RDB scheduler' -# 'bore' - select 'Burst-Oriented Response Enhancer' -# 'cfs' - select 'Completely Fair Scheduler' -# 'tt' - select 'Task Type Scheduler by Hamad Marri' -# 'hardened' - select 'BORE Scheduler hardened' ## kernel with hardened config and hardening patches with the bore scheduler -_cpusched=${_cpusched-'bore'} - -## Apply some suggested sysctl values from the bore developer -## These are adjusted to BORE -_tune_bore=${_tune_bore-} - -### BUILD OPTIONS -# Set these variables to ANYTHING that is not null to enable them - -### Tweak kernel options prior to a build via nconfig -_makenconfig=${_makenconfig-} - -### Tweak kernel options prior to a build via menuconfig -_makemenuconfig=${_makemenuconfig-} - -### Tweak kernel options prior to a build via xconfig -_makexconfig=${_makexconfig-} - -### Tweak kernel options prior to a build via gconfig -_makegconfig=${_makegconfig-} - -# NUMA is optimized for multi-socket motherboards. -# A single multi-core CPU actually runs slower with NUMA enabled. -# See, https://bugs.archlinux.org/task/31187 -_NUMAdisable=${_NUMAdisable-} - -# Compile ONLY used modules to VASTLYreduce the number of modules built -# and the build time. -# -# To keep track of which modules are needed for your specific system/hardware, -# give module_db script a try: https://aur.archlinux.org/packages/modprobed-db -# This PKGBUILD read the database kept if it exists -# -# More at this wiki page ---> https://wiki.archlinux.org/index.php/Modprobed-db -_localmodcfg=${_localmodcfg-} - -# Use the current kernel's .config file -# Enabling this option will use the .config of the RUNNING kernel rather than -# the ARCH defaults. Useful when the package gets updated and you already went -# through the trouble of customizing your config options. NOT recommended when -# a new kernel is released, but again, convenient for package bumps. -_use_current=${_use_current-} - -### Enable KBUILD_CFLAGS -O3 -_cc_harder=${_cc_harder-y} - -### Set this to your number of threads you have in your machine otherwise it will default to 128 -_nr_cpus=${_nr_cpus-} - -### Set performance governor as default -_per_gov=${_per_gov-y} - -### Enable TCP_CONG_BBR2 -_tcp_bbr2=${_tcp_bbr2-y} - -### Running with a 1000HZ, 750Hz, 600 Hz, 500Hz, 300Hz, 250Hz and 100Hz tick rate -_HZ_ticks=${_HZ_ticks-750} - -## Choose between perodic, idle or full -### Full tickless can give higher performances in various cases but, depending on hardware, lower consistency. -_tickrate=${_tickrate-full} - -## Choose between full(low-latency), voluntary or server -_preempt=${_preempt-full} - -### Disable MQ-Deadline I/O scheduler -_mq_deadline_disable=${_mq_deadline_disable-y} - -### Disable Kyber I/O scheduler -_kyber_disable=${_kyber_disable-y} - -### Enable multigenerational LRU -# ATTENTION - one of three predefined values should be selected! -# 'standard' - enable multigenerational LRU -# 'stats' - enable multigenerational LRU with stats -# 'none' - disable multigenerational LRU -_lru_config=${_lru_config-'standard'} - -## Enable DAMON -_damon=${_damon-} - -## Enable Linux Random Number Generator -_lrng_enable=${_lrng_enable-y} - -# CPU compiler optimizations - Defaults to prompt at kernel config if left empty -# AMD CPUs : "k8" "k8sse3" "k10" "barcelona" "bobcat" "jaguar" "bulldozer" "piledriver" "steamroller" "excavator" "zen" "zen2" "zen3" -# Intel CPUs : "mpsc"(P4 & older Netburst based Xeon) "atom" "core2" "nehalem" "westmere" "silvermont" "sandybridge" "ivybridge" "haswell" "broadwell" "skylake" "skylakex" "cannonlake" "icelake" "goldmont" "goldmontplus" "cascadelake" "cooperlake" "tigerlake" "sapphirerapids" "rocketlake" "alderlake" -# Other options : -# - "native_amd" (use compiler autodetection - Selecting your arch manually in the list above is recommended instead of this option) -# - "native_intel" (use compiler autodetection and will prompt for P6_NOPS - Selecting your arch manually in the list above is recommended instead of this option) -# - "generic" (kernel's default - to share the package between machines with different CPU µarch as long as they are x86-64) -# -# Or use the _use_auto_optimization with _use_auto_optimization=y -_processor_opt=${_processor_opt-} - -_use_auto_optimization=${_use_auto_optimization-y} - -# disable debug to lower the size of the kernel -_disable_debug=${_disable_debug-} - -## Enable zram/zswap ZSTD compression -_zstd_compression=${_zstd_compression-y} - -### Selecting the ZSTD kernel and modules compression level -# ATTENTION - one of two predefined values should be selected! -# 'ultra' - highest compression ratio -# 'normal' - standard compression ratio -# WARNING: the ultra settings can sometimes -# be counterproductive in both size and speed. -_zstd_level_value=${_zstd_level_value-'normal'} - -# Clang LTO mode, only available with the "llvm" compiler - options are "no", "full" or "thin". -# "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." -_use_llvm_lto=${_use_llvm_lto-} - -# Use suffix -lto only when requested by the user -# Enabled by default. -# If you do not want the suffix -lto remove the "y" sign next to the flag. -# https://github.com/CachyOS/linux-cachyos/issues/36 -_use_lto_suffix=${_use_lto_suffix-y} - -# KCFI is a proposed forward-edge control-flow integrity scheme for -# Clang, which is more suitable for kernel use than the existing CFI -# scheme used by CONFIG_CFI_CLANG. KCFI doesn't require LTO, doesn't -# alter function references to point to a jump table, and won't break -# function address equality. -# ATTENTION!: you do need a patched llvm for the usage of kcfi, -# you can find a patched llvm-git in the cachyos-repo's. -# The packagename is called "llvm-kcfi" -# ATTENTION!: This is very experimental and could fail and the compilation or have other bugs in the kernel -_use_kcfi=${_use_kcfi-} - -# Build the zfs module builtin in to the kernel -_build_zfs=${_build_zfs-} - -# Enable bcachefs -_bcachefs=${_bcachefs-} - -# Enable RT kernel -# Only works for CFS Scheduler and BORE Scheduler -_rtkernel=${_rtkernel-} - -# Enable NEST -# NEST is a experimental cfs scheduler you can find more about here: -# https://www.phoronix.com/news/Nest-Linux-Scheduling-Warm-Core -# https://gitlab.inria.fr/nest-public/nest-artifact/-/tree/main -# ATTENTION!:NEST is only active if you start applications with -# taskset -c $THREADS application -# example: taskset -c 0-23 application -# ATTENTION!:Just works together with the BORE Scheduler and CFS Scheduler -_nest=${_nest-} - -# Enable LATENCY NICE -# Latency nice is a approach to sets latency-nice as a per-task attribute -# It can improve the latency of applications similar to sched_nice, but focused on the latency -# You need to set the values per task -# Ananicy-cpp has a experimental implementation for this -# It converts sched_nice to latency_nice and set this per task -# You need to configure ananicy-cpp for this or use existing settings -# If you want to test it, use the following branch -# https://gitlab.com/ananicy-cpp/ananicy-cpp/-/tree/feature/latency-nice -_latency_nice=${_latency_nice-y} - -if [[ -n "$_use_llvm_lto" && -n "$_use_lto_suffix" ]]; then - pkgsuffix=${_cpusched}-lto - pkgbase=linux-$pkgsuffix +# _ _ _ _ _____ +#| |__ | | __ _ ___| | _____| | ___ _|___ / +#| '_ \| |/ _` |/ __| |/ / __| |/ / | | | |_ \ +#| |_) | | (_| | (__| <\__ \ <| |_| |___) | +#|_.__/|_|\__,_|\___|_|\_\___/_|\_\\__, |____/ +# |___/ +#Maintainer: blacksky3 <https://github.com/blacksky3> +#Credits: Jan Alexander Steffens (heftig) <heftig@archlinux.org> +#Credits: Andreas Radke <andyrtr@archlinux.org> + +################################# Arch ################################ + +ARCH=x86 + +################################# CC/CXX/HOSTCC/HOSTCXX ################################ + +#Set compiler to build the kernel +#Set '1' to build with GCC +#Set '2' to build with CLANG and LLVM +#Default is empty. It will build with GCC. To build with different compiler just use : env _compiler=(1 or 2) makepkg -s +if [ -z ${_compiler+x} ]; then + _compiler= +fi + +if [[ "$_compiler" = "1" ]]; then + _compiler=1 + BUILD_FLAGS=(CC=gcc CXX=g++ HOSTCC=gcc HOSTCXX=g++) +elif [[ "$_compiler" = "2" ]]; then + _compiler=2 + BUILD_FLAGS=(CC=clang CXX=clang++ HOSTCC=clang HOSTCXX=clang++ LD=ld.lld LLVM=1 LLVM_IAS=1) else - pkgsuffix=${_cpusched} - pkgbase=linux-$pkgsuffix + _compiler=1 + BUILD_FLAGS=(CC=gcc CXX=g++ HOSTCC=gcc HOSTCXX=g++) fi -_major=6.0 -_minor=12 -#_minorc=$((_minor+1)) -#_rcver=rc8 -pkgver=${_major}.${_minor} -_stable=${_major}.${_minor} -#_stable=${_major} -#_stablerc=${_major}-${_rcver} -_srcname=linux-${_stable} -#_srcname=linux-${_major} -pkgdesc='Linux BORE scheduler Kernel by CachyOS with other patches and improvements' + +################################################################################### + +pkgbase=linux-bore +pkgname=("$pkgbase" "$pkgbase-headers") +for _p in "${pkgname[@]}"; do + eval "package_$_p() { + $(declare -f "_package${_p#$pkgbase}") + _package${_p#$pkgbase} + }" +done +pkgver=6.3.8 +_pkgver=6.3.8 pkgrel=1 -_kernver=$pkgver-$pkgrel -arch=('x86_64' 'x86_64_v3') -url="https://github.com/CachyOS/linux-cachyos" -license=('GPL2') -options=('!strip') -makedepends=('bc' 'libelf' 'pahole' 'cpio' 'perl' 'tar' 'xz' 'zstd' 'gcc' 'gcc-libs' 'glibc' 'binutils' 'make' 'patch') -# LLVM makedepends -if [ -n "$_use_llvm_lto" ]; then - makedepends+=(clang llvm lld python) - BUILD_FLAGS=( - CC=clang - LD=ld.lld - LLVM=1 - LLVM_IAS=1 - ) +major=6.3 +commit=e7308a977d83f3cf94ed228b0f6b9b65a4d9139c +arch=(x86_64) +pkgdesc='The Linux kernel and modules with Masahito Suzuki BORE CPU scheduler and Arch patches' +url='https://www.kernel.org/' +license=(GPL2) +makedepends=(bc kmod libelf pahole cpio perl tar xz xmlto git) +makedepends+=(bison flex zstd make patch gcc gcc-libs glibc binutils) +if [[ "$_compiler" = "2" ]]; then + makedepends+=(clang llvm llvm-libs lld python) fi -# ZFS makedepends -if [ -n "$_build_zfs" ]; then - makedepends+=(git) +options=(!strip) -fi -_patchsource="https://raw.githubusercontent.com/cachyos/kernel-patches/master/${_major}" -source=( - "https://cdn.kernel.org/pub/linux/kernel/v${pkgver%%.*}.x/${_srcname}.tar.xz" - "config" "config-rt" - "auto-cpu-optimization.sh" - "${_patchsource}/all/0001-cachyos-base-all.patch") -## ZFS Support -if [ -n "$_build_zfs" ]; then - source+=("git+https://github.com/cachyos/zfs.git#commit=21bd7661334cd865d17934bebbcaf8d3356279ee") -fi -## Latency NICE Support -if [ -n "$_latency_nice" ]; then - if [[ "$_cpusched" = "bore" || "$_cpusched" = "cfs" || "$_cpusched" = "hardened" ]]; then - source+=("${_patchsource}/misc/0001-Add-latency-priority-for-CFS-class.patch") - fi -fi -## BMQ Scheduler -if [ "$_cpusched" = "bmq" ]; then - source+=("${_patchsource}/sched/0001-prjc-cachy.patch") -fi -## PDS Scheduler -if [ "$_cpusched" = "pds" ]; then - source+=("${_patchsource}/sched/0001-prjc-cachy.patch") -fi -## BORE Scheduler with latency_nice -if [ "$_cpusched" = "bore" ]; then - source+=("${_patchsource}/sched/0001-bore-cachy.patch") -## BORE SYSCTL TUNING - if [ -n "$_tune_bore" ]; then - source+=("${_patchsource}/misc/0001-bore-tuning-sysctl.patch") - fi -fi -## CacULE Scheduler -if [ "$_cpusched" = "cacule" ]; then - source+=("${_patchsource}/sched/0001-cacULE-cachy.patch") -fi -## CacULE-RDB Scheduler -if [ "$_cpusched" = "cacule-rdb" ]; then - source+=("${_patchsource}/sched/0001-cacULE-cachy.patch") -fi -## TT Scheduler -if [ "$_cpusched" = "tt" ]; then - source+=("${_patchsource}/sched/0001-tt-cachy.patch") -fi -## Hardened Patches with BORE Scheduler -if [ "$_cpusched" = "hardened" ]; then - source+=("${_patchsource}/sched/0001-bore.patch" - "${_patchsource}/misc/0001-hardened.patch") -fi -## Kernel CFI Patch -if [ -n "$_use_kcfi" ]; then - source+=("${_patchsource}/misc/0001-kcfi.patch") - depends+=(llvm-git llvm-libs-git python) - BUILD_FLAGS=( - CC=clang - LD=ld.lld - LLVM=1 - ) -fi -## NEST Support -if [ -n "$_nest" ]; then - if [[ "$_cpusched" = "bore" || "$_cpusched" = "cfs" || "$_cpusched" = "hardened" ]]; then - source+=("${_patchsource}/sched/0001-NEST.patch") - fi -fi -## bcachefs Support -if [ -n "$_bcachefs" ]; then - source+=("${_patchsource}/misc/0001-bcachefs-after-lru.patch") -fi -## rt kernel -if [ -n "$_rtkernel" ]; then - source+=("${_patchsource}/misc/0001-rt.patch") -fi +archlinuxpath=https://gitlab.archlinux.org/archlinux/packaging/packages/linux/-/raw/$commit +patchpath=https://raw.githubusercontent.com/blacksky3/patches/main/$major +patchpathbore=https://raw.githubusercontent.com/blacksky3/patches/main/ + +source=(https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-$_pkgver.tar.xz + ${archlinuxpath}/config + # PRJC patch + 0001-linux6.1.y-bore2.4.0.patch + 0002-constgran-vanilla-max.patch + # Arch patches + 0001-ZEN-Add-sysctl-and-CONFIG-to-disallow-unprivileged-C.patch) -export KBUILD_BUILD_HOST=cachyos +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 ${srcdir}/$_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..." - if [ -n "$_rtkernel" ]; then - cp ../config-rt .config - else - cp ../config .config - fi - - ### Select CPU optimization - if [ -n "$_processor_opt" ]; then - MARCH=$(echo $_processor_opt|tr '[:lower:]' '[:upper:]'&&echo) - MARCH2=M${MARCH} - scripts/config -k --disable CONFIG_GENERIC_CPU - scripts/config -k --enable CONFIG_${MARCH2} - fi - - ### Use autooptimization - if [ -n "$_use_auto_optimization" ]; then - "${srcdir}"/auto-cpu-optimization.sh - fi - - ### Selecting CachyOS config - if [ "$_cachy_config" = "yes" ]; then - echo "Enabling CachyOS config..." - scripts/config --enable CACHY - elif [ "$_cachy_config" = "no" ]; then - echo "Disabling CachyOS config..." - scripts/config --disable CACHY - else - if [ -n "$_cachy_config" ]; then - error "The value $_cachy_config is invalid. Choose the correct one again." - else - error "The value is empty. Choose the correct one again." - fi - error "Selecting CachyOS config failed!" - exit - fi - - ### Selecting proper RT config - if [ -n "$_rtkernel" ]; then - echo "Setting proper RT config" - scripts/config --enable RCU_NOCB_CPU_CB_BOOST \ - --disable RCU_NOCB_CPU_DEFAULT_ALL \ - --enable HZ_1000 \ - --set-val HZ 1000 \ - --enable PREEMPT_RT \ - --enable PREEMPT_LAZY - fi - - ### Selecting the CPU scheduler - if [ "$_cpusched" = "bmq" ]; then - echo "Selecting BMQ CPU scheduler..." - scripts/config --enable SCHED_ALT \ - --enable SCHED_BMQ \ - --disable SCHED_PDS - elif [ "$_cpusched" = "pds" ]; then - echo "Selecting PDS CPU scheduler..." - scripts/config --enable SCHED_ALT \ - --disable SCHED_BMQ \ - --enable SCHED_PDS - elif [ "$_cpusched" = "cacule" ]; then - echo "Selecting CacULE scheduler..." - scripts/config --enable CACULE_SCHED \ - --disable CACULE_RDB - elif [ "$_cpusched" = "cacule-rdb" ]; then - echo "Selecting CacULE-RDB scheduler..." - scripts/config --enable CACULE_SCHED \ - --enable CACULE_RDB \ - --set-val RDB_INTERVAL 19 - elif [ "$_cpusched" = "bore" ]; then - echo "Selecting BORE Scheduler..." - scripts/config --enable SCHED_BORE - elif [ "$_cpusched" = "tt" ]; then - echo "Selecting TT Scheduler..." - scripts/config --enable TT_SCHED \ - --enable TT_ACCOUNTING_STATS - elif [ "$_cpusched" = "cfs" ]; then - echo "Selecting Completely Fair Scheduler..." - elif [ "$_cpusched" = "hardened" ]; then - echo "Selecting hardened patches with the BORE Scheduler..." - else - if [ -n "$_cpusched" ]; then - error "The value $_cpusched is invalid. Choose the correct one again." - else - error "The value is empty. Choose the correct one again." - fi - error "Selecting the CPU scheduler failed!" - exit - fi - - ### Enable KCFI - if [ -n "$_use_kcfi" ]; then - echo "Enabling kCFI" - scripts/config --enable ARCH_SUPPORTS_CFI_CLANG \ - --enable CFI_CLANG - fi - - ### Select LLVM level - if [ "$_use_llvm_lto" = "thin" ]; then - echo "Enabling LLVM THIN LTO..." - scripts/config --enable LTO \ - --enable LTO_CLANG \ - --enable ARCH_SUPPORTS_LTO_CLANG \ - --enable ARCH_SUPPORTS_LTO_CLANG_THIN \ - --disable LTO_NONE \ - --enable HAS_LTO_CLANG \ - --disable LTO_CLANG_FULL \ - --enable LTO_CLANG_THIN \ - --enable HAVE_GCC_PLUGINS - elif [ "$_use_llvm_lto" = "full" ]; then - echo "Enabling LLVM FULL LTO..." - scripts/config --enable LTO \ - --enable LTO_CLANG \ - --enable ARCH_SUPPORTS_LTO_CLANG \ - --enable ARCH_SUPPORTS_LTO_CLANG_THIN \ - --disable LTO_NONE \ - --enable HAS_LTO_CLANG \ - --enable LTO_CLANG_FULL \ - --disable LTO_CLANG_THIN \ - --enable HAVE_GCC_PLUGINS - else - scripts/config --enable LTO_NONE - fi - - ### Select tick rate - if [ "$_HZ_ticks" = "1000" ]; then - echo "Setting tick rate to 1k Hz..." - scripts/config --disable HZ_300 \ - --enable HZ_1000 \ - --set-val HZ 1000 - elif [ "$_HZ_ticks" = "750" ]; then - echo "Setting tick rate to 750Hz..." - scripts/config --disable HZ_300 \ - --enable HZ_750 \ - --set-val HZ 750 - elif [ "$_HZ_ticks" = "600" ]; then - echo "Setting tick rate to 600Hz..." - scripts/config --disable HZ_300 \ - --enable HZ_600 \ - --set-val HZ 600 - elif [ "$_HZ_ticks" = "500" ]; then - echo "Setting tick rate to 500Hz..." - scripts/config --disable HZ_300 \ - --enable HZ_500 \ - --set-val HZ 500 - elif [ "$_HZ_ticks" = "300" ]; then - echo "Setting tick rate to 300Hz..." - scripts/config --enable HZ_300 \ - --set-val HZ 300 - elif [ "$_HZ_ticks" = "250" ]; then - echo "Setting tick rate to 250Hz..." - scripts/config --disable HZ_300 \ - --enable HZ_250 \ - --set-val HZ 250 - elif [ "$_HZ_ticks" = "100" ]; then - echo "Setting tick rate to 100Hz..." - scripts/config --disable HZ_300 \ - --enable HZ_100 \ - --set-val HZ 100 - else - if [ -n "$_HZ_ticks" ]; then - error "The value $_HZ_ticks is invalid. Choose the correct one again." - else - error "The value is empty. Choose the correct one again." - fi - error "Selecting Setting tick rate failed!" - exit - fi - - ### Disable NUMA - if [ -n "$_NUMAdisable" ]; then - echo "Disabling NUMA from kernel config..." - scripts/config --disable NUMA \ - --disable AMD_NUMA \ - --disable X86_64_ACPI_NUMA \ - --disable NODES_SPAN_OTHER_NODES \ - --disable NUMA_EMU \ - --disable NEED_MULTIPLE_NODES \ - --disable USE_PERCPU_NUMA_NODE_ID \ - --disable ACPI_NUMA \ - --disable ARCH_SUPPORTS_NUMA_BALANCING \ - --disable NODES_SHIFT \ - --undefine NODES_SHIFT \ - --disable NEED_MULTIPLE_NODES - fi - - ### Setting NR_CPUS - if [ -n "$_nr_cpus" ]; then - echo "Setting custom NR_CPUS..." - scripts/config --set-val NR_CPUS "$_nr_cpus" - else - echo "Setting default NR_CPUS..." - scripts/config --set-val NR_CPUS 128 - fi - - ### Disable MQ Deadline I/O scheduler - if [ -n "$_mq_deadline_disable" ]; then - echo "Disabling MQ-Deadline I/O scheduler..." - scripts/config --disable MQ_IOSCHED_DEADLINE - fi - - ### Disable Kyber I/O scheduler - if [ -n "$_kyber_disable" ]; then - echo "Disabling Kyber I/O scheduler..." - scripts/config --disable MQ_IOSCHED_KYBER - fi - - ### Select performance governor - if [ -n "$_per_gov" ]; then - echo "Setting performance governor..." - scripts/config --disable CPU_FREQ_DEFAULT_GOV_SCHEDUTIL \ - --enable CPU_FREQ_DEFAULT_GOV_PERFORMANCE - fi - - ### Select tick type - if [ "$_tickrate" = "periodic" ]; then - echo "Enabling periodic ticks..." - scripts/config --disable NO_HZ_IDLE \ - --disable NO_HZ_FULL \ - --disable NO_HZ \ - --disable NO_HZ_COMMON \ - --enable HZ_PERIODIC - elif [ "$_tickrate" = "idle" ]; then - echo "Enabling idle ticks.." - scripts/config --disable HZ_PERIODIC \ - --disable NO_HZ_FULL \ - --enable NO_HZ_IDLE \ - --enable NO_HZ \ - --enable NO_HZ_COMMON - elif [ "$_tickrate" = "full" ]; then - echo "Enabling full ticks..." - scripts/config --disable HZ_PERIODIC \ - --disable NO_HZ_IDLE \ - --disable CONTEXT_TRACKING_FORCE \ - --enable NO_HZ_FULL_NODEF \ - --enable NO_HZ_FULL \ - --enable NO_HZ \ - --enable NO_HZ_COMMON \ - --enable CONTEXT_TRACKING - else - if [ -n "$_tickrate" ]; then - error "The value $_tickrate is invalid. Choose the correct one again." - else - error "The value is empty. Choose the correct one again." - fi - error "Selecting the tick rate failed!" - exit - fi - - ### Select preempt type - if [ "$_preempt" = "full" ]; then - echo "Enabling low latency preempt..." - scripts/config --enable PREEMPT_BUILD \ - --disable PREEMPT_NONE \ - --disable PREEMPT_VOLUNTARY \ - --enable PREEMPT \ - --enable PREEMPT_COUNT \ - --enable PREEMPTION \ - --enable PREEMPT_DYNAMIC - elif [ "$_preempt" = "voluntary" ]; then - echo "Enabling voluntary preempt..." - scripts/config --enable PREEMPT_BUILD \ - --disable PREEMPT_NONE \ - --enable PREEMPT_VOLUNTARY \ - --disable PREEMPT \ - --enable PREEMPT_COUNT \ - --enable PREEMPTION \ - --disable PREEMPT_DYNAMIC - elif [ "$_preempt" = "server" ]; then - echo "Enabling server preempt..." - scripts/config --enable PREEMPT_NONE_BUILD \ - --enable PREEMPT_NONE \ - --disable PREEMPT_VOLUNTARY \ - --disable PREEMPT \ - --disable PREEMPT_COUNT \ - --disable PREEMPTION \ - --disable PREEMPT_DYNAMIC - else - if [ -n "$_preempt" ]; then - error "The value $_preempt is invalid. Choose the correct one again." - else - error "The value is empty. Choose the correct one again." - fi - error "Selecting PREEMPT failed!" - exit - fi - - ### Enable O3 - if [ -n "$_cc_harder" ]; then - echo "Enabling KBUILD_CFLAGS -O3..." - scripts/config --disable CC_OPTIMIZE_FOR_PERFORMANCE \ - --enable CC_OPTIMIZE_FOR_PERFORMANCE_O3 - fi - - ### Enable bbr2 - if [ -n "$_tcp_bbr2" ]; then - echo "Disabling TCP_CONG_CUBIC..." - scripts/config --module TCP_CONG_CUBIC \ - --disable DEFAULT_CUBIC \ - --enable TCP_CONG_BBR2 \ - --enable DEFAULT_BBR2 \ - --set-str DEFAULT_TCP_CONG bbr2 - fi - - ### Select LRU config - if [ "$_lru_config" = "standard" ]; then - echo "Enabling multigenerational LRU..." - scripts/config --enable LRU_GEN \ - --enable LRU_GEN_ENABLED \ - --disable LRU_GEN_STATS - elif [ "$_lru_config" = "stats" ]; then - echo "Enabling multigenerational LRU with stats..." - scripts/config --enable LRU_GEN \ - --enable LRU_GEN_ENABLED \ - --enable LRU_GEN_STATS - elif [ "$_lru_config" = "none" ]; then - echo "Disabling multigenerational LRU..." - scripts/config --disable LRU_GEN - else - if [ -n "$_lru_config" ]; then - error "The value $_lru_config is invalid. Choose the correct one again." - else - error "The value is empty. Choose the correct one again." - fi - error "Enabling multigenerational LRU failed!" - exit - fi - - ### Enable DAMON - if [ -n "$_damon" ]; then - echo "Enabling DAMON..." - scripts/config --enable DAMON \ - --enable DAMON_VADDR \ - --enable DAMON_DBGFS \ - --enable DAMON_SYSFS \ - --enable DAMON_PADDR \ - --enable DAMON_RECLAIM \ - --enable DAMON_LRU_SORT - fi - - ### Enable LRNG - if [ -n "$_lrng_enable" ]; then - echo "Enabling Linux Random Number Generator ..." - scripts/config --disable RANDOM_DEFAULT_IMPL \ - --enable LRNG \ - --enable LRNG_SHA256 \ - --enable LRNG_COMMON_DEV_IF \ - --enable LRNG_DRNG_ATOMIC \ - --enable LRNG_SYSCTL \ - --enable LRNG_RANDOM_IF \ - --enable LRNG_AIS2031_NTG1_SEEDING_STRATEGY \ - --module LRNG_KCAPI_IF \ - --module LRNG_HWRAND_IF \ - --enable LRNG_DEV_IF \ - --enable LRNG_RUNTIME_ES_CONFIG \ - --enable LRNG_IRQ_DFLT_TIMER_ES \ - --disable LRNG_SCHED_DFLT_TIMER_ES \ - --enable LRNG_TIMER_COMMON \ - --disable LRNG_COLLECTION_SIZE_256 \ - --disable LRNG_COLLECTION_SIZE_512 \ - --enable LRNG_COLLECTION_SIZE_1024 \ - --disable LRNG_COLLECTION_SIZE_2048 \ - --disable LRNG_COLLECTION_SIZE_4096 \ - --disable LRNG_COLLECTION_SIZE_8192 \ - --set-val LRNG_COLLECTION_SIZE 1024 \ - --enable LRNG_HEALTH_TESTS \ - --set-val LRNG_RCT_CUTOFF 31 \ - --set-val LRNG_APT_CUTOFF 325 \ - --enable LRNG_IRQ \ - --enable LRNG_CONTINUOUS_COMPRESSION_ENABLED \ - --disable LRNG_CONTINUOUS_COMPRESSION_DISABLED \ - --enable LRNG_ENABLE_CONTINUOUS_COMPRESSION \ - --enable LRNG_SWITCHABLE_CONTINUOUS_COMPRESSION \ - --set-val LRNG_IRQ_ENTROPY_RATE 256 \ - --enable LRNG_JENT \ - --set-val LRNG_JENT_ENTROPY_RATE 16 \ - --enable LRNG_CPU \ - --set-val LRNG_CPU_FULL_ENT_MULTIPLIER 1 \ - --set-val LRNG_CPU_ENTROPY_RATE 8 \ - --enable LRNG_SCHED \ - --set-val LRNG_SCHED_ENTROPY_RATE 4294967295 \ - --enable LRNG_DRNG_CHACHA20 \ - --module LRNG_DRBG \ - --module LRNG_DRNG_KCAPI \ - --enable LRNG_SWITCH \ - --enable LRNG_SWITCH_HASH \ - --module LRNG_HASH_KCAPI \ - --enable LRNG_SWITCH_DRNG \ - --module LRNG_SWITCH_DRBG \ - --module LRNG_SWITCH_DRNG_KCAPI \ - --enable LRNG_DFLT_DRNG_CHACHA20 \ - --disable LRNG_DFLT_DRNG_DRBG \ - --disable LRNG_DFLT_DRNG_KCAPI \ - --enable LRNG_TESTING_MENU \ - --disable LRNG_RAW_HIRES_ENTROPY \ - --disable LRNG_RAW_JIFFIES_ENTROPY \ - --disable LRNG_RAW_IRQ_ENTROPY \ - --disable LRNG_RAW_RETIP_ENTROPY \ - --disable LRNG_RAW_REGS_ENTROPY \ - --disable LRNG_RAW_ARRAY \ - --disable LRNG_IRQ_PERF \ - --disable LRNG_RAW_SCHED_HIRES_ENTROPY \ - --disable LRNG_RAW_SCHED_PID_ENTROPY \ - --disable LRNG_RAW_SCHED_START_TIME_ENTROPY \ - --disable LRNG_RAW_SCHED_NVCSW_ENTROPY \ - --disable LRNG_SCHED_PERF \ - --disable LRNG_ACVT_HASH \ - --disable LRNG_RUNTIME_MAX_WO_RESEED_CONFIG \ - --disable LRNG_TEST_CPU_ES_COMPRESSION \ - --enable LRNG_SELFTEST \ - --disable LRNG_SELFTEST_PANIC \ - --disable LRNG_RUNTIME_FORCE_SEEDING_DISABLE - fi - - ### Enable zram/zswap ZSTD compression - if [ -n "$_zstd_compression" ]; then - echo "Enabling zram/swap ZSTD compression..." - scripts/config --disable ZRAM_DEF_COMP_LZORLE \ - --enable ZRAM_DEF_COMP_ZSTD \ - --set-str ZRAM_DEF_COMP zstd \ - --disable ZSWAP_COMPRESSOR_DEFAULT_LZ4 \ - --enable ZSWAP_COMPRESSOR_DEFAULT_ZSTD \ - --set-str ZSWAP_COMPRESSOR_DEFAULT zstd - fi - - ### Selecting the ZSTD modules and kernel compression level - if [ "$_zstd_level_value" = "ultra" ]; then - echo "Enabling highest ZSTD modules and kernel compression ratio..." - scripts/config --set-val MODULE_COMPRESS_ZSTD_LEVEL 19 \ - --enable MODULE_COMPRESS_ZSTD_ULTRA \ - --set-val MODULE_COMPRESS_ZSTD_LEVEL_ULTRA 22 \ - --set-val ZSTD_COMP_VAL 22 - elif [ "$_zstd_level_value" = "normal" ]; then - echo "Enabling standard ZSTD modules and kernel compression ratio..." - scripts/config --set-val MODULE_COMPRESS_ZSTD_LEVEL 9 \ - --disable MODULE_COMPRESS_ZSTD_ULTRA \ - --set-val ZSTD_COMP_VAL 19 - else - if [ -n "$_zstd_level_value" ]; then - error "The value $_zstd_level_value is invalid. Choose the correct one again." - else - error "The value is empty. Choose the correct one again." - fi - error "Selecting the ZSTD modules and kernel compression level failed!" - exit - fi - - ### Disable DEBUG - if [ -n "$_disable_debug" ]; then - scripts/config --disable DEBUG_INFO \ - --disable DEBUG_INFO_BTF \ - --disable DEBUG_INFO_DWARF4 \ - --disable DEBUG_INFO_DWARF5 \ - --disable PAHOLE_HAS_SPLIT_BTF \ - --disable DEBUG_INFO_BTF_MODULES \ - --disable SLUB_DEBUG \ - --disable PM_DEBUG \ - --disable PM_ADVANCED_DEBUG \ - --disable PM_SLEEP_DEBUG \ - --disable ACPI_DEBUG \ - --disable SCHED_DEBUG \ - --disable LATENCYTOP \ - --disable DEBUG_PREEMPT - fi - - echo "Enable USER_NS_UNPRIVILEGED" - scripts/config --enable USER_NS - echo "Enable WINE FASTSYNC" - scripts/config --enable WINESYNC - - ### Optionally use running kernel's config - # code originally by nous; http://aur.archlinux.org/packages.php?ID=40191 - if [ -n "$_use_current" ]; then - if [[ -s /proc/config.gz ]]; then - echo "Extracting config from /proc/config.gz..." - # modprobe configs - zcat /proc/config.gz > ./.config - else - warning "Your kernel was not compiled with IKPROC!" - warning "You cannot read the current config!" - warning "Aborting!" - exit - fi - fi - - - ### Optionally load needed modules for the make localmodconfig - # See https://aur.archlinux.org/packages/modprobed-db - if [ -n "$_localmodcfg" ]; then - if [ -e $HOME/.config/modprobed.db ]; then - echo "Running Steven Rostedt's make localmodconfig now" - make ${BUILD_FLAGS[*]} LSMOD=$HOME/.config/modprobed.db localmodconfig - else - echo "No modprobed.db data found" - exit - fi - fi - - ### Rewrite configuration - echo "Rewrite configuration..." - make ${BUILD_FLAGS[*]} prepare - yes "" | make ${BUILD_FLAGS[*]} config >/dev/null - diff -u ../config .config || : - - ### Prepared version - make ${BUILD_FLAGS[*]} -s kernelrelease > version - echo "Prepared $pkgbase version $(<version)" - - ### Running make nconfig - [[ -z "$_makenconfig" ]] || make ${BUILD_FLAGS[*]} nconfig - - ### Running make menuconfig - [[ -z "$_makemenuconfig" ]] || make ${BUILD_FLAGS[*]} menuconfig - - ### Running make xconfig - [[ -z "$_makexconfig" ]] || make ${BUILD_FLAGS[*]} xconfig - - ### Running make gconfig - [[ -z "$_makegconfig" ]] || make ${BUILD_FLAGS[*]} gconfig - - ### Save configuration for later reuse - echo "Save configuration for later reuse..." - cat .config > "${startdir}/config-${pkgver}-${pkgrel}${pkgbase#linux}" +prepare(){ + cd ${srcdir}/linux-$_pkgver -} + local src + for src in "${source[@]}"; do + src="${src%%::*}" + src="${src##*/}" + [[ $src = *.patch ]] || continue + msg2 "Applying patch $src..." + patch -Np1 < "../$src" + done -build() { - cd ${srcdir}/${_srcname} - make ${BUILD_FLAGS[*]} -j$(nproc) all - - if [ -n "$_build_zfs" ]; then - cd ${srcdir}/"zfs" - - if [ -n "$_use_llvm_lto" ]; then - ./autogen.sh - sed -i "s|\$(uname -r)|${pkgver}-${pkgsuffix}|g" configure - ./configure KERNEL_LLVM=1 --prefix=/usr --sysconfdir=/etc --sbindir=/usr/bin --libdir=/usr/lib \ - --datadir=/usr/share --includedir=/usr/include --with-udevdir=/lib/udev \ - --libexecdir=/usr/lib/zfs --with-config=kernel \ - --with-linux=${srcdir}/$_srcname - else - ./autogen.sh - sed -i "s|\$(uname -r)|${pkgver}-${pkgsuffix}|g" configure - ./configure --prefix=/usr --sysconfdir=/etc --sbindir=/usr/bin --libdir=/usr/lib \ - --datadir=/usr/share --includedir=/usr/include --with-udevdir=/lib/udev \ - --libexecdir=/usr/lib/zfs --with-config=kernel \ - --with-linux=${srcdir}/$_srcname - fi - make ${BUILD_FLAGS[*]} - fi -} + plain "" -_package() { - pkgdesc="The $pkgdesc kernel and modules" - depends=('coreutils' 'kmod' 'initramfs') - optdepends=('wireless-regdb: to set the correct wireless channels of your country' - 'linux-firmware: firmware images needed for some devices' - 'modprobed-db: Keeps track of EVERY kernel module that has ever been probed - useful for those of us who make localmodconfig' - 'uksmd: Userspace KSM helper daemon') - provides=(VIRTUALBOX-GUEST-MODULES WIREGUARD-MODULE KSMBD-MODULE UKSMD-BUILTIN) + # Copy the config file first + # Copy "${srcdir}"/config to "${srcdir}"/linux-${_pkgver}/.config + msg2 "Copy "${srcdir}"/config to "${srcdir}"/linux-$_pkgver/.config" + cp "${srcdir}"/config .config - cd ${srcdir}/$_srcname + sleep 2s - local kernver="$(<version)" - local modulesdir="$pkgdir/usr/lib/modules/$kernver" + plain "" - 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" + # Remove gcc-plugin if gcc version = 13.0.0 + if [[ "$_gccversion" = "13.0.0" ]]; then - # Used by mkinitcpio to name the kernel - echo "$pkgbase" | install -Dm644 /dev/stdin "$modulesdir/pkgbase" + msg2 "Remove GCC_PLUGINS" + scripts/config --disable CONFIG_HAVE_GCC_PLUGINS + scripts/config --disable CONFIG_GCC_PLUGINS - echo "Installing modules..." - make INSTALL_MOD_PATH="$pkgdir/usr" INSTALL_MOD_STRIP=1 \ - DEPMOD=/doesnt/exist modules_install # Suppress depmod + sleep 2s + plain "" + fi - # remove build and source links - rm "$modulesdir"/{source,build} -} + # Set LTO with CLANG/LLVM + if [[ "$_compiler" = "2" ]]; then + + msg2 "Enable THIN LTO" + scripts/config --enable CONFIG_LTO + scripts/config --enable CONFIG_LTO_CLANG + scripts/config --enable CONFIG_ARCH_SUPPORTS_LTO_CLANG + scripts/config --enable CONFIG_ARCH_SUPPORTS_LTO_CLANG_THIN + scripts/config --disable CONFIG_LTO_NONE + scripts/config --enable CONFIG_HAS_LTO_CLANG + scripts/config --disable CONFIG_LTO_CLANG_FULL + scripts/config --enable CONFIG_LTO_CLANG_THIN + scripts/config --enable CONFIG_HAVE_GCC_PLUGINS + + #msg2 "Enable FULL LTO" + #scripts/config --enable CONFIG_LTO + #scripts/config --enable CONFIG_LTO_CLANG + #scripts/config --enable CONFIG_ARCH_SUPPORTS_LTO_CLANG + #scripts/config --enable CONFIG_ARCH_SUPPORTS_LTO_CLANG_THIN + #scripts/config --disable CONFIG_LTO_NONE + #scripts/config --enable CONFIG_HAS_LTO_CLANG + #scripts/config --enable CONFIG_LTO_CLANG_FULL + #scripts/config --disable CONFIG_LTO_CLANG_THIN + #scripts/config --enable CONFIG_HAVE_GCC_PLUGINS + + #msg2 "Disable LTO" + #scripts/config --enable CONFIG_LTO_NONE -_package-headers() { - pkgdesc="Headers and scripts for building modules for the $pkgdesc kernel" - depends=('pahole' linux-${pkgsuffix} ) - - cd ${srcdir}/${_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 - - # required when STACK_VALIDATION is enabled - install -Dt "$builddir/tools/objtool" tools/objtool/objtool - - # required when DEBUG_INFO_BTF_MODULES is enabled - if [ -f tools/bpf/resolve_btfids/resolve_btfids ]; then - install -Dt "$builddir/tools/bpf/resolve_btfids" tools/bpf/resolve_btfids/resolve_btfids - fi - - 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 - - # https://bugs.archlinux.org/task/13146 - install -Dt "$builddir/drivers/media/i2c" -m644 drivers/media/i2c/msp3400-driver.h - - # https://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 - - # https://bugs.archlinux.org/task/71392 - install -Dt "$builddir/drivers/iio/common/hid-sensors" -m644 drivers/iio/common/hid-sensors/*.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 -Sib "$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 "Stripping vmlinux..." - strip -v $STRIP_STATIC "$builddir/vmlinux" - - echo "Adding symlink..." - mkdir -p "$pkgdir/usr/src" - ln -sr "$builddir" "$pkgdir/usr/src/$pkgbase" + sleep 2s + plain "" + fi + + msg "Apply some Archlinux config" + + msg2 "Compress modules by default (following Arch's kernel)" + scripts/config --enable CONFIG_MODULE_COMPRESS_ZSTD + + sleep 2s + + msg2 "CONFIG_STACK_VALIDATION gives better stack traces. Also is enabled in all official kernel packages by Archlinux team" + scripts/config --enable CONFIG_STACK_VALIDATION + + sleep 2s + + msg2 "Enable IKCONFIG following Arch's philosophy" + scripts/config --enable CONFIG_IKCONFIG + scripts/config --enable CONFIG_IKCONFIG_PROC + + sleep 2s + + msg2 "Enable FUNCTION_TRACER/GRAPH_TRACER" + scripts/config --enable CONFIG_FUNCTION_TRACER + scripts/config --enable CONFIG_STACK_TRACER + + sleep 2s + + msg2 "Enable CONFIG_USER_NS_UNPRIVILEGED" + scripts/config --enable CONFIG_USER_NS + + sleep 2s + + msg "Patch addition config" + + msg2 "Enable BORE CPU scheduler" + scripts/config --enable CONFIG_SCHED_BORE + + sleep 2s + + plain "" + + msg2 "Supress depmod" + sed -i '2iexit 0' scripts/depmod.sh + + sleep 2s + + plain "" + + # Setting localversion + msg2 "Setting localversion..." + # --save-scmversion as been removed in upstream + # https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/scripts/setlocalversion?h=v6.3-rc1&id=f6e09b07cc12a4d104bb19fe7566b0636f60c413 + # scripts/setlocalversion --save-scmversion + echo "-${pkgbase}" > localversion + + plain "" + + # Config + if [[ "$_compiler" = "1" ]]; then + make ARCH=${ARCH} ${BUILD_FLAGS[*]} olddefconfig + elif [[ "$_compiler" = "2" ]]; then + make ARCH=${ARCH} ${BUILD_FLAGS[*]} olddefconfig + fi + + plain "" + + make -s kernelrelease > version + msg2 "Prepared $pkgbase version $(<version)" + + plain "" } -_package-zfs(){ - pkgdesc="zfs module for the $pkgdesc kernel" - depends=('pahole' linux-$pkgsuffix=$_kernver) +build(){ + cd ${srcdir}/linux-$_pkgver - cd ${srcdir}/"zfs" - install -dm755 "$pkgdir/usr/lib/modules/${_kernver}-${pkgsuffix}" - install -m644 module/*/*.ko "$pkgdir/usr/lib/modules/${_kernver}-${pkgsuffix}" - find "$pkgdir" -name '*.ko' -exec zstd --rm -10 {} + - # sed -i -e "s/EXTRAMODULES='.*'/EXTRAMODULES='${pkgver}-${pkgbase}'/" "$startdir/zfs.install" + # make -j$(nproc) all + msg2 "make -j$(nproc) all..." + if [[ "$_compiler" = "1" ]]; then + make ARCH=${ARCH} ${BUILD_FLAGS[*]} -j$(nproc) all + elif [[ "$_compiler" = "2" ]]; then + make ARCH=${ARCH} ${BUILD_FLAGS[*]} -j$(nproc) all + fi } -pkgname=("$pkgbase" "$pkgbase-headers") -if [ -n "$_build_zfs" ]; then - pkgname+=("$pkgbase-zfs") -fi -for _p in "${pkgname[@]}"; do - eval "package_$_p() { - $(declare -f "_package${_p#$pkgbase}") - _package${_p#$pkgbase} - }" -done +_package(){ + pkgdesc='The Linux kernel and modules with Masahito Suzuki BORE CPU scheduler and Arch patches' + depends=(coreutils kmod initramfs) + optdepends=('wireless-regdb: to set the correct wireless channels of your country' + 'linux-firmware: firmware images needed for some devices') + provides=(VIRTUALBOX-GUEST-MODULES WIREGUARD-MODULE KSMBD-MODULE) + replaces=(virtualbox-guest-modules-arch wireguard-arch) + + cd ${srcdir}/linux-$_pkgver + + 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 arch/${ARCH}/boot/bzImage "$modulesdir/vmlinuz" + 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..." + if [[ "$_compiler" = "1" ]]; then + make ARCH=${ARCH} ${BUILD_FLAGS[*]} INSTALL_MOD_PATH="${pkgdir}"/usr INSTALL_MOD_STRIP=1 -j$(nproc) modules_install + elif [[ "$_compiler" = "2" ]]; then + make ARCH=${ARCH} ${BUILD_FLAGS[*]} INSTALL_MOD_PATH="${pkgdir}"/usr INSTALL_MOD_STRIP=1 -j$(nproc) modules_install + fi + + # remove build and source links + msg2 "Remove build dir and source dir..." + rm -rf "$modulesdir"/{source,build} +} + +_package-headers(){ + pkgdesc="Headers and scripts for building modules for the $pkgbase package" + depends=("${pkgbase}" pahole) + + cd ${srcdir}/linux-$_pkgver + + 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 + + # required when STACK_VALIDATION is enabled + install -Dt "$builddir/tools/objtool" tools/objtool/objtool + + # required when DEBUG_INFO_BTF_MODULES is enabled + if [ -f tools/bpf/resolve_btfids/resolve_btfids ]; then + install -Dt "$builddir/tools/bpf/resolve_btfids" tools/bpf/resolve_btfids/resolve_btfids + fi + + 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 + + # https://bugs.archlinux.org/task/13146 + install -Dt "$builddir/drivers/media/i2c" -m644 drivers/media/i2c/msp3400-driver.h + + # https://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 + + # https://bugs.archlinux.org/task/71392 + install -Dt "$builddir/drivers/iio/common/hid-sensors" -m644 drivers/iio/common/hid-sensors/*.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 + msg2 "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 -Sib "$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 "Stripping vmlinux..." + strip -v $STRIP_STATIC "$builddir/vmlinux" + + msg2 "Adding symlink..." + mkdir -p "$pkgdir/usr/src" + ln -sr "$builddir" "$pkgdir/usr/src/$pkgbase" +} -sha256sums=('89b730edf8942b49e02f9894244205886c9a214d629b35b88c4ff06ee9304f01' - '5ef4000fa382d718bc88a2c898534c94349bc38125fb0a5e6f90987c64338bc2' - '8e3332029a7e6574b8c5d1f98e5391a20871b889e0a65fc351584c26b9e2b0ef' - 'e1d45b5842079a5f0f53d7ea2d66ffa3f1497766f3ccffcf13ed00f1ac67f95e' - 'e56d2483f4abf9a6c935d3bd37d9b5892024daff957f58bc96eec23bfb181d8a' - '8a29fd18c2deb36cf0bbfb16a84819d86fa476ef4792d07dd627c945c0b55f4b' - '4b135afcb13e2a852048e99ee96f74eb4ba785039a447b43d3e87e03494e29d7') +sha256sums=('4323d421250e2e444c35d36f4aa8ddb56591dedc25c68d359d19c4ef9dd20955' + '6508516de94ed941ae755d89807610dc51fe1229dbfecdf8a82604a8d33242ce' + 'e788c1d25df2ffa710c3be4786dd477a82e8271d2950ddca89b56957035b4a5f' + '466d7231d2bba65edb53da48e0ec444499e4ba526e9067b517fb78bf09973486' + 'd4edb692d0a1772af639730d898282e92a3c06acc46e5a55429315b2a5763e82') |