chrt: do not segfault if policy number is unknown
While at it, improve help text function old new delta packed_usage 33319 33344 +25 policy_name - 22 +22 show_min_max 59 64 +5 chrt_main 432 429 -3 policies 72 - -72 ------------------------------------------------------------------------------ (add/remove: 1/1 grow/shrink: 2/1 up/down: 52/-75) Total: -23 bytes text data bss dec hex filename 982150 485 7296 989931 f1aeb busybox_old 982183 485 7296 989964 f1b0c busybox_unstripped Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
29c2dcfe1c
commit
ae5ca6fc41
@ -17,16 +17,16 @@
|
|||||||
//kbuild:lib-$(CONFIG_CHRT) += chrt.o
|
//kbuild:lib-$(CONFIG_CHRT) += chrt.o
|
||||||
|
|
||||||
//usage:#define chrt_trivial_usage
|
//usage:#define chrt_trivial_usage
|
||||||
//usage: "[-prfombi] [PRIO] [PID | PROG ARGS]"
|
//usage: "-m | -p [PRIO] PID | [-rfobi] PRIO PROG [ARGS]"
|
||||||
//usage:#define chrt_full_usage "\n\n"
|
//usage:#define chrt_full_usage "\n\n"
|
||||||
//usage: "Change scheduling priority and class for a process\n"
|
//usage: "Change scheduling priority and class for a process\n"
|
||||||
|
//usage: "\n -m Show min/max priorities"
|
||||||
//usage: "\n -p Operate on PID"
|
//usage: "\n -p Operate on PID"
|
||||||
//usage: "\n -r Set SCHED_RR class"
|
//usage: "\n -r Set SCHED_RR class"
|
||||||
//usage: "\n -f Set SCHED_FIFO class"
|
//usage: "\n -f Set SCHED_FIFO class"
|
||||||
//usage: "\n -o Set SCHED_OTHER class"
|
//usage: "\n -o Set SCHED_OTHER class"
|
||||||
//usage: "\n -b Set SCHED_BATCH class"
|
//usage: "\n -b Set SCHED_BATCH class"
|
||||||
//usage: "\n -i Set SCHED_IDLE class"
|
//usage: "\n -i Set SCHED_IDLE class"
|
||||||
//usage: "\n -m Show min/max priorities"
|
|
||||||
//usage:
|
//usage:
|
||||||
//usage:#define chrt_example_usage
|
//usage:#define chrt_example_usage
|
||||||
//usage: "$ chrt -r 4 sleep 900; x=$!\n"
|
//usage: "$ chrt -r 4 sleep 900; x=$!\n"
|
||||||
@ -39,28 +39,32 @@
|
|||||||
# define SCHED_IDLE 5
|
# define SCHED_IDLE 5
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static const struct {
|
static const char *policy_name(int pol)
|
||||||
char name[sizeof("SCHED_OTHER")];
|
{
|
||||||
} policies[] = {
|
if (pol > 6)
|
||||||
{ "SCHED_OTHER" }, /* 0:SCHED_OTHER */
|
return utoa(pol);
|
||||||
{ "SCHED_FIFO" }, /* 1:SCHED_FIFO */
|
return nth_string(
|
||||||
{ "SCHED_RR" }, /* 2:SCHED_RR */
|
"OTHER" "\0" /* 0:SCHED_OTHER */
|
||||||
{ "SCHED_BATCH" }, /* 3:SCHED_BATCH */
|
"FIFO" "\0" /* 1:SCHED_FIFO */
|
||||||
{ "" }, /* 4:SCHED_ISO */
|
"RR" "\0" /* 2:SCHED_RR */
|
||||||
{ "SCHED_IDLE" }, /* 5:SCHED_IDLE */
|
"BATCH" "\0" /* 3:SCHED_BATCH */
|
||||||
/* 6:SCHED_DEADLINE */
|
"ISO" "\0" /* 4:SCHED_ISO */
|
||||||
};
|
"IDLE" "\0" /* 5:SCHED_IDLE */
|
||||||
|
"DEADLINE", /* 6:SCHED_DEADLINE */
|
||||||
|
pol
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
static void show_min_max(int pol)
|
static void show_min_max(int pol)
|
||||||
{
|
{
|
||||||
const char *fmt = "%s min/max priority\t: %u/%u\n";
|
const char *fmt = "SCHED_%s min/max priority\t: %u/%u\n";
|
||||||
int max, min;
|
int max, min;
|
||||||
|
|
||||||
max = sched_get_priority_max(pol);
|
max = sched_get_priority_max(pol);
|
||||||
min = sched_get_priority_min(pol);
|
min = sched_get_priority_min(pol);
|
||||||
if ((max|min) < 0)
|
if ((max|min) < 0)
|
||||||
fmt = "%s not supported\n";
|
fmt = "SCHED_%s not supported\n";
|
||||||
printf(fmt, policies[pol].name, min, max);
|
printf(fmt, policy_name(pol), min, max);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define OPT_m (1<<0)
|
#define OPT_m (1<<0)
|
||||||
@ -112,11 +116,11 @@ int chrt_main(int argc UNUSED_PARAM, char **argv)
|
|||||||
bb_show_usage();
|
bb_show_usage();
|
||||||
if (opt & OPT_p) {
|
if (opt & OPT_p) {
|
||||||
pid_str = *argv++;
|
pid_str = *argv++;
|
||||||
if (*argv) { /* "-p <priority> <pid> [...]" */
|
if (*argv) { /* "-p PRIO PID [...]" */
|
||||||
priority = pid_str;
|
priority = pid_str;
|
||||||
pid_str = *argv;
|
pid_str = *argv;
|
||||||
}
|
}
|
||||||
/* else "-p <pid>", and *argv == NULL */
|
/* else "-p PID", and *argv == NULL */
|
||||||
pid = xatoul_range(pid_str, 1, ((unsigned)(pid_t)ULONG_MAX) >> 1);
|
pid = xatoul_range(pid_str, 1, ((unsigned)(pid_t)ULONG_MAX) >> 1);
|
||||||
} else {
|
} else {
|
||||||
priority = *argv++;
|
priority = *argv++;
|
||||||
@ -130,16 +134,18 @@ int chrt_main(int argc UNUSED_PARAM, char **argv)
|
|||||||
print_rt_info:
|
print_rt_info:
|
||||||
pol = sched_getscheduler(pid);
|
pol = sched_getscheduler(pid);
|
||||||
if (pol < 0)
|
if (pol < 0)
|
||||||
bb_perror_msg_and_die("can't %cet pid %d's policy", 'g', (int)pid);
|
bb_perror_msg_and_die("can't %cet pid %u's policy", 'g', (int)pid);
|
||||||
printf("pid %d's %s scheduling policy: %s\n",
|
printf("pid %u's %s scheduling policy: SCHED_%s\n",
|
||||||
pid, current_new, policies[pol].name);
|
pid, current_new, policy_name(pol)
|
||||||
|
);
|
||||||
if (sched_getparam(pid, &sp))
|
if (sched_getparam(pid, &sp))
|
||||||
bb_perror_msg_and_die("can't get pid %d's attributes", (int)pid);
|
bb_perror_msg_and_die("can't get pid %u's attributes", (int)pid);
|
||||||
printf("pid %d's %s scheduling priority: %d\n",
|
printf("pid %u's %s scheduling priority: %d\n",
|
||||||
(int)pid, current_new, sp.sched_priority);
|
(int)pid, current_new, sp.sched_priority
|
||||||
|
);
|
||||||
if (!*argv) {
|
if (!*argv) {
|
||||||
/* Either it was just "-p <pid>",
|
/* Either it was just "-p PID",
|
||||||
* or it was "-p <priority> <pid>" and we came here
|
* or it was "-p PRIO PID" and we came here
|
||||||
* for the second time (see goto below) */
|
* for the second time (see goto below) */
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
@ -152,9 +158,9 @@ int chrt_main(int argc UNUSED_PARAM, char **argv)
|
|||||||
);
|
);
|
||||||
|
|
||||||
if (sched_setscheduler(pid, policy, &sp) < 0)
|
if (sched_setscheduler(pid, policy, &sp) < 0)
|
||||||
bb_perror_msg_and_die("can't %cet pid %d's policy", 's', (int)pid);
|
bb_perror_msg_and_die("can't %cet pid %u's policy", 's', (int)pid);
|
||||||
|
|
||||||
if (!argv[0]) /* "-p <priority> <pid> [...]" */
|
if (!argv[0]) /* "-p PRIO PID [...]" */
|
||||||
goto print_rt_info;
|
goto print_rt_info;
|
||||||
|
|
||||||
BB_EXECVP_or_die(argv);
|
BB_EXECVP_or_die(argv);
|
||||||
|
Loading…
Reference in New Issue
Block a user