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

Reply via email to