On 06/19/2016 04:58 PM, AGATE Stephen wrote:
> This patch adds the following real-time format specifiers to the "-o"
> option for the ps command:
> psr Processor that process is currently assigned to
> rtprio Realtime priority
> sched Scheduling policy (0, 1, 2, 3, 4, 5)
> policy Scheduling class (TS, FF, RR, B, ISO, IDL, ?)
>
> Usage is something like: ps -T -o pid,rtprio,psr,policy,args
>
> function old new delta
> .rodata 156133 156361 +228
> out_spec 512 640 +128
> policy_name - 56 +56
> procps_scan 1099 1142 +43
> func_policy - 42 +42
> func_sched - 20 +20
> func_rtprio - 20 +20
> func_psr - 20 +20
> find_out_spec 130 136 +6
> ------------------------------------------------------------------------------
> (add/remove: 5/0 grow/shrink: 4/0 up/down: 563/0) Total: 563 bytes
>
> Signed-off-by: Stephen Agate <[email protected]>
> ---
> include/libbb.h | 8 +++++++-
> libbb/procps.c | 75
> +++++++++++++++++++++++++++++++--------------------------------------------
> procps/Config.src | 7 +++++++
> procps/ps.c | 44 +++++++++++++++++++++++++++++++++++++++-----
> procps/top.c | 2 +-
> 5 files changed, 85 insertions(+), 51 deletions(-)
>
> diff --git a/include/libbb.h b/include/libbb.h
> index a21f420..80295e7 100644
> --- a/include/libbb.h
> +++ b/include/libbb.h
> @@ -1650,6 +1650,10 @@ typedef struct procps_status_t {
> #if ENABLE_FEATURE_TOP_SMP_PROCESS
> int last_seen_on_cpu;
> #endif
> +#if ENABLE_FEATURE_PS_REALTIME
> + unsigned rtprio;
> + unsigned sched;
> +#endif
> } procps_status_t;
> /* flag bits for procps_scan(xx, flags) calls */
> enum {
> @@ -1678,10 +1682,12 @@ enum {
> ),
> PSSCAN_CONTEXT = (1 << 17) * ENABLE_SELINUX,
> PSSCAN_START_TIME = 1 << 18,
> - PSSCAN_CPU = (1 << 19) * ENABLE_FEATURE_TOP_SMP_PROCESS,
> + PSSCAN_PSR = (1 << 19) * ENABLE_FEATURE_TOP_SMP_PROCESS,
> PSSCAN_NICE = (1 << 20) * ENABLE_FEATURE_PS_ADDITIONAL_COLUMNS,
> PSSCAN_RUIDGID = (1 << 21) * ENABLE_FEATURE_PS_ADDITIONAL_COLUMNS,
> PSSCAN_TASKS = (1 << 22) * ENABLE_FEATURE_SHOW_THREADS,
> + PSSCAN_RTPRIO = (1 << 23) * ENABLE_FEATURE_PS_REALTIME,
> + PSSCAN_SCHED = (1 << 24) * ENABLE_FEATURE_PS_REALTIME,
> };
> //procps_status_t* alloc_procps_scan(void) FAST_FUNC;
> void free_procps_scan(procps_status_t* sp) FAST_FUNC;
> diff --git a/libbb/procps.c b/libbb/procps.c
> index 4edc54d..f4f5888 100644
> --- a/libbb/procps.c
> +++ b/libbb/procps.c
> @@ -368,7 +368,8 @@ procps_status_t* FAST_FUNC procps_scan(procps_status_t*
> sp, int flags)
> | PSSCAN_VSZ | PSSCAN_RSS
> | PSSCAN_STIME | PSSCAN_UTIME | PSSCAN_START_TIME
> | PSSCAN_TTY | PSSCAN_NICE
> - | PSSCAN_CPU)
> + | PSSCAN_PSR
> + | PSSCAN_RTPRIO | PSSCAN_SCHED)
> ) {
> char *cp, *comm1;
> int tty;
> @@ -401,11 +402,18 @@ procps_status_t* FAST_FUNC procps_scan(procps_status_t*
> sp, int flags)
> "%lu " /* start_time */
> "%lu " /* vsize */
> "%lu " /* rss */
> -# if ENABLE_FEATURE_TOP_SMP_PROCESS
> +# if ENABLE_FEATURE_TOP_SMP_PROCESS || ENABLE_FEATURE_PS_REALTIME
> "%*s %*s %*s %*s %*s %*s " /*rss_rlim,
> start_code, end_code, start_stack, kstk_esp, kstk_eip */
> "%*s %*s %*s %*s " /*signal, blocked,
> sigignore, sigcatch */
> "%*s %*s %*s %*s " /*wchan, nswap,
> cnswap, exit_signal */
> - "%d" /*cpu last seen on*/
> +# if ENABLE_FEATURE_TOP_SMP_PROCESS
> + "%d" /*cpu last seen on */
> +# else
> + " %*s" /*cpu last seen on */
> +# endif
> +# if ENABLE_FEATURE_PS_REALTIME
> + " %u %u" /* rt_priority,
> policy */
> +# endif
> # endif
> ,
> sp->state, &sp->ppid,
> @@ -418,14 +426,23 @@ procps_status_t* FAST_FUNC procps_scan(procps_status_t*
> sp, int flags)
> # if ENABLE_FEATURE_TOP_SMP_PROCESS
> , &sp->last_seen_on_cpu
> # endif
> +# if ENABLE_FEATURE_PS_REALTIME
> + , &sp->rtprio, &sp->sched
> +# endif
> );
>
> if (n < 11)
> continue; /* bogus data, get next /proc/XXX */
> # if ENABLE_FEATURE_TOP_SMP_PROCESS
> - if (n == 11)
> + if (n < 12)
> sp->last_seen_on_cpu = 0;
> # endif
> +# if ENABLE_FEATURE_PS_REALTIME
> + if (n < (ENABLE_FEATURE_TOP_SMP_PROCESS?14:13)) {
> + sp->rtprio = 0;
> + sp->sched = 0;
> + }
> +# endif
>
> /* vsz is in bytes and we want kb */
> sp->vsz = vsz >> 10;
> @@ -455,13 +472,21 @@ procps_status_t* FAST_FUNC procps_scan(procps_status_t*
> sp, int flags)
> sp->vsz = fast_strtoul_10(&cp) >> 10;
> /* vsz is in bytes but rss is in *PAGES*! Can you
> believe that? */
> sp->rss = fast_strtoul_10(&cp) << sp->shift_pages_to_kb;
> -# if ENABLE_FEATURE_TOP_SMP_PROCESS
> +# if ENABLE_FEATURE_TOP_SMP_PROCESS || ENABLE_FEATURE_PS_REALTIME
> /* (6): rss_rlim, start_code, end_code, start_stack,
> kstk_esp, kstk_eip */
> /* (4): signal, blocked, sigignore, sigcatch */
> /* (4): wchan, nswap, cnswap, exit_signal */
> cp = skip_fields(cp, 14);
> -//FIXME: is it safe to assume this field exists?
> +//FIXME: is it safe to assume these fields exists (i.e. Linux > 2.5.19)?
> +# if ENABLE_FEATURE_TOP_SMP_PROCESS
> sp->last_seen_on_cpu = fast_strtoul_10(&cp);
> +# else
> + cp = skip_fields(cp, 1);
> +# endif
> +# if ENABLE_FEATURE_PS_REALTIME
> + sp->rtprio = (unsigned)fast_strtoul_10(&cp);
> + sp->sched = (unsigned)fast_strtoul_10(&cp);
> +# endif
> # endif
> #endif /* FEATURE_FAST_TOP */
>
> @@ -617,41 +642,3 @@ void FAST_FUNC read_cmdline(char *buf, int col, unsigned
> pid, const char *comm)
> snprintf(buf, col, "[%s]", comm ? comm : "?");
> }
> }
> -
> -/* from kernel:
> - // pid comm S ppid pgid sid tty_nr tty_pgrp flg
> - sprintf(buffer,"%d (%s) %c %d %d %d %d %d %lu %lu \
> -%lu %lu %lu %lu %lu %ld %ld %ld %ld %d 0 %llu %lu %ld %lu %lu %lu %lu %lu \
> -%lu %lu %lu %lu %lu %lu %lu %lu %d %d %lu %lu %llu\n",
> - task->pid,
> - tcomm,
> - state,
> - ppid,
> - pgid,
> - sid,
> - tty_nr,
> - tty_pgrp,
> - task->flags,
> - min_flt,
> - cmin_flt,
> - maj_flt,
> - cmaj_flt,
> - cputime_to_clock_t(utime),
> - cputime_to_clock_t(stime),
> - cputime_to_clock_t(cutime),
> - cputime_to_clock_t(cstime),
> - priority,
> - nice,
> - num_threads,
> - // 0,
> - start_time,
> - vsize,
> - mm ? get_mm_rss(mm) : 0,
> - rsslim,
> - mm ? mm->start_code : 0,
> - mm ? mm->end_code : 0,
> - mm ? mm->start_stack : 0,
> - esp,
> - eip,
> -the rest is some obsolete cruft
> -*/
> diff --git a/procps/Config.src b/procps/Config.src
> index 527d9ee..9535617 100644
> --- a/procps/Config.src
> +++ b/procps/Config.src
> @@ -112,6 +112,13 @@ config FEATURE_PS_TIME
> help
> Support -o time and -o etime output specifiers.
>
> +config FEATURE_PS_REALTIME
> + bool "Enable real-time scheduling priority and policy output"
> + default y
> + depends on PS && DESKTOP
> + help
> + Support -o rtprio, -o sched, -o policy output specifiers.
> +
> config FEATURE_PS_ADDITIONAL_COLUMNS
> bool "Enable additional ps columns"
> default y
> diff --git a/procps/ps.c b/procps/ps.c
> index 08dfce1..19c661e 100644
> --- a/procps/ps.c
> +++ b/procps/ps.c
> @@ -371,6 +371,37 @@ static void func_time(char *buf, int size, const
> procps_status_t *ps)
>
> #endif
>
Hi,
why do we need 3 different functions here? Couldn't something like this do it?
static void sprint_it(char *buf, int size, unsigned int value)
{
sprintf(buf, "%*u", size, value);
}
This could eventually also reduce size of the binary.
Untested just a hint.
Ciao,
Tito
> +#if ENABLE_FEATURE_TOP_SMP_PROCESS
> +
> +static void func_psr(char *buf, int size, const procps_status_t *ps)
> +{
> + sprintf(buf, "%*u", size, ps->last_seen_on_cpu);
> +}
> +
> +#endif
> +
> +#if ENABLE_FEATURE_PS_REALTIME
> +
> +static void func_rtprio(char *buf, int size, const procps_status_t *ps)
> +{
> + sprintf(buf, "%*u", size, ps->rtprio);
> +}
> +
> +static void func_sched(char *buf, int size, const procps_status_t *ps)
> +{
> + sprintf(buf, "%*u", size, ps->sched);
> +}
> +
> +static const char *const policy_name[] = {"TS", "FF", "RR", "B", "ISO",
> "IDL", "?"};
> +
> +static void func_policy(char *buf, int size, const procps_status_t *ps)
> +{
> + unsigned index = MIN(ps->sched, ARRAY_SIZE(policy_name)-1);
> + safe_strncpy(buf, policy_name[index], size+1);
> +}
> +
> +#endif
> +
> #if ENABLE_SELINUX
> static void func_label(char *buf, int size, const procps_status_t *ps)
> {
> @@ -379,11 +410,6 @@ static void func_label(char *buf, int size, const
> procps_status_t *ps)
> #endif
>
> /*
> -static void func_nice(char *buf, int size, const procps_status_t *ps)
> -{
> - ps->???
> -}
> -
> static void func_pcpu(char *buf, int size, const procps_status_t *ps)
> {
> }
> @@ -415,6 +441,14 @@ static const ps_out_t out_spec[] = {
> /* Not mandated, but useful: */
> { 4 , "stat" ,"STAT" ,func_state ,PSSCAN_STATE },
> { 4 , "rss" ,"RSS" ,func_rss ,PSSCAN_RSS },
> +#if ENABLE_FEATURE_TOP_SMP_PROCESS
> + { 3 , "psr" ,"PSR" ,func_psr ,PSSCAN_PSR },
> +#endif
> +#if ENABLE_FEATURE_PS_REALTIME
> + { 6 , "rtprio","RTPRIO" ,func_rtprio,PSSCAN_RTPRIO },
> + { 3 , "sched" ,"SCH" ,func_sched ,PSSCAN_SCHED },
> + { 3 , "policy","POL" ,func_policy,PSSCAN_SCHED },
> +#endif
> #if ENABLE_SELINUX
> { 35 , "label" ,"LABEL" ,func_label ,PSSCAN_CONTEXT },
> #endif
> diff --git a/procps/top.c b/procps/top.c
> index 73cd285..a7a736a 100644
> --- a/procps/top.c
> +++ b/procps/top.c
> @@ -888,7 +888,7 @@ enum {
> | PSSCAN_UTIME
> | PSSCAN_STATE
> | PSSCAN_COMM
> - | PSSCAN_CPU
> + | PSSCAN_PSR
> | PSSCAN_UIDGID,
> TOPMEM_MASK = 0
> | PSSCAN_PID
> _______________________________________________
> busybox mailing list
> [email protected]
> http://lists.busybox.net/mailman/listinfo/busybox
>
_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox