* [PATCH v3 0/3] chrt: Improve argument handling and allow optional priority
@ 2025-06-21 19:19 Madadi Vineeth Reddy
2025-06-21 19:19 ` [PATCH v3 1/3] chrt: Make minor cleanups in chrt Madadi Vineeth Reddy
` (2 more replies)
0 siblings, 3 replies; 5+ messages in thread
From: Madadi Vineeth Reddy @ 2025-06-21 19:19 UTC (permalink / raw)
To: util-linux, Karel Zak, Benno Schulenberg; +Cc: Madadi Vineeth Reddy
This series improves the usability and correctness of the chrt tool:
- Minor cleanups such as indentation fixes and correcting comment.
- Fixes an issue where specifying a policy without a priority would
misleadingly print current settings
- Makes the priority argument optional for scheduling policies that
ignore it, simplifying usage for tuning parameters like --sched-runtime
Changes in v3:
- Made --pid consistent throughout (Karel Zak)
- Change get policy to not have policy options (Karel Zak and Benno Schulenberg)
Changes in v2:
- Updated the man page to reflect the optional priority behavior (Karel Zak)
- Renamed variable to 'need_prio' (Karel Zak)
Madadi Vineeth Reddy (3):
chrt: Make minor cleanups in chrt
chrt: Only display current settings when no policy is specified
chrt: Make priority optional for policies that don't use it
schedutils/chrt.1.adoc | 24 +++++++++++++----------
schedutils/chrt.c | 43 +++++++++++++++++++++++++++++++++---------
2 files changed, 48 insertions(+), 19 deletions(-)
--
2.49.0
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v3 1/3] chrt: Make minor cleanups in chrt
2025-06-21 19:19 [PATCH v3 0/3] chrt: Improve argument handling and allow optional priority Madadi Vineeth Reddy
@ 2025-06-21 19:19 ` Madadi Vineeth Reddy
2025-06-21 19:19 ` [PATCH v3 2/3] chrt: Only display current settings when no policy is specified Madadi Vineeth Reddy
2025-06-21 19:19 ` [PATCH v3 3/3] chrt: Make priority optional for policies that don't use it Madadi Vineeth Reddy
2 siblings, 0 replies; 5+ messages in thread
From: Madadi Vineeth Reddy @ 2025-06-21 19:19 UTC (permalink / raw)
To: util-linux, Karel Zak, Benno Schulenberg; +Cc: Madadi Vineeth Reddy
Minor changes such as fixing an incorrect comment and aligning
the closing brace of an if condition in main() were made, along
with making the usage of --pid consistent across files instead
of -p, although -p still works, for better readability.
No functional change is intended.
Signed-off-by: Madadi Vineeth Reddy <vineethr@linux.ibm.com>
---
schedutils/chrt.1.adoc | 10 +++++-----
schedutils/chrt.c | 6 +++---
2 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/schedutils/chrt.1.adoc b/schedutils/chrt.1.adoc
index 77add535d..36cdcc5fe 100644
--- a/schedutils/chrt.1.adoc
+++ b/schedutils/chrt.1.adoc
@@ -40,7 +40,7 @@ chrt - manipulate the real-time attributes of a process
*chrt* [options] _priority command argument_ ...
-*chrt* [options] *-p* [_priority_] _PID_
+*chrt* [options] *--pid* [_priority_] _PID_
== DESCRIPTION
@@ -117,20 +117,20 @@ ____
//TRANSLATORS: Keep {colon} untranslated
You can also retrieve the real-time attributes of an existing task{colon}::
____
-*chrt -p* _PID_
+*chrt --pid* _PID_
____
//TRANSLATORS: Keep {colon} untranslated
Or set them{colon}::
____
-*chrt -r -p* _priority PID_
+*chrt -r --pid* _priority PID_
____
This, for example, sets real-time scheduling to priority _30_ for the process _PID_ with the *SCHED_RR* (round-robin) class{colon}::
____
-*chrt -r -p 30* _PID_
+*chrt -r --pid 30* _PID_
____
Reset priorities to default for a process{colon}::
____
-*chrt -o -p 0* _PID_
+*chrt -o --pid 0* _PID_
____
See *sched*(7) for a detailed discussion of the different scheduler classes and how they interact.
diff --git a/schedutils/chrt.c b/schedutils/chrt.c
index cf99935dc..8fe748f43 100644
--- a/schedutils/chrt.c
+++ b/schedutils/chrt.c
@@ -64,7 +64,7 @@ static void __attribute__((__noreturn__)) usage(void)
" chrt [options] --pid <priority> <pid>\n"), out);
fputs(USAGE_SEPARATOR, out);
fputs(_("Get policy:\n"
- " chrt [options] -p <pid>\n"), out);
+ " chrt [options] --pid <pid>\n"), out);
fputs(USAGE_SEPARATOR, out);
fputs(_("Policy options:\n"), out);
@@ -341,7 +341,7 @@ static int set_sched_one(struct chrt_ctl *ctl, pid_t pid)
return set_sched_one_by_setscheduler(ctl, pid);
}
-#else /* !HAVE_SCHED_SETATTR */
+#else /* HAVE_SCHED_SETATTR */
static int set_sched_one(struct chrt_ctl *ctl, pid_t pid)
{
struct sched_attr sa = { .size = sizeof(struct sched_attr) };
@@ -499,7 +499,7 @@ int main(int argc, char **argv)
((ctl->pid == -1) && argc - optind < 2)) {
warnx(_("bad usage"));
errtryhelp(EXIT_FAILURE);
-}
+ }
if ((ctl->pid > -1) && (ctl->verbose || argc - optind == 1)) {
show_sched_info(ctl);
--
2.49.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v3 2/3] chrt: Only display current settings when no policy is specified
2025-06-21 19:19 [PATCH v3 0/3] chrt: Improve argument handling and allow optional priority Madadi Vineeth Reddy
2025-06-21 19:19 ` [PATCH v3 1/3] chrt: Make minor cleanups in chrt Madadi Vineeth Reddy
@ 2025-06-21 19:19 ` Madadi Vineeth Reddy
2025-06-21 19:27 ` Madadi Vineeth Reddy
2025-06-21 19:19 ` [PATCH v3 3/3] chrt: Make priority optional for policies that don't use it Madadi Vineeth Reddy
2 siblings, 1 reply; 5+ messages in thread
From: Madadi Vineeth Reddy @ 2025-06-21 19:19 UTC (permalink / raw)
To: util-linux, Karel Zak, Benno Schulenberg; +Cc: Madadi Vineeth Reddy
Previously, running "chrt --pid <pid>" with no policy options
would display the process’s current scheduling attributes, but
specifying a policy without a priority (e.g. chrt --rr --pid <pid>)
would silently fallback to displaying the same info. This was
confusing, since a policy option normally implies an intent to
change something.
This patch changes the behavior so that
chrt --pid <pid> continues to show the current settings:
chrt --pid 10862
pid 10862's current scheduling policy: SCHED_OTHER
pid 10862's current scheduling priority: 0
pid 10862's current runtime parameter: 2800000
If a policy is specified but no priority follows, chrt now
errors out:
chrt --rr --pid 10862
chrt: policy SCHED_RR requires a priority argument
Verbose output (-v) still prints the current settings when a
valid policy+priority is provided.
Signed-off-by: Madadi Vineeth Reddy <vineethr@linux.ibm.com>
---
schedutils/chrt.c | 25 +++++++++++++++++++++----
1 file changed, 21 insertions(+), 4 deletions(-)
diff --git a/schedutils/chrt.c b/schedutils/chrt.c
index 8fe748f43..40a006040 100644
--- a/schedutils/chrt.c
+++ b/schedutils/chrt.c
@@ -64,7 +64,7 @@ static void __attribute__((__noreturn__)) usage(void)
" chrt [options] --pid <priority> <pid>\n"), out);
fputs(USAGE_SEPARATOR, out);
fputs(_("Get policy:\n"
- " chrt [options] --pid <pid>\n"), out);
+ " chrt --pid <pid>\n"), out);
fputs(USAGE_SEPARATOR, out);
fputs(_("Policy options:\n"), out);
@@ -399,6 +399,7 @@ int main(int argc, char **argv)
{
struct chrt_ctl _ctl = { .pid = -1, .policy = SCHED_RR }, *ctl = &_ctl;
int c;
+ bool policy_given = false;
static const struct option longopts[] = {
{ "all-tasks", no_argument, NULL, 'a' },
@@ -435,21 +436,25 @@ int main(int argc, char **argv)
case 'b':
#ifdef SCHED_BATCH
ctl->policy = SCHED_BATCH;
+ policy_given = true;
#endif
break;
case 'd':
#ifdef SCHED_DEADLINE
ctl->policy = SCHED_DEADLINE;
+ policy_given = true;
#endif
break;
case 'e':
#ifdef SCHED_EXT
ctl->policy = SCHED_EXT;
+ policy_given = true;
#endif
break;
case 'f':
ctl->policy = SCHED_FIFO;
+ policy_given = true;
break;
case 'R':
ctl->reset_on_fork = 1;
@@ -457,6 +462,7 @@ int main(int argc, char **argv)
case 'i':
#ifdef SCHED_IDLE
ctl->policy = SCHED_IDLE;
+ policy_given = true;
#endif
break;
case 'm':
@@ -464,6 +470,7 @@ int main(int argc, char **argv)
return EXIT_SUCCESS;
case 'o':
ctl->policy = SCHED_OTHER;
+ policy_given = true;
break;
case 'p':
errno = 0;
@@ -472,6 +479,7 @@ int main(int argc, char **argv)
break;
case 'r':
ctl->policy = SCHED_RR;
+ policy_given = true;
break;
case 'v':
ctl->verbose = 1;
@@ -501,12 +509,21 @@ int main(int argc, char **argv)
errtryhelp(EXIT_FAILURE);
}
- if ((ctl->pid > -1) && (ctl->verbose || argc - optind == 1)) {
+ /*pid exists but priority not given*/
+ if (ctl->pid > -1 && argc - optind == 1) {
+ /* Error if a policy was specified but no priority given */
+ if (policy_given)
+ errx(EXIT_FAILURE, ("policy %s requires a priority argument"),
+ get_policy_name(ctl->policy));
+
+ /* If no policy specified, show current settings */
show_sched_info(ctl);
- if (argc - optind == 1)
- return EXIT_SUCCESS;
+ return EXIT_SUCCESS;
}
+ if (ctl->verbose)
+ show_sched_info(ctl);
+
errno = 0;
ctl->priority = strtos32_or_err(argv[optind], _("invalid priority argument"));
--
2.49.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v3 3/3] chrt: Make priority optional for policies that don't use it
2025-06-21 19:19 [PATCH v3 0/3] chrt: Improve argument handling and allow optional priority Madadi Vineeth Reddy
2025-06-21 19:19 ` [PATCH v3 1/3] chrt: Make minor cleanups in chrt Madadi Vineeth Reddy
2025-06-21 19:19 ` [PATCH v3 2/3] chrt: Only display current settings when no policy is specified Madadi Vineeth Reddy
@ 2025-06-21 19:19 ` Madadi Vineeth Reddy
2 siblings, 0 replies; 5+ messages in thread
From: Madadi Vineeth Reddy @ 2025-06-21 19:19 UTC (permalink / raw)
To: util-linux, Karel Zak, Benno Schulenberg; +Cc: Madadi Vineeth Reddy
Currently, chrt requires a priority argument even for scheduling
policies like SCHED_OTHER and SCHED_BATCH, which ignore it.
This change relaxes that requirement. Now, priority is only expected
for SCHED_FIFO and SCHED_RR. For other policies, a default value of 0
is set internally and no argument is required on the command line.
This simplifies usage when modifying runtime parameters like
--sched-runtime for non-realtime tasks.
For example, to change the EEVDF tunable base_slice, one currently
needs to run:
chrt -o -T 1000000 --pid 0 $PID
Passing '0' after --pid is not intutive and not required as priority
is not applicable to SCHED_OTHER tasks. Now with this patch, one can do:
chrt -o -T 1000000 --pid $PID
Passing '0' still works ensuring ABI doesn't break.
Signed-off-by: Madadi Vineeth Reddy <vineethr@linux.ibm.com>
---
schedutils/chrt.1.adoc | 14 +++++++++-----
schedutils/chrt.c | 24 ++++++++++++++++--------
2 files changed, 25 insertions(+), 13 deletions(-)
diff --git a/schedutils/chrt.1.adoc b/schedutils/chrt.1.adoc
index 36cdcc5fe..5b8d7e832 100644
--- a/schedutils/chrt.1.adoc
+++ b/schedutils/chrt.1.adoc
@@ -49,7 +49,7 @@ chrt - manipulate the real-time attributes of a process
== POLICIES
*-o*, *--other*::
-Set scheduling policy to *SCHED_OTHER* (time-sharing scheduling). This is the default Linux scheduling policy.
+Set scheduling policy to *SCHED_OTHER* (time-sharing scheduling). This is the default Linux scheduling policy. Since util-linux v2.42, the priority argument is optional; if specified, it must be set to zero.
*-f*, *--fifo*::
Set scheduling policy to *SCHED_FIFO* (first in-first out).
@@ -58,16 +58,16 @@ Set scheduling policy to *SCHED_FIFO* (first in-first out).
Set scheduling policy to *SCHED_RR* (round-robin scheduling). When no policy is defined, the *SCHED_RR* is used as the default.
*-b*, *--batch*::
-Set scheduling policy to *SCHED_BATCH* (scheduling batch processes). Linux-specific, supported since 2.6.16. The priority argument has to be set to zero.
+Set scheduling policy to *SCHED_BATCH* (scheduling batch processes). Linux-specific, supported since 2.6.16. Since util-linux v2.42, the priority argument is optional; if specified, it must be set to zero.
*-i*, *--idle*::
-Set scheduling policy to *SCHED_IDLE* (scheduling very low priority jobs). Linux-specific, supported since 2.6.23. The priority argument has to be set to zero.
+Set scheduling policy to *SCHED_IDLE* (scheduling very low priority jobs). Linux-specific, supported since 2.6.23. Since util-linux v2.42, the priority argument is optional; if specified, it must be set to zero.
*-d*, *--deadline*::
-Set scheduling policy to *SCHED_DEADLINE* (sporadic task model deadline scheduling). Linux-specific, supported since 3.14. The priority argument has to be set to zero. See also *--sched-runtime*, *--sched-deadline* and *--sched-period*. The relation between the options required by the kernel is runtime <= deadline <= period. *chrt* copies _period_ to _deadline_ if *--sched-deadline* is not specified and _deadline_ to _runtime_ if *--sched-runtime* is not specified. It means that at least *--sched-period* has to be specified. See *sched*(7) for more details.
+Set scheduling policy to *SCHED_DEADLINE* (sporadic task model deadline scheduling). Linux-specific, supported since 3.14. Since util-linux v2.42, the priority argument is optional; if specified, it must be set to zero. See also *--sched-runtime*, *--sched-deadline* and *--sched-period*. The relation between the options required by the kernel is runtime <= deadline <= period. *chrt* copies _period_ to _deadline_ if *--sched-deadline* is not specified and _deadline_ to _runtime_ if *--sched-runtime* is not specified. It means that at least *--sched-period* has to be specified. See *sched*(7) for more details.
*-d*, *--ext*::
-Set scheduling policy to *SCHED_EXT* (BPF program-defined scheduling). Linux-specific, supported since 6.12. The priority argument has to be set to zero.
+Set scheduling policy to *SCHED_EXT* (BPF program-defined scheduling). Linux-specific, supported since 6.12. Since util-linux v2.42, the priority argument is optional; if specified, it must be set to zero.
== SCHEDULING OPTIONS
@@ -132,6 +132,10 @@ Reset priorities to default for a process{colon}::
____
*chrt -o --pid 0* _PID_
____
+Set a custom slice of 1 ms for a SCHED_OTHER task (priority is optional for policies other than SCHED_FIFO and SCHED_RR){colon}::
+____
+*chrt -o -T 1000000 --pid* _PID_
+____
See *sched*(7) for a detailed discussion of the different scheduler classes and how they interact.
== PERMISSIONS
diff --git a/schedutils/chrt.c b/schedutils/chrt.c
index 40a006040..04582ae72 100644
--- a/schedutils/chrt.c
+++ b/schedutils/chrt.c
@@ -399,7 +399,7 @@ int main(int argc, char **argv)
{
struct chrt_ctl _ctl = { .pid = -1, .policy = SCHED_RR }, *ctl = &_ctl;
int c;
- bool policy_given = false;
+ bool policy_given = false, need_prio = false;
static const struct option longopts[] = {
{ "all-tasks", no_argument, NULL, 'a' },
@@ -455,6 +455,7 @@ int main(int argc, char **argv)
case 'f':
ctl->policy = SCHED_FIFO;
policy_given = true;
+ need_prio = true;
break;
case 'R':
ctl->reset_on_fork = 1;
@@ -480,6 +481,7 @@ int main(int argc, char **argv)
case 'r':
ctl->policy = SCHED_RR;
policy_given = true;
+ need_prio = true;
break;
case 'v':
ctl->verbose = 1;
@@ -503,29 +505,35 @@ int main(int argc, char **argv)
}
}
- if (((ctl->pid > -1) && argc - optind < 1) ||
- ((ctl->pid == -1) && argc - optind < 2)) {
+ if (((ctl->pid > -1) && argc - optind < (need_prio ? 1 : 0)) ||
+ ((ctl->pid == -1) && argc - optind < (need_prio ? 2 : 1))) {
warnx(_("bad usage"));
errtryhelp(EXIT_FAILURE);
}
/*pid exists but priority not given*/
if (ctl->pid > -1 && argc - optind == 1) {
- /* Error if a policy was specified but no priority given */
- if (policy_given)
+ /* Error if priority is missing for a policy that requires it */
+ if (policy_given && need_prio)
errx(EXIT_FAILURE, ("policy %s requires a priority argument"),
get_policy_name(ctl->policy));
/* If no policy specified, show current settings */
- show_sched_info(ctl);
- return EXIT_SUCCESS;
+ if (!policy_given) {
+ show_sched_info(ctl);
+ return EXIT_SUCCESS;
+ }
}
if (ctl->verbose)
show_sched_info(ctl);
errno = 0;
- ctl->priority = strtos32_or_err(argv[optind], _("invalid priority argument"));
+
+ if (need_prio || argc - optind == 2)
+ ctl->priority = strtos32_or_err(argv[optind], _("invalid priority argument"));
+ else
+ ctl->priority = 0;
if (ctl->runtime && !supports_runtime_param(ctl->policy))
errx(EXIT_FAILURE, _("--sched-runtime option is supported for %s"),
--
2.49.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v3 2/3] chrt: Only display current settings when no policy is specified
2025-06-21 19:19 ` [PATCH v3 2/3] chrt: Only display current settings when no policy is specified Madadi Vineeth Reddy
@ 2025-06-21 19:27 ` Madadi Vineeth Reddy
0 siblings, 0 replies; 5+ messages in thread
From: Madadi Vineeth Reddy @ 2025-06-21 19:27 UTC (permalink / raw)
To: util-linux, Karel Zak, Benno Schulenberg
On 22/06/25 00:49, Madadi Vineeth Reddy wrote:
> Previously, running "chrt --pid <pid>" with no policy options
> would display the process’s current scheduling attributes, but
> specifying a policy without a priority (e.g. chrt --rr --pid <pid>)
> would silently fallback to displaying the same info. This was
> confusing, since a policy option normally implies an intent to
> change something.
>
> This patch changes the behavior so that
> chrt --pid <pid> continues to show the current settings:
>
> chrt --pid 10862
> pid 10862's current scheduling policy: SCHED_OTHER
> pid 10862's current scheduling priority: 0
> pid 10862's current runtime parameter: 2800000
>
> If a policy is specified but no priority follows, chrt now
> errors out:
>
> chrt --rr --pid 10862
> chrt: policy SCHED_RR requires a priority argument
>
> Verbose output (-v) still prints the current settings when a
> valid policy+priority is provided.
>
> Signed-off-by: Madadi Vineeth Reddy <vineethr@linux.ibm.com>
> ---
> schedutils/chrt.c | 25 +++++++++++++++++++++----
> 1 file changed, 21 insertions(+), 4 deletions(-)
>
> diff --git a/schedutils/chrt.c b/schedutils/chrt.c
> index 8fe748f43..40a006040 100644
> --- a/schedutils/chrt.c
> +++ b/schedutils/chrt.c
> @@ -64,7 +64,7 @@ static void __attribute__((__noreturn__)) usage(void)
> " chrt [options] --pid <priority> <pid>\n"), out);
> fputs(USAGE_SEPARATOR, out);
> fputs(_("Get policy:\n"
> - " chrt [options] --pid <pid>\n"), out);
> + " chrt --pid <pid>\n"), out);
>
> fputs(USAGE_SEPARATOR, out);
> fputs(_("Policy options:\n"), out);
> @@ -399,6 +399,7 @@ int main(int argc, char **argv)
> {
> struct chrt_ctl _ctl = { .pid = -1, .policy = SCHED_RR }, *ctl = &_ctl;
> int c;
> + bool policy_given = false;
>
> static const struct option longopts[] = {
> { "all-tasks", no_argument, NULL, 'a' },
> @@ -435,21 +436,25 @@ int main(int argc, char **argv)
> case 'b':
> #ifdef SCHED_BATCH
> ctl->policy = SCHED_BATCH;
> + policy_given = true;
> #endif
> break;
>
> case 'd':
> #ifdef SCHED_DEADLINE
> ctl->policy = SCHED_DEADLINE;
> + policy_given = true;
> #endif
> break;
> case 'e':
> #ifdef SCHED_EXT
> ctl->policy = SCHED_EXT;
> + policy_given = true;
> #endif
> break;
> case 'f':
> ctl->policy = SCHED_FIFO;
> + policy_given = true;
> break;
> case 'R':
> ctl->reset_on_fork = 1;
> @@ -457,6 +462,7 @@ int main(int argc, char **argv)
> case 'i':
> #ifdef SCHED_IDLE
> ctl->policy = SCHED_IDLE;
> + policy_given = true;
> #endif
> break;
> case 'm':
> @@ -464,6 +470,7 @@ int main(int argc, char **argv)
> return EXIT_SUCCESS;
> case 'o':
> ctl->policy = SCHED_OTHER;
> + policy_given = true;
> break;
> case 'p':
> errno = 0;
> @@ -472,6 +479,7 @@ int main(int argc, char **argv)
> break;
> case 'r':
> ctl->policy = SCHED_RR;
> + policy_given = true;
> break;
> case 'v':
> ctl->verbose = 1;
> @@ -501,12 +509,21 @@ int main(int argc, char **argv)
> errtryhelp(EXIT_FAILURE);
> }
>
> - if ((ctl->pid > -1) && (ctl->verbose || argc - optind == 1)) {
> + /*pid exists but priority not given*/
Missed spacing in the comment. Ignore this v3. Please refer to v4.
> + if (ctl->pid > -1 && argc - optind == 1) {
> + /* Error if a policy was specified but no priority given */
> + if (policy_given)
> + errx(EXIT_FAILURE, ("policy %s requires a priority argument"),
> + get_policy_name(ctl->policy));
> +
> + /* If no policy specified, show current settings */
> show_sched_info(ctl);
> - if (argc - optind == 1)
> - return EXIT_SUCCESS;
> + return EXIT_SUCCESS;
> }
>
> + if (ctl->verbose)
> + show_sched_info(ctl);
> +
> errno = 0;
> ctl->priority = strtos32_or_err(argv[optind], _("invalid priority argument"));
>
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2025-06-21 19:36 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-06-21 19:19 [PATCH v3 0/3] chrt: Improve argument handling and allow optional priority Madadi Vineeth Reddy
2025-06-21 19:19 ` [PATCH v3 1/3] chrt: Make minor cleanups in chrt Madadi Vineeth Reddy
2025-06-21 19:19 ` [PATCH v3 2/3] chrt: Only display current settings when no policy is specified Madadi Vineeth Reddy
2025-06-21 19:27 ` Madadi Vineeth Reddy
2025-06-21 19:19 ` [PATCH v3 3/3] chrt: Make priority optional for policies that don't use it Madadi Vineeth Reddy
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).