From 3196e797c9c96dfdaa4225fb7aca8480c7e491ae Mon Sep 17 00:00:00 2001 From: Tk-Glitch Date: Tue, 2 Nov 2021 12:25:08 +0100 Subject: [PATCH] linux515-tkg: Update Project C patchset to v5.15-r0 - https://gitlab.com/alfredchen/projectc/-/blob/master/5.15/prjc_v5.15-r0.patch --- PKGBUILD | 4 +- .../5.15/0009-prjc_v5.15-r0.patch | 268 +++++++++--------- 2 files changed, 141 insertions(+), 131 deletions(-) diff --git a/PKGBUILD b/PKGBUILD index 26c7830..db095bb 100644 --- a/PKGBUILD +++ b/PKGBUILD @@ -59,7 +59,7 @@ else fi pkgname=("${pkgbase}" "${pkgbase}-headers") pkgver="${_basekernel}"."${_sub}" -pkgrel=211 +pkgrel=212 pkgdesc='Linux-tkg' arch=('x86_64') # no i686 in here url="http://www.kernel.org/" @@ -649,7 +649,7 @@ case $_basever in '034d12a73b507133da2c69a34d61efd2f6b6618549650aa26d748142d22002e1' '9fad4a40449e09522899955762c8928ae17f4cdaa16e01239fd12592e9d58177' 'a557b342111849a5f920bbe1c129f3ff1fc1eff62c6bd6685e0972fc88e39911' - 'f215a286490071d6f870dda89677236123d84b3eede51bdb2b516e33ad219d86' + 'decd4a55c0d47b1eb808733490cdfea1207a2022d46f06d04a3cc60fdcb3f32c' '1aa0a172e1e27fb8171053f3047dcf4a61bd2eda5ea18f02b2bb391741a69887' '1b656ad96004f27e9dc63d7f430b50d5c48510d6d4cd595a81c24b21adb70313' 'b0319a7dff9c48b2f3e3d3597ee154bf92223149a633a8b7ce4026252db86da6') diff --git a/linux-tkg-patches/5.15/0009-prjc_v5.15-r0.patch b/linux-tkg-patches/5.15/0009-prjc_v5.15-r0.patch index a2e5fd9..1d0c322 100644 --- a/linux-tkg-patches/5.15/0009-prjc_v5.15-r0.patch +++ b/linux-tkg-patches/5.15/0009-prjc_v5.15-r0.patch @@ -1,10 +1,10 @@ diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt -index bdb22006f713..d755d7df632f 100644 +index 43dc35fe5bc0..0873e92ca5d0 100644 --- a/Documentation/admin-guide/kernel-parameters.txt +++ b/Documentation/admin-guide/kernel-parameters.txt -@@ -4947,6 +4947,12 @@ - - sbni= [NET] Granch SBNI12 leased line adapter +@@ -4985,6 +4985,12 @@ + sa1100ir [NET] + See drivers/net/irda/sa1100_ir.c. + sched_timeslice= + [KNL] Time slice in ms for Project C BMQ/PDS scheduler. @@ -150,10 +150,10 @@ index 000000000000..05c84eec0f31 +priority boost from unblocking while background threads that do most of the +processing receive the priority penalty for using their entire timeslice. diff --git a/fs/proc/base.c b/fs/proc/base.c -index e5b5f7709d48..284b3c4b7d90 100644 +index 533d5836eb9a..5756c51c9b58 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c -@@ -476,7 +476,7 @@ static int proc_pid_schedstat(struct seq_file *m, struct pid_namespace *ns, +@@ -477,7 +477,7 @@ static int proc_pid_schedstat(struct seq_file *m, struct pid_namespace *ns, seq_puts(m, "0 0 0\n"); else seq_printf(m, "%llu %llu %lu\n", @@ -176,10 +176,10 @@ index 8874f681b056..59eb72bf7d5f 100644 [RLIMIT_RTTIME] = { RLIM_INFINITY, RLIM_INFINITY }, \ } diff --git a/include/linux/sched.h b/include/linux/sched.h -index ec8d07d88641..b12f660404fd 100644 +index c1a927ddec64..a7eb91d15442 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h -@@ -681,12 +681,18 @@ struct task_struct { +@@ -748,12 +748,18 @@ struct task_struct { unsigned int ptrace; #ifdef CONFIG_SMP @@ -199,7 +199,7 @@ index ec8d07d88641..b12f660404fd 100644 unsigned int wakee_flips; unsigned long wakee_flip_decay_ts; struct task_struct *last_wakee; -@@ -700,6 +706,7 @@ struct task_struct { +@@ -767,6 +773,7 @@ struct task_struct { */ int recent_used_cpu; int wake_cpu; @@ -207,7 +207,7 @@ index ec8d07d88641..b12f660404fd 100644 #endif int on_rq; -@@ -708,6 +715,20 @@ struct task_struct { +@@ -775,6 +782,20 @@ struct task_struct { int normal_prio; unsigned int rt_priority; @@ -228,7 +228,7 @@ index ec8d07d88641..b12f660404fd 100644 const struct sched_class *sched_class; struct sched_entity se; struct sched_rt_entity rt; -@@ -718,6 +739,7 @@ struct task_struct { +@@ -785,6 +806,7 @@ struct task_struct { unsigned long core_cookie; unsigned int core_occupation; #endif @@ -236,7 +236,7 @@ index ec8d07d88641..b12f660404fd 100644 #ifdef CONFIG_CGROUP_SCHED struct task_group *sched_task_group; -@@ -1417,6 +1439,15 @@ struct task_struct { +@@ -1505,6 +1527,15 @@ struct task_struct { */ }; @@ -356,10 +356,10 @@ index 8f0f778b7c91..991f2280475b 100644 #else static inline void rebuild_sched_domains_energy(void) diff --git a/init/Kconfig b/init/Kconfig -index 55f9f7738ebb..9a9b244d3ca3 100644 +index 11f8a845f259..c8e82fcafb9e 100644 --- a/init/Kconfig +++ b/init/Kconfig -@@ -786,9 +786,39 @@ config GENERIC_SCHED_CLOCK +@@ -814,9 +814,39 @@ config GENERIC_SCHED_CLOCK menu "Scheduler features" @@ -399,7 +399,7 @@ index 55f9f7738ebb..9a9b244d3ca3 100644 help This feature enables the scheduler to track the clamped utilization of each CPU based on RUNNABLE tasks scheduled on that CPU. -@@ -874,6 +904,7 @@ config NUMA_BALANCING +@@ -902,6 +932,7 @@ config NUMA_BALANCING depends on ARCH_SUPPORTS_NUMA_BALANCING depends on !ARCH_WANT_NUMA_VARIABLE_LOCALITY depends on SMP && NUMA && MIGRATION @@ -407,7 +407,7 @@ index 55f9f7738ebb..9a9b244d3ca3 100644 help This option adds support for automatic NUMA aware memory/task placement. The mechanism is quite primitive and is based on migrating memory when -@@ -966,6 +997,7 @@ config FAIR_GROUP_SCHED +@@ -994,6 +1025,7 @@ config FAIR_GROUP_SCHED depends on CGROUP_SCHED default CGROUP_SCHED @@ -415,7 +415,7 @@ index 55f9f7738ebb..9a9b244d3ca3 100644 config CFS_BANDWIDTH bool "CPU bandwidth provisioning for FAIR_GROUP_SCHED" depends on FAIR_GROUP_SCHED -@@ -988,6 +1020,7 @@ config RT_GROUP_SCHED +@@ -1016,6 +1048,7 @@ config RT_GROUP_SCHED realtime bandwidth for them. See Documentation/scheduler/sched-rt-group.rst for more information. @@ -423,7 +423,7 @@ index 55f9f7738ebb..9a9b244d3ca3 100644 endif #CGROUP_SCHED config UCLAMP_TASK_GROUP -@@ -1231,6 +1264,7 @@ config CHECKPOINT_RESTORE +@@ -1259,6 +1292,7 @@ config CHECKPOINT_RESTORE config SCHED_AUTOGROUP bool "Automatic process group scheduling" @@ -432,7 +432,7 @@ index 55f9f7738ebb..9a9b244d3ca3 100644 select CGROUP_SCHED select FAIR_GROUP_SCHED diff --git a/init/init_task.c b/init/init_task.c -index 562f2ef8d157..177b63db4ce0 100644 +index 2d024066e27b..49f706df0904 100644 --- a/init/init_task.c +++ b/init/init_task.c @@ -75,9 +75,15 @@ struct task_struct init_task @@ -450,8 +450,8 @@ index 562f2ef8d157..177b63db4ce0 100644 +#endif .policy = SCHED_NORMAL, .cpus_ptr = &init_task.cpus_mask, - .cpus_mask = CPU_MASK_ALL, -@@ -87,6 +93,17 @@ struct task_struct init_task + .user_cpus_ptr = NULL, +@@ -88,6 +94,17 @@ struct task_struct init_task .restart_block = { .fn = do_no_restart_syscall, }, @@ -469,7 +469,7 @@ index 562f2ef8d157..177b63db4ce0 100644 .se = { .group_node = LIST_HEAD_INIT(init_task.se.group_node), }, -@@ -94,6 +111,7 @@ struct task_struct init_task +@@ -95,6 +112,7 @@ struct task_struct init_task .run_list = LIST_HEAD_INIT(init_task.rt.run_list), .time_slice = RR_TIMESLICE, }, @@ -491,10 +491,10 @@ index 5876e30c5740..7594d0a31869 100644 This option permits Core Scheduling, a means of coordinated task selection across SMT siblings. When enabled -- see diff --git a/kernel/cgroup/cpuset.c b/kernel/cgroup/cpuset.c -index adb5190c4429..8c02bce63146 100644 +index 2a9695ccb65f..292112c267b8 100644 --- a/kernel/cgroup/cpuset.c +++ b/kernel/cgroup/cpuset.c -@@ -636,7 +636,7 @@ static int validate_change(struct cpuset *cur, struct cpuset *trial) +@@ -664,7 +664,7 @@ static int validate_change(struct cpuset *cur, struct cpuset *trial) return ret; } @@ -503,7 +503,7 @@ index adb5190c4429..8c02bce63146 100644 /* * Helper routine for generate_sched_domains(). * Do cpusets a, b have overlapping effective cpus_allowed masks? -@@ -1032,7 +1032,7 @@ static void rebuild_sched_domains_locked(void) +@@ -1060,7 +1060,7 @@ static void rebuild_sched_domains_locked(void) /* Have scheduler rebuild the domains */ partition_and_rebuild_sched_domains(ndoms, doms, attr); } @@ -526,7 +526,7 @@ index 51530d5b15a8..e542d71bb94b 100644 d->cpu_count += t1; diff --git a/kernel/exit.c b/kernel/exit.c -index 9a89e7f36acb..7fe34c56bd08 100644 +index 91a43e57a32e..4b157befc10c 100644 --- a/kernel/exit.c +++ b/kernel/exit.c @@ -122,7 +122,7 @@ static void __exit_signal(struct task_struct *tsk) @@ -548,7 +548,7 @@ index 9a89e7f36acb..7fe34c56bd08 100644 __unhash_process(tsk, group_dead); write_sequnlock(&sig->stats_lock); diff --git a/kernel/livepatch/transition.c b/kernel/livepatch/transition.c -index 3a4beb9395c4..98a709628cb3 100644 +index 291b857a6e20..f3480cdb7497 100644 --- a/kernel/livepatch/transition.c +++ b/kernel/livepatch/transition.c @@ -307,7 +307,11 @@ static bool klp_try_switch_task(struct task_struct *task) @@ -564,10 +564,10 @@ index 3a4beb9395c4..98a709628cb3 100644 "%s: %s:%d is running\n", __func__, task->comm, task->pid); diff --git a/kernel/locking/rtmutex.c b/kernel/locking/rtmutex.c -index ad0db322ed3b..350b0e506c17 100644 +index 6bb116c559b4..d4c8168a8270 100644 --- a/kernel/locking/rtmutex.c +++ b/kernel/locking/rtmutex.c -@@ -654,7 +654,7 @@ waiter_update_prio(struct rt_mutex_waiter *waiter, struct task_struct *task) +@@ -298,21 +298,25 @@ static __always_inline void waiter_update_prio(struct rt_mutex_waiter *waiter, struct task_struct *task) { waiter->prio = __waiter_prio(task); @@ -576,7 +576,6 @@ index ad0db322ed3b..350b0e506c17 100644 } /* -@@ -227,14 +227,18 @@ static __always_inline bool unlock_rt_mutex_safe(struct rt_mutex *lock, * Only use with rt_mutex_waiter_{less,equal}() */ #define task_to_waiter(p) \ @@ -596,7 +595,7 @@ index ad0db322ed3b..350b0e506c17 100644 /* * If both waiters have dl_prio(), we check the deadlines of the * associated tasks. -@@ -243,16 +247,22 @@ static __always_inline int rt_mutex_waiter_less(struct rt_mutex_waiter *left, +@@ -321,16 +325,22 @@ static __always_inline int rt_mutex_waiter_less(struct rt_mutex_waiter *left, */ if (dl_prio(left->prio)) return dl_time_before(left->deadline, right->deadline); @@ -619,7 +618,7 @@ index ad0db322ed3b..350b0e506c17 100644 /* * If both waiters have dl_prio(), we check the deadlines of the * associated tasks. -@@ -261,8 +271,10 @@ static __always_inline int rt_mutex_waiter_equal(struct rt_mutex_waiter *left, +@@ -339,8 +349,10 @@ static __always_inline int rt_mutex_waiter_equal(struct rt_mutex_waiter *left, */ if (dl_prio(left->prio)) return left->deadline == right->deadline; @@ -629,7 +628,7 @@ index ad0db322ed3b..350b0e506c17 100644 +#endif } - #define __node_2_waiter(node) \ + static inline bool rt_mutex_steal(struct rt_mutex_waiter *waiter, diff --git a/kernel/sched/Makefile b/kernel/sched/Makefile index 978fcfca5871..0425ee149b4d 100644 --- a/kernel/sched/Makefile @@ -664,10 +663,10 @@ index 978fcfca5871..0425ee149b4d 100644 obj-$(CONFIG_CPU_FREQ_GOV_SCHEDUTIL) += cpufreq_schedutil.o diff --git a/kernel/sched/alt_core.c b/kernel/sched/alt_core.c new file mode 100644 -index 000000000000..56aed2b1e42c +index 000000000000..9576c57f82da --- /dev/null +++ b/kernel/sched/alt_core.c -@@ -0,0 +1,7615 @@ +@@ -0,0 +1,7626 @@ +/* + * kernel/sched/alt_core.c + * @@ -737,7 +736,7 @@ index 000000000000..56aed2b1e42c +#define sched_feat(x) (0) +#endif /* CONFIG_SCHED_DEBUG */ + -+#define ALT_SCHED_VERSION "v5.14-r3" ++#define ALT_SCHED_VERSION "v5.15-r0" + +/* rt_prio(prio) defined in include/linux/sched/rt.h */ +#define rt_task(p) rt_prio((p)->prio) @@ -1273,7 +1272,7 @@ index 000000000000..56aed2b1e42c + u64 delta = min(LOAD_BLOCK(time) - LOAD_BLOCK(rq->load_stamp), + RQ_LOAD_HISTORY_BITS - 1); + u64 prev = !!(rq->load_history & CURRENT_LOAD_BIT); -+ u64 curr = !!cpu_rq(rq->cpu)->nr_running; ++ u64 curr = !!rq->nr_running; + + if (delta) { + rq->load_history = rq->load_history >> delta; @@ -2542,8 +2541,8 @@ index 000000000000..56aed2b1e42c + * leave kernel. + */ + if (p->mm && printk_ratelimit()) { -+ printk("process %d (%s) no longer affine to cpu%d\n", -+ task_pid_nr(p), p->comm, cpu); ++ printk_deferred("process %d (%s) no longer affine to cpu%d\n", ++ task_pid_nr(p), p->comm, cpu); + } + } + @@ -2613,17 +2612,50 @@ index 000000000000..56aed2b1e42c + } +} + -+/* -+ * Called with both p->pi_lock and rq->lock held; drops both before returning. -+ */ ++static int affine_move_task(struct rq *rq, struct task_struct *p, int dest_cpu, ++ raw_spinlock_t *lock, unsigned long irq_flags) ++{ ++ /* Can the task run on the task's current CPU? If so, we're done */ ++ if (!cpumask_test_cpu(task_cpu(p), &p->cpus_mask)) { ++ if (p->migration_disabled) { ++ if (likely(p->cpus_ptr != &p->cpus_mask)) ++ __do_set_cpus_ptr(p, &p->cpus_mask); ++ p->migration_disabled = 0; ++ p->migration_flags |= MDF_FORCE_ENABLED; ++ /* When p is migrate_disabled, rq->lock should be held */ ++ rq->nr_pinned--; ++ } ++ ++ if (task_running(p) || READ_ONCE(p->__state) == TASK_WAKING) { ++ struct migration_arg arg = { p, dest_cpu }; ++ ++ /* Need help from migration thread: drop lock and wait. */ ++ __task_access_unlock(p, lock); ++ raw_spin_unlock_irqrestore(&p->pi_lock, irq_flags); ++ stop_one_cpu(cpu_of(rq), migration_cpu_stop, &arg); ++ return 0; ++ } ++ if (task_on_rq_queued(p)) { ++ /* ++ * OK, since we're going to drop the lock immediately ++ * afterwards anyway. ++ */ ++ update_rq_clock(rq); ++ rq = move_queued_task(rq, p, dest_cpu); ++ lock = &rq->lock; ++ } ++ } ++ __task_access_unlock(p, lock); ++ raw_spin_unlock_irqrestore(&p->pi_lock, irq_flags); ++ return 0; ++} ++ +static int __set_cpus_allowed_ptr_locked(struct task_struct *p, + const struct cpumask *new_mask, + u32 flags, -+ unsigned long *irq_flags, + struct rq *rq, -+ raw_spinlock_t *lock) -+ __releases(rq->lock) -+ __releases(p->pi_lock) ++ raw_spinlock_t *lock, ++ unsigned long irq_flags) +{ + const struct cpumask *cpu_allowed_mask = task_cpu_possible_mask(p); + const struct cpumask *cpu_valid_mask = cpu_active_mask; @@ -2674,47 +2706,19 @@ index 000000000000..56aed2b1e42c + if (flags & SCA_USER) + user_mask = clear_user_cpus_ptr(p); + -+ /* Can the task run on the task's current CPU? If so, we're done */ -+ if (cpumask_test_cpu(task_cpu(p), new_mask)) -+ goto out; ++ ret = affine_move_task(rq, p, dest_cpu, lock, irq_flags); + -+ if (p->migration_disabled) { -+ if (likely(p->cpus_ptr != &p->cpus_mask)) -+ __do_set_cpus_ptr(p, &p->cpus_mask); -+ p->migration_disabled = 0; -+ p->migration_flags |= MDF_FORCE_ENABLED; -+ /* When p is migrate_disabled, rq->lock should be held */ -+ rq->nr_pinned--; -+ } -+ -+ if (task_running(p) || READ_ONCE(p->__state) == TASK_WAKING) { -+ struct migration_arg arg = { p, dest_cpu }; -+ -+ /* Need help from migration thread: drop lock and wait. */ -+ __task_access_unlock(p, lock); -+ raw_spin_unlock_irqrestore(&p->pi_lock, *irq_flags); -+ stop_one_cpu(cpu_of(rq), migration_cpu_stop, &arg); -+ kfree(user_mask); -+ return 0; -+ } -+ if (task_on_rq_queued(p)) { -+ /* -+ * OK, since we're going to drop the lock immediately -+ * afterwards anyway. -+ */ -+ update_rq_clock(rq); -+ rq = move_queued_task(rq, p, dest_cpu); -+ lock = &rq->lock; -+ } + kfree(user_mask); + ++ return ret; ++ +out: + __task_access_unlock(p, lock); -+ raw_spin_unlock_irqrestore(&p->pi_lock, *irq_flags); ++ raw_spin_unlock_irqrestore(&p->pi_lock, irq_flags); + + return ret; +} -+ ++ +/* + * Change a given task's CPU affinity. Migrate the thread to a + * proper CPU and schedule it away if the CPU it's executing on @@ -2733,7 +2737,8 @@ index 000000000000..56aed2b1e42c + + raw_spin_lock_irqsave(&p->pi_lock, irq_flags); + rq = __task_access_lock(p, &lock); -+ return __set_cpus_allowed_ptr_locked(p, new_mask, flags, &irq_flags, rq, lock); ++ ++ return __set_cpus_allowed_ptr_locked(p, new_mask, flags, rq, lock, irq_flags); +} + +int set_cpus_allowed_ptr(struct task_struct *p, const struct cpumask *new_mask) @@ -2755,8 +2760,8 @@ index 000000000000..56aed2b1e42c +{ + struct cpumask *user_mask = NULL; + unsigned long irq_flags; -+ struct rq *rq; + raw_spinlock_t *lock; ++ struct rq *rq; + int err; + + if (!p->user_cpus_ptr) { @@ -2782,7 +2787,8 @@ index 000000000000..56aed2b1e42c + p->user_cpus_ptr = user_mask; + } + -+ return __set_cpus_allowed_ptr_locked(p, new_mask, 0, &irq_flags, rq, lock); ++ /*return __set_cpus_allowed_ptr_locked(p, new_mask, 0, rq, &rf);*/ ++ return __set_cpus_allowed_ptr_locked(p, new_mask, 0, rq, lock, irq_flags); + +err_unlock: + __task_access_unlock(p, lock); @@ -2825,8 +2831,9 @@ index 000000000000..56aed2b1e42c + +out_set_mask: + if (printk_ratelimit()) { -+ printk("Overriding affinity for process %d (%s) to CPUs %*pbl\n", -+ task_pid_nr(p), p->comm, cpumask_pr_args(override_mask)); ++ printk_deferred("Overriding affinity for process %d (%s) to CPUs %*pbl\n", ++ task_pid_nr(p), p->comm, ++ cpumask_pr_args(override_mask)); + } + + WARN_ON(set_cpus_allowed_ptr(p, override_mask)); @@ -2875,8 +2882,7 @@ index 000000000000..56aed2b1e42c + +static inline int +__set_cpus_allowed_ptr(struct task_struct *p, -+ const struct cpumask *new_mask, -+ u32 flags) ++ const struct cpumask *new_mask, u32 flags) +{ + return set_cpus_allowed_ptr(p, new_mask); +} @@ -6327,14 +6333,6 @@ index 000000000000..56aed2b1e42c + return -E2BIG; +} + -+static void get_params(struct task_struct *p, struct sched_attr *attr) -+{ -+ if (task_has_rt_policy(p)) -+ attr->sched_priority = p->rt_priority; -+ else -+ attr->sched_nice = task_nice(p); -+} -+ +/** + * sys_sched_setscheduler - set/change the scheduler policy and RT priority + * @pid: the pid in question. @@ -6393,8 +6391,6 @@ index 000000000000..56aed2b1e42c + rcu_read_unlock(); + + if (likely(p)) { -+ if (attr.sched_flags & SCHED_FLAG_KEEP_PARAMS) -+ get_params(p, &attr); + retval = sched_setattr(p, &attr); + put_task_struct(p); + } @@ -6545,7 +6541,10 @@ index 000000000000..56aed2b1e42c + kattr.sched_policy = p->policy; + if (p->sched_reset_on_fork) + kattr.sched_flags |= SCHED_FLAG_RESET_ON_FORK; -+ get_params(p, &kattr); ++ if (task_has_rt_policy(p)) ++ kattr.sched_priority = p->rt_priority; ++ else ++ kattr.sched_nice = task_nice(p); + kattr.sched_flags &= SCHED_FLAG_ALL; + +#ifdef CONFIG_UCLAMP_TASK @@ -6578,7 +6577,6 @@ index 000000000000..56aed2b1e42c + + cpuset_cpus_allowed(p, cpus_allowed); + cpumask_and(new_mask, mask, cpus_allowed); -+ +again: + retval = __set_cpus_allowed_ptr(p, new_mask, SCA_CHECK | SCA_USER); + if (retval) @@ -6587,8 +6585,9 @@ index 000000000000..56aed2b1e42c + cpuset_cpus_allowed(p, cpus_allowed); + if (!cpumask_subset(new_mask, cpus_allowed)) { + /* -+ * We must have raced with a concurrent cpuset update. -+ * Just reset the cpumask to the cpuset's cpus_allowed. ++ * We must have raced with a concurrent cpuset ++ * update. Just reset the cpus_allowed to the ++ * cpuset's cpus_allowed + */ + cpumask_copy(new_mask, cpus_allowed); + goto again; @@ -6791,6 +6790,17 @@ index 000000000000..56aed2b1e42c + preempt_schedule_common(); + return 1; + } ++ /* ++ * In preemptible kernels, ->rcu_read_lock_nesting tells the tick ++ * whether the current CPU is in an RCU read-side critical section, ++ * so the tick can report quiescent states even for CPUs looping ++ * in kernel context. In contrast, in non-preemptible kernels, ++ * RCU readers leave no in-memory hints, which means that CPU-bound ++ * processes executing in kernel context might never report an ++ * RCU quiescent state. Therefore, the following code causes ++ * cond_resched() to report a quiescent state, but only when RCU ++ * is in urgent need of one. ++ */ +#ifndef CONFIG_PREEMPT_RCU + rcu_all_qs(); +#endif @@ -9110,7 +9120,7 @@ index 000000000000..be3ee4a553ca + +static inline void update_rq_time_edge(struct rq *rq) {} diff --git a/kernel/sched/cpufreq_schedutil.c b/kernel/sched/cpufreq_schedutil.c -index 57124614363d..f0e9c7543542 100644 +index e7af18857371..3e38816b736e 100644 --- a/kernel/sched/cpufreq_schedutil.c +++ b/kernel/sched/cpufreq_schedutil.c @@ -167,9 +167,14 @@ static void sugov_get_util(struct sugov_cpu *sg_cpu) @@ -9139,7 +9149,7 @@ index 57124614363d..f0e9c7543542 100644 } static inline bool sugov_update_single_common(struct sugov_cpu *sg_cpu, -@@ -599,6 +606,7 @@ static int sugov_kthread_create(struct sugov_policy *sg_policy) +@@ -607,6 +614,7 @@ static int sugov_kthread_create(struct sugov_policy *sg_policy) } ret = sched_setattr_nocheck(thread, &attr); @@ -9147,7 +9157,7 @@ index 57124614363d..f0e9c7543542 100644 if (ret) { kthread_stop(thread); pr_warn("%s: failed to set SCHED_DEADLINE\n", __func__); -@@ -833,7 +841,9 @@ cpufreq_governor_init(schedutil_gov); +@@ -839,7 +847,9 @@ cpufreq_governor_init(schedutil_gov); #ifdef CONFIG_ENERGY_MODEL static void rebuild_sd_workfn(struct work_struct *work) { @@ -9207,7 +9217,7 @@ index 872e481d5098..f920c8b48ec1 100644 task_cputime(p, &cputime.utime, &cputime.stime); diff --git a/kernel/sched/debug.c b/kernel/sched/debug.c -index 0c5ec2776ddf..e3f4fe3f6e2c 100644 +index 17a653b67006..17ab2fe34d7a 100644 --- a/kernel/sched/debug.c +++ b/kernel/sched/debug.c @@ -8,6 +8,7 @@ @@ -9218,7 +9228,7 @@ index 0c5ec2776ddf..e3f4fe3f6e2c 100644 /* * This allows printing both to /proc/sched_debug and * to the console -@@ -210,6 +211,7 @@ static const struct file_operations sched_scaling_fops = { +@@ -216,6 +217,7 @@ static const struct file_operations sched_scaling_fops = { }; #endif /* SMP */ @@ -9226,7 +9236,7 @@ index 0c5ec2776ddf..e3f4fe3f6e2c 100644 #ifdef CONFIG_PREEMPT_DYNAMIC -@@ -273,6 +275,7 @@ static const struct file_operations sched_dynamic_fops = { +@@ -279,6 +281,7 @@ static const struct file_operations sched_dynamic_fops = { #endif /* CONFIG_PREEMPT_DYNAMIC */ @@ -9234,7 +9244,7 @@ index 0c5ec2776ddf..e3f4fe3f6e2c 100644 __read_mostly bool sched_debug_verbose; static const struct seq_operations sched_debug_sops; -@@ -288,6 +291,7 @@ static const struct file_operations sched_debug_fops = { +@@ -294,6 +297,7 @@ static const struct file_operations sched_debug_fops = { .llseek = seq_lseek, .release = seq_release, }; @@ -9242,7 +9252,7 @@ index 0c5ec2776ddf..e3f4fe3f6e2c 100644 static struct dentry *debugfs_sched; -@@ -297,12 +301,15 @@ static __init int sched_init_debug(void) +@@ -303,12 +307,15 @@ static __init int sched_init_debug(void) debugfs_sched = debugfs_create_dir("sched", NULL); @@ -9258,7 +9268,7 @@ index 0c5ec2776ddf..e3f4fe3f6e2c 100644 debugfs_create_u32("latency_ns", 0644, debugfs_sched, &sysctl_sched_latency); debugfs_create_u32("min_granularity_ns", 0644, debugfs_sched, &sysctl_sched_min_granularity); debugfs_create_u32("wakeup_granularity_ns", 0644, debugfs_sched, &sysctl_sched_wakeup_granularity); -@@ -330,11 +337,13 @@ static __init int sched_init_debug(void) +@@ -336,11 +343,13 @@ static __init int sched_init_debug(void) #endif debugfs_create_file("debug", 0444, debugfs_sched, NULL, &sched_debug_fops); @@ -9272,7 +9282,7 @@ index 0c5ec2776ddf..e3f4fe3f6e2c 100644 #ifdef CONFIG_SMP static cpumask_var_t sd_sysctl_cpus; -@@ -1047,6 +1056,7 @@ void proc_sched_set_task(struct task_struct *p) +@@ -1063,6 +1072,7 @@ void proc_sched_set_task(struct task_struct *p) memset(&p->se.statistics, 0, sizeof(p->se.statistics)); #endif } @@ -9281,7 +9291,7 @@ index 0c5ec2776ddf..e3f4fe3f6e2c 100644 void resched_latency_warn(int cpu, u64 latency) { diff --git a/kernel/sched/idle.c b/kernel/sched/idle.c -index 912b47aa99d8..7f6b13883c2a 100644 +index d17b0a5ce6ac..6ff77fc6b73a 100644 --- a/kernel/sched/idle.c +++ b/kernel/sched/idle.c @@ -403,6 +403,7 @@ void cpu_startup_entry(enum cpuhp_state state) @@ -9503,7 +9513,7 @@ index e06071bf3472..adf567df34d4 100644 static inline int update_thermal_load_avg(u64 now, struct rq *rq, u64 capacity) diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h -index ddefb0419d7a..658c41b15d3c 100644 +index 3d3e5793e117..c1d976ef623f 100644 --- a/kernel/sched/sched.h +++ b/kernel/sched/sched.h @@ -2,6 +2,10 @@ @@ -9517,7 +9527,7 @@ index ddefb0419d7a..658c41b15d3c 100644 #include #include -@@ -3038,3 +3042,8 @@ extern int sched_dynamic_mode(const char *str); +@@ -3064,3 +3068,8 @@ extern int sched_dynamic_mode(const char *str); extern void sched_dynamic_update(int mode); #endif @@ -9558,7 +9568,7 @@ index 3f93fc3b5648..528b71e144e9 100644 } return 0; diff --git a/kernel/sched/topology.c b/kernel/sched/topology.c -index b77ad49dc14f..be9edf086412 100644 +index 4e8698e62f07..36c61551252e 100644 --- a/kernel/sched/topology.c +++ b/kernel/sched/topology.c @@ -4,6 +4,7 @@ @@ -9580,7 +9590,7 @@ index b77ad49dc14f..be9edf086412 100644 static int __init setup_relax_domain_level(char *str) { if (kstrtoint(str, 0, &default_relax_domain_level)) -@@ -1617,6 +1620,7 @@ sd_init(struct sched_domain_topology_level *tl, +@@ -1619,6 +1622,7 @@ sd_init(struct sched_domain_topology_level *tl, return sd; } @@ -9588,7 +9598,7 @@ index b77ad49dc14f..be9edf086412 100644 /* * Topology list, bottom-up. -@@ -1646,6 +1650,7 @@ void set_sched_topology(struct sched_domain_topology_level *tl) +@@ -1648,6 +1652,7 @@ void set_sched_topology(struct sched_domain_topology_level *tl) sched_domain_topology = tl; } @@ -9596,7 +9606,7 @@ index b77ad49dc14f..be9edf086412 100644 #ifdef CONFIG_NUMA static const struct cpumask *sd_numa_mask(int cpu) -@@ -2451,3 +2456,17 @@ void partition_sched_domains(int ndoms_new, cpumask_var_t doms_new[], +@@ -2516,3 +2521,17 @@ void partition_sched_domains(int ndoms_new, cpumask_var_t doms_new[], partition_sched_domains_locked(ndoms_new, doms_new, dattr_new); mutex_unlock(&sched_domains_mutex); } @@ -9615,7 +9625,7 @@ index b77ad49dc14f..be9edf086412 100644 +#endif /* CONFIG_NUMA */ +#endif diff --git a/kernel/sysctl.c b/kernel/sysctl.c -index 272f4a272f8c..1c9455c8ecf6 100644 +index 083be6af29d7..09fc6281d488 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -122,6 +122,10 @@ static unsigned long long_max = LONG_MAX; @@ -9629,7 +9639,7 @@ index 272f4a272f8c..1c9455c8ecf6 100644 #ifdef CONFIG_PRINTK static int ten_thousand = 10000; #endif -@@ -1730,6 +1734,24 @@ int proc_do_static_key(struct ctl_table *table, int write, +@@ -1771,6 +1775,24 @@ int proc_do_static_key(struct ctl_table *table, int write, } static struct ctl_table kern_table[] = { @@ -9654,7 +9664,7 @@ index 272f4a272f8c..1c9455c8ecf6 100644 { .procname = "sched_child_runs_first", .data = &sysctl_sched_child_runs_first, -@@ -1860,6 +1882,7 @@ static struct ctl_table kern_table[] = { +@@ -1901,6 +1923,7 @@ static struct ctl_table kern_table[] = { .extra2 = SYSCTL_ONE, }, #endif @@ -9662,7 +9672,7 @@ index 272f4a272f8c..1c9455c8ecf6 100644 #ifdef CONFIG_PROVE_LOCKING { .procname = "prove_locking", -@@ -2436,6 +2459,17 @@ static struct ctl_table kern_table[] = { +@@ -2477,6 +2500,17 @@ static struct ctl_table kern_table[] = { .proc_handler = proc_dointvec, }, #endif @@ -9681,10 +9691,10 @@ index 272f4a272f8c..1c9455c8ecf6 100644 { .procname = "spin_retry", diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c -index 4a66725b1d4a..cb80ed5c1f5c 100644 +index 0ea8702eb516..a27a0f3a654d 100644 --- a/kernel/time/hrtimer.c +++ b/kernel/time/hrtimer.c -@@ -1940,8 +1940,10 @@ long hrtimer_nanosleep(ktime_t rqtp, const enum hrtimer_mode mode, +@@ -2088,8 +2088,10 @@ long hrtimer_nanosleep(ktime_t rqtp, const enum hrtimer_mode mode, int ret = 0; u64 slack; @@ -9696,7 +9706,7 @@ index 4a66725b1d4a..cb80ed5c1f5c 100644 hrtimer_init_sleeper_on_stack(&t, clockid, mode); diff --git a/kernel/time/posix-cpu-timers.c b/kernel/time/posix-cpu-timers.c -index 517be7fd175e..de3afe8e0800 100644 +index 643d412ac623..6bf27565242f 100644 --- a/kernel/time/posix-cpu-timers.c +++ b/kernel/time/posix-cpu-timers.c @@ -216,7 +216,7 @@ static void task_sample_cputime(struct task_struct *p, u64 *samples) @@ -9708,7 +9718,7 @@ index 517be7fd175e..de3afe8e0800 100644 } static void proc_sample_cputime_atomic(struct task_cputime_atomic *at, -@@ -801,6 +801,7 @@ static void collect_posix_cputimers(struct posix_cputimers *pct, u64 *samples, +@@ -859,6 +859,7 @@ static void collect_posix_cputimers(struct posix_cputimers *pct, u64 *samples, } } @@ -9716,7 +9726,7 @@ index 517be7fd175e..de3afe8e0800 100644 static inline void check_dl_overrun(struct task_struct *tsk) { if (tsk->dl.dl_overrun) { -@@ -808,6 +809,7 @@ static inline void check_dl_overrun(struct task_struct *tsk) +@@ -866,6 +867,7 @@ static inline void check_dl_overrun(struct task_struct *tsk) __group_send_sig_info(SIGXCPU, SEND_SIG_PRIV, tsk); } } @@ -9724,7 +9734,7 @@ index 517be7fd175e..de3afe8e0800 100644 static bool check_rlimit(u64 time, u64 limit, int signo, bool rt, bool hard) { -@@ -835,8 +837,10 @@ static void check_thread_timers(struct task_struct *tsk, +@@ -893,8 +895,10 @@ static void check_thread_timers(struct task_struct *tsk, u64 samples[CPUCLOCK_MAX]; unsigned long soft; @@ -9735,7 +9745,7 @@ index 517be7fd175e..de3afe8e0800 100644 if (expiry_cache_is_inactive(pct)) return; -@@ -850,7 +854,7 @@ static void check_thread_timers(struct task_struct *tsk, +@@ -908,7 +912,7 @@ static void check_thread_timers(struct task_struct *tsk, soft = task_rlimit(tsk, RLIMIT_RTTIME); if (soft != RLIM_INFINITY) { /* Task RT timeout is accounted in jiffies. RTTIME is usec */ @@ -9744,7 +9754,7 @@ index 517be7fd175e..de3afe8e0800 100644 unsigned long hard = task_rlimit_max(tsk, RLIMIT_RTTIME); /* At the hard limit, send SIGKILL. No further action. */ -@@ -1086,8 +1090,10 @@ static inline bool fastpath_timer_check(struct task_struct *tsk) +@@ -1144,8 +1148,10 @@ static inline bool fastpath_timer_check(struct task_struct *tsk) return true; }