All of lore.kernel.org
 help / color / mirror / Atom feed
From: Shrikanth Hegde <sshegde@linux.ibm.com>
To: linux-kernel@vger.kernel.org, mingo@kernel.org,
	peterz@infradead.org, juri.lelli@redhat.com,
	vincent.guittot@linaro.org, yury.norov@gmail.com,
	kprateek.nayak@amd.com, iii@linux.ibm.com, corbet@lwn.net
Cc: tglx@kernel.org, gregkh@linuxfoundation.org, pbonzini@redhat.com,
	seanjc@google.com, vschneid@redhat.com, huschle@linux.ibm.com,
	rostedt@goodmis.org, dietmar.eggemann@arm.com,
	maddy@linux.ibm.com, srikar@linux.ibm.com, hdanton@sina.com,
	chleroy@kernel.org, vineeth@bitbyteword.org, frederic@kernel.org,
	arighi@nvidia.com, pauld@redhat.com, christian.loehle@arm.com,
	tj@kernel.org, tommaso.cucinotta@gmail.com, maz@kernel.org,
	rafael@kernel.org, rdunlap@infradead.org, kernellwp@gmail.com,
	linux-doc@vger.kernel.org
Subject: Re: [PATCH v7 09/12] virt/steal_monitor: Add control knobs for handling steal values
Date: Fri, 10 Jul 2026 09:57:37 +0530	[thread overview]
Message-ID: <82e9b5e5-e19c-424a-933b-c6e351d44605@linux.ibm.com> (raw)
In-Reply-To: <20260709215648.1246821-10-sshegde@linux.ibm.com>



On 7/10/26 3:26 AM, Shrikanth Hegde wrote:
> These are the knobs to control the steal_monitor.
> 
> interval_ms:
> How often steal monitor checks for steal time.
> (Default: 1000 i.e 1 second)
> This controls how fast steal monitor driver reacts to changes to
> the contention of physical CPUs. Since it does a fair amount of
> work, setting too low will have overheads. Setting it too high
> might render the feature ineffective.
> Can be set between 10 to 100000. i.e. 10ms to 100seconds.
> 
> low_threshold:
> lower threshold value in percentage * 100.
> (Default: 200, i.e 2% steal is considered as low threshold)
> This determines what values should be considered as nil/no steal values.
> When steal monitor see steal time is below or equal to this value, it
> will increase the preferred CPUs by 1 core. Having value as zero
> might cause oscillations
> 
> high_threshold:
> higher threshold value in percentage * 100
> (Default: 500, i.e 5% steal is considered as high threshold)
> This determines what values should be considered as high steal values.
> When steal monitor sees steal time is higher than this value, it will
> reduce the preferred CPUs by 1 core.
> 
> module_param_cb methods are used to do the validation checks.
> This helps to ensure one configures sane values.
> Parameters values can't be changed at runtime. One has to unload
> the module and change it.
> 
> Also available at: Documentation/driver-api/steal-monitor.rst
> 
> Signed-off-by: Shrikanth Hegde <sshegde@linux.ibm.com>
> ---
> v6->v7:
> - Add module_param_cb to do parameter checks.
> - Make parameters read only after module load.
> 
> 
>   drivers/virt/steal_monitor/sm_core.c | 92 +++++++++++++++++++++++++++-
>   1 file changed, 91 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/virt/steal_monitor/sm_core.c b/drivers/virt/steal_monitor/sm_core.c
> index 180db424846c..4a03c14337be 100644
> --- a/drivers/virt/steal_monitor/sm_core.c
> +++ b/drivers/virt/steal_monitor/sm_core.c
> @@ -14,7 +14,97 @@
>   
>   #include "sm_core.h"
>   
> -struct steal_monitor sm_core_ctx;
> +struct steal_monitor sm_core_ctx = {
> +	.interval_ms = 1000,	/* 1 second */
> +	.high_threshold = 500,	/* 5% */
> +	.low_threshold = 200,	/* 2% */
> +};
> +
> +static int param_set_interval_ms(const char *val, const struct kernel_param *kp)
> +{
> +	unsigned int interval;
> +	int ret;
> +
> +	ret = kstrtouint(val, 0, &interval);
> +	if (ret)
> +		return ret;
> +
> +	if (interval < 10 || interval > 100000) {
> +		pr_err("steal_monitor: interval_ms must be between 10 and 100000\n");
> +		return -EINVAL;
> +	}
> +
> +	return param_set_uint(val, kp);
> +}
> +
> +static const struct kernel_param_ops interval_ms_ops = {
> +	.set = param_set_interval_ms,
> +	.get = param_get_uint,
> +};
> +
> +module_param_cb(interval_ms, &interval_ms_ops, &sm_core_ctx.interval_ms, 0444);
> +MODULE_PARM_DESC(interval_ms,
> +		 "Sampling frequency in milliseconds. default: 1000");
> +
> +static int param_set_high_threshold(const char *val, const struct kernel_param *kp)
> +{
> +	unsigned int threshold;
> +	int ret;
> +
> +	ret = kstrtouint(val, 0, &threshold);
> +	if (ret)
> +		return ret;
> +
> +	if (threshold <= sm_core_ctx.low_threshold) {
> +		pr_err("steal_monitor: high_threshold (%u) must be more than low_threshold (%u)\n",
> +		       threshold, sm_core_ctx.low_threshold);
> +		return -EINVAL;
> +	}
> +
> +	if (threshold >= 100 * 100) {
> +		pr_err("steal_monitor: high_threshold (%u) can't be more than 99.99%%\n",
> +		       threshold);
> +		return -EINVAL;
> +	}
> +
> +	return param_set_uint(val, kp);
> +}
> +
> +static const struct kernel_param_ops high_threshold_ops = {
> +	.set = param_set_high_threshold,
> +	.get = param_get_uint,
> +};
> +
> +module_param_cb(high_threshold, &high_threshold_ops, &sm_core_ctx.high_threshold, 0444);
> +MODULE_PARM_DESC(high_threshold,
> +		 "High steal threshold. default: 500 i.e 5%. Must be > low_threshold");
> +
> +static int param_set_low_threshold(const char *val, const struct kernel_param *kp)
> +{
> +	unsigned int threshold;
> +	int ret;
> +
> +	ret = kstrtouint(val, 0, &threshold);
> +	if (ret)
> +		return ret;
> +
> +	if (threshold >= sm_core_ctx.high_threshold) {
> +		pr_err("steal_monitor: low_threshold (%u) must be less than high_threshold (%u)\n",
> +		       threshold, sm_core_ctx.high_threshold);
> +		return -EINVAL;
> +	}
> +
> +	return param_set_uint(val, kp);
> +}
> +
> +static const struct kernel_param_ops low_threshold_ops = {
> +	.set = param_set_low_threshold,
> +	.get = param_get_uint,
> +};
> +
> +module_param_cb(low_threshold, &low_threshold_ops, &sm_core_ctx.low_threshold, 0444);
> +MODULE_PARM_DESC(low_threshold,
> +		 "Low steal threshold. default: 200 i.e 2%. Must be < high_threshold");
>  

As reported correctly by sashiko, below fails, but is a valid parameter set.
modprobe steal_monitor low_threshold=700 high_threshold=1500

Since low_threshold and high_thresholds are interdependent, I need to
defer this to steal_monitor_init. That's probably what yury mentioned
earlier, just that i didn't understand.

I think interval_ms, high_thresholds check can still be as module_param_cb
as they are independent.

I will fix it in v8.

Effectively diff:
---

diff --git a/drivers/virt/steal_monitor/sm_core.c b/drivers/virt/steal_monitor/sm_core.c
index 09a5c3a299c3..38007791a2dd 100644
--- a/drivers/virt/steal_monitor/sm_core.c
+++ b/drivers/virt/steal_monitor/sm_core.c
@@ -61,12 +61,6 @@ static int param_set_high_threshold(const char *val, const struct kernel_param *
         if (ret)
                 return ret;
  
-       if (threshold <= sm_core_ctx.low_threshold) {
-               pr_err("steal_monitor: high_threshold (%u) must be more than low_threshold (%u)\n",
-                      threshold, sm_core_ctx.low_threshold);
-               return -EINVAL;
-       }
-
         if (threshold >= 100 * 100) {
                 pr_err("steal_monitor: high_threshold (%u) can't be more than 99.99%%\n",
                        threshold);
@@ -85,30 +79,7 @@ module_param_cb(high_threshold, &high_threshold_ops, &sm_core_ctx.high_threshold
  MODULE_PARM_DESC(high_threshold,
                  "High steal threshold. default: 500 i.e 5%. Must be > low_threshold");
  
-static int param_set_low_threshold(const char *val, const struct kernel_param *kp)
-{
-       unsigned int threshold;
-       int ret;
-
-       ret = kstrtouint(val, 0, &threshold);
-       if (ret)
-               return ret;
-
-       if (threshold >= sm_core_ctx.high_threshold) {
-               pr_err("steal_monitor: low_threshold (%u) must be less than high_threshold (%u)\n",
-                      threshold, sm_core_ctx.high_threshold);
-               return -EINVAL;
-       }
-
-       return param_set_uint(val, kp);
-}
-
-static const struct kernel_param_ops low_threshold_ops = {
-       .set = param_set_low_threshold,
-       .get = param_get_uint,
-};
-
-module_param_cb(low_threshold, &low_threshold_ops, &sm_core_ctx.low_threshold, 0444);
+module_param_named(low_threshold, sm_core_ctx.low_threshold, uint, 0444);
  MODULE_PARM_DESC(low_threshold,
                  "Low steal threshold. default: 200 i.e 2%. Must be < high_threshold");
  
@@ -172,6 +143,11 @@ static void compute_preferred_cpus_work(struct work_struct *work)
  
  static int __init steal_monitor_init(void)
  {
+       if (sm_core_ctx.low_threshold >= sm_core_ctx.high_threshold) {
+               pr_err("steal_monitor: low_threshold (%u) must be less than high_threshold (%u)\n",
+                      sm_core_ctx.low_threshold, sm_core_ctx.high_threshold);
+               return -EINVAL;
+       }
         pr_info("steal_monitor is enabled. interval: %ums, high_threshold: %u, low_threshold: %u\n",
                 sm_core_ctx.interval_ms, sm_core_ctx.high_threshold, sm_core_ctx.low_threshold);
  


  
>   static int __init steal_monitor_init(void)
>   {


  reply	other threads:[~2026-07-10  4:28 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-09 21:56 [PATCH v7 00/12] sched, steal_monitor: Introduce cpu_preferred_mask and steal-driven vCPU backoff Shrikanth Hegde
2026-07-09 21:56 ` [PATCH v7 01/12] sched/docs: Document cpu_preferred_mask and Preferred CPU concept Shrikanth Hegde
2026-07-09 21:56 ` [PATCH v7 02/12] cpumask: Introduce cpu_preferred_mask Shrikanth Hegde
2026-07-13 14:53   ` Yury Norov
2026-07-14  6:30     ` Shrikanth Hegde
2026-07-14 13:01       ` Yury Norov
2026-07-09 21:56 ` [PATCH v7 03/12] sysfs: Add preferred CPU file Shrikanth Hegde
2026-07-10 15:41   ` Yury Norov
2026-07-10 17:00     ` Shrikanth Hegde
2026-07-10 23:09       ` Yury Norov
2026-07-13 12:00         ` Shrikanth Hegde
2026-07-09 21:56 ` [PATCH v7 04/12] sched/core: Try to use a preferred CPU in is_cpu_allowed Shrikanth Hegde
2026-07-09 21:56 ` [PATCH v7 05/12] sched/fair: Load balance only among preferred CPUs Shrikanth Hegde
2026-07-09 21:56 ` [PATCH v7 06/12] sched/core: Push current task from non preferred CPU Shrikanth Hegde
2026-07-10 23:02   ` Yury Norov
2026-07-13 12:35     ` Shrikanth Hegde
2026-07-09 21:56 ` [PATCH v7 07/12] sched/debug: Add migration stats due to non preferred CPUs Shrikanth Hegde
2026-07-09 21:56 ` [PATCH v7 08/12] virt: Introduce steal monitor driver Shrikanth Hegde
2026-07-10  1:27   ` Randy Dunlap
2026-07-10  4:28     ` Shrikanth Hegde
2026-07-10 20:53   ` Yury Norov
2026-07-13 12:06     ` Shrikanth Hegde
2026-07-09 21:56 ` [PATCH v7 09/12] virt/steal_monitor: Add control knobs for handling steal values Shrikanth Hegde
2026-07-10  4:27   ` Shrikanth Hegde [this message]
2026-07-09 21:56 ` [PATCH v7 10/12] virt/steal_monitor: Provide functions for managing " Shrikanth Hegde
2026-07-10  4:30   ` Shrikanth Hegde
2026-07-10 20:00   ` Yury Norov
2026-07-13  5:13     ` Shrikanth Hegde
2026-07-14 12:47       ` Yury Norov
2026-07-14 13:15         ` Shrikanth Hegde
2026-07-09 21:56 ` [PATCH v7 11/12] virt/steal_monitor: Act on steal time periodically and decide on preferred CPUs Shrikanth Hegde
2026-07-10 20:37   ` Yury Norov
2026-07-13  5:48     ` Shrikanth Hegde
2026-07-14 12:31       ` Yury Norov
2026-07-14 13:08         ` Shrikanth Hegde
2026-07-09 21:56 ` [PATCH v7 12/12] sched, virt/steal_monitor: Keep tick on for faster push on nohz_full CPU Shrikanth Hegde
2026-07-10  6:35   ` Shrikanth Hegde

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=82e9b5e5-e19c-424a-933b-c6e351d44605@linux.ibm.com \
    --to=sshegde@linux.ibm.com \
    --cc=arighi@nvidia.com \
    --cc=chleroy@kernel.org \
    --cc=christian.loehle@arm.com \
    --cc=corbet@lwn.net \
    --cc=dietmar.eggemann@arm.com \
    --cc=frederic@kernel.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=hdanton@sina.com \
    --cc=huschle@linux.ibm.com \
    --cc=iii@linux.ibm.com \
    --cc=juri.lelli@redhat.com \
    --cc=kernellwp@gmail.com \
    --cc=kprateek.nayak@amd.com \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=maddy@linux.ibm.com \
    --cc=maz@kernel.org \
    --cc=mingo@kernel.org \
    --cc=pauld@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=peterz@infradead.org \
    --cc=rafael@kernel.org \
    --cc=rdunlap@infradead.org \
    --cc=rostedt@goodmis.org \
    --cc=seanjc@google.com \
    --cc=srikar@linux.ibm.com \
    --cc=tglx@kernel.org \
    --cc=tj@kernel.org \
    --cc=tommaso.cucinotta@gmail.com \
    --cc=vincent.guittot@linaro.org \
    --cc=vineeth@bitbyteword.org \
    --cc=vschneid@redhat.com \
    --cc=yury.norov@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.