summarylogtreecommitdiffstats
diff options
context:
space:
mode:
authorblacksky32023-06-16 21:17:33 -0400
committerblacksky32023-06-16 21:17:33 -0400
commitc868798400bd86626be05c35f28efcaf8bed5af8 (patch)
tree5f3e1036ac7637a2a978242c5d3b0cdb0eb7fc8c
parente4386cd337ea2cd13074c671711de775d296f1b4 (diff)
downloadaur-c868798400bd86626be05c35f28efcaf8bed5af8.tar.gz
initial rework
-rw-r--r--.SRCINFO55
-rw-r--r--0001-ZEN-Add-sysctl-and-CONFIG-to-disallow-unprivileged-C.patch154
-rw-r--r--0001-linux6.1.y-bore2.4.0.patch421
-rw-r--r--0002-constgran-vanilla-max.patch86
-rw-r--r--PKGBUILD1312
5 files changed, 1003 insertions, 1025 deletions
diff --git a/.SRCINFO b/.SRCINFO
index 761a5bbeea7a..200cde45e516 100644
--- a/.SRCINFO
+++ b/.SRCINFO
@@ -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
+
diff --git a/PKGBUILD b/PKGBUILD
index c90e64052d68..e14e27280e1d 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -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')