[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20250418193410.2010058-3-prakash.sangappa@oracle.com>
Date: Fri, 18 Apr 2025 19:34:09 +0000
From: Prakash Sangappa <prakash.sangappa@...cle.com>
To: linux-kernel@...r.kernel.org
Cc: peterz@...radead.org, rostedt@...dmis.org, mathieu.desnoyers@...icios.com,
tglx@...utronix.de, bigeasy@...utronix.de
Subject: [PATCH V2 2/3] Sched: Tunable to specify duration of time slice extension
Add a tunable to specify duration of scheduler time slice extension.
The default will be set to 50us and the max value that can be specified
is 100us. Setting it to 0, disables scheduler time slice extension.
Signed-off-by: Prakash Sangappa <prakash.sangappa@...cle.com>
---
include/linux/sched.h | 3 +++
kernel/rseq.c | 10 ++++++----
kernel/sched/core.c | 16 ++++++++++++++++
3 files changed, 25 insertions(+), 4 deletions(-)
diff --git a/include/linux/sched.h b/include/linux/sched.h
index 75abe260de72..c91856f908d6 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -385,6 +385,9 @@ extern struct root_domain def_root_domain;
extern struct mutex sched_domains_mutex;
#endif
+/* Scheduler time slice extension */
+extern unsigned int sysctl_sched_preempt_delay_us;
+
struct sched_param {
int sched_priority;
};
diff --git a/kernel/rseq.c b/kernel/rseq.c
index 9f83d47253ce..7022729d02ee 100644
--- a/kernel/rseq.c
+++ b/kernel/rseq.c
@@ -434,6 +434,8 @@ bool rseq_delay_resched(void)
if (!IS_ENABLED(CONFIG_SCHED_HRTICK))
return false;
+ if (!sysctl_sched_preempt_delay_us)
+ return false;
if (!t->rseq)
return false;
@@ -464,11 +466,11 @@ void rseq_delay_resched_fini(void)
* IRQs off, guaranteed to return to userspace, start timer on this CPU
* to limit the resched-overdraft.
*
- * If your critical section is longer than 50 us you get to keep the
- * pieces.
+ * If your critical section is longer than sysctl_sched_preempt_delay_us
+ * you get to keep the pieces.
*/
- if (t->rseq_sched_delay)
- hrtick_local_start(50 * NSEC_PER_USEC);
+ if (sysctl_sched_preempt_delay_us && t->rseq_sched_delay)
+ hrtick_local_start(sysctl_sched_preempt_delay_us * NSEC_PER_USEC);
#endif
}
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index cee50e139723..59b381cef472 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -151,6 +151,13 @@ __read_mostly int sysctl_resched_latency_warn_once = 1;
*/
const_debug unsigned int sysctl_sched_nr_migrate = SCHED_NR_MIGRATE_BREAK;
+/*
+ * Scheduler time slice extension, duration in microsecs.
+ * Max value allowed 100us, default 50us
+ * If set to 0, scheduler time slice extension is disabled.
+ */
+__read_mostly unsigned int sysctl_sched_preempt_delay_us = 50;
+
__read_mostly int scheduler_running;
#ifdef CONFIG_SCHED_CORE
@@ -4713,6 +4720,15 @@ static const struct ctl_table sched_core_sysctls[] = {
.extra2 = SYSCTL_FOUR,
},
#endif /* CONFIG_NUMA_BALANCING */
+ {
+ .procname = "sched_preempt_delay_us",
+ .data = &sysctl_sched_preempt_delay_us,
+ .maxlen = sizeof(unsigned int),
+ .mode = 0644,
+ .proc_handler = proc_dointvec_minmax,
+ .extra1 = SYSCTL_ZERO,
+ .extra2 = SYSCTL_ONE_HUNDRED,
+ },
};
static int __init sched_core_sysctl_init(void)
{
--
2.43.5
Powered by blists - more mailing lists