xref: /f-stack/tools/top/top.c (revision 93240043)
1e7741141SAndy #include<unistd.h>
2e7741141SAndy #include "ff_ipc.h"
3e7741141SAndy 
4e7741141SAndy void
usage(void)5e7741141SAndy usage(void)
6e7741141SAndy {
7e7741141SAndy     printf("Usage:\n");
80f5432bbSfengbojiang     printf("  top [-p <f-stack proc_id>] [-P <max proc_id>] "
90f5432bbSfengbojiang         "[-d <secs>] [-n <num>]\n");
10e7741141SAndy }
11e7741141SAndy 
cpu_status(struct ff_top_args * top)12e7741141SAndy int cpu_status(struct ff_top_args *top)
13e7741141SAndy {
14e7741141SAndy     int            ret;
15e7741141SAndy     struct ff_msg *msg, *retmsg = NULL;
16e7741141SAndy 
17e7741141SAndy     msg = ff_ipc_msg_alloc();
18e7741141SAndy     if (msg == NULL) {
19e7741141SAndy         errno = ENOMEM;
20e7741141SAndy         return -1;
21e7741141SAndy     }
22e7741141SAndy 
23e7741141SAndy     msg->msg_type = FF_TOP;
24e7741141SAndy     ret = ff_ipc_send(msg);
25e7741141SAndy     if (ret < 0) {
26e7741141SAndy         errno = EPIPE;
27e7741141SAndy         ff_ipc_msg_free(msg);
28e7741141SAndy         return -1;
29e7741141SAndy     }
30e7741141SAndy 
31e7741141SAndy     do {
32e7741141SAndy         if (retmsg != NULL) {
33e7741141SAndy             ff_ipc_msg_free(retmsg);
34e7741141SAndy         }
35e7741141SAndy 
366194fcd2Sfengbojiang(姜凤波)         ret = ff_ipc_recv(&retmsg, msg->msg_type);
37e7741141SAndy         if (ret < 0) {
38e7741141SAndy             errno = EPIPE;
39e7741141SAndy             return -1;
40e7741141SAndy         }
41e7741141SAndy     } while (msg != retmsg);
42e7741141SAndy 
43e7741141SAndy     *top = retmsg->top;
44e7741141SAndy 
45e7741141SAndy     ff_ipc_msg_free(msg);
46e7741141SAndy 
47e7741141SAndy     return 0;
48e7741141SAndy }
49e7741141SAndy 
main(int argc,char ** argv)50e7741141SAndy int main(int argc, char **argv)
51e7741141SAndy {
52e7741141SAndy     int ch, delay = 1, n = 0;
53d02fa78dSfengbojiang(姜凤波)     unsigned int i, j;
540f5432bbSfengbojiang     struct ff_top_args top, otop;
550f5432bbSfengbojiang     struct ff_top_args ptop[RTE_MAX_LCORE], potop[RTE_MAX_LCORE];
56d02fa78dSfengbojiang(姜凤波)     int proc_id = 0, max_proc_id = -1;
570f5432bbSfengbojiang     float sys, usr, idle;
58d02fa78dSfengbojiang(姜凤波)     float psys, pusr, pidle;
590f5432bbSfengbojiang     unsigned long loops, ploops;
60*93240043Sfengbojiang     int title_line = 40;
61e7741141SAndy 
6285eb2ae9SAndy     ff_ipc_init();
6385eb2ae9SAndy 
64e7741141SAndy #define TOP_DIFF(member) (top.member - otop.member)
65d02fa78dSfengbojiang(姜凤波) #define TOP_DIFF_P(member) (ptop[j].member - potop[j].member)
66e7741141SAndy 
67d02fa78dSfengbojiang(姜凤波)     while ((ch = getopt(argc, argv, "hp:P:d:n:")) != -1) {
68e7741141SAndy         switch(ch) {
69e7741141SAndy         case 'p':
70d02fa78dSfengbojiang(姜凤波)             proc_id = atoi(optarg);
71d02fa78dSfengbojiang(姜凤波)             ff_set_proc_id(proc_id);
72d02fa78dSfengbojiang(姜凤波)             break;
73d02fa78dSfengbojiang(姜凤波)         case 'P':
74d02fa78dSfengbojiang(姜凤波)             max_proc_id = atoi(optarg);
75d02fa78dSfengbojiang(姜凤波)             if (max_proc_id < 0 || max_proc_id >= RTE_MAX_LCORE) {
76d02fa78dSfengbojiang(姜凤波)                 usage();
77552bc48cSroot                 ff_ipc_exit();
78d02fa78dSfengbojiang(姜凤波)                 return -1;
79d02fa78dSfengbojiang(姜凤波)             }
80*93240043Sfengbojiang             if (max_proc_id > title_line - 2)
81*93240043Sfengbojiang                 title_line = max_proc_id + 2;
82e7741141SAndy             break;
83e7741141SAndy         case 'd':
84e7741141SAndy             delay = atoi(optarg) ?: 1;
85e7741141SAndy             break;
86e7741141SAndy         case 'n':
87e7741141SAndy             n = atoi(optarg);
88e7741141SAndy             break;
89e7741141SAndy         case 'h':
90e7741141SAndy         default:
91e7741141SAndy             usage();
92552bc48cSroot             ff_ipc_exit();
93e7741141SAndy             return -1;
94e7741141SAndy         }
95e7741141SAndy     }
96e7741141SAndy 
97e7741141SAndy     for (i = 0; ; i++) {
98d02fa78dSfengbojiang(姜凤波)         if (max_proc_id == -1) {
99e7741141SAndy             if (cpu_status(&top)) {
100e7741141SAndy                 printf("fstack ipc message error !\n");
101552bc48cSroot                 ff_ipc_exit();
102e7741141SAndy                 return -1;
103e7741141SAndy             }
104e7741141SAndy 
105*93240043Sfengbojiang             if (i % title_line == 0) {
106e7741141SAndy                 printf("|---------|---------|---------|---------------|\n");
107e7741141SAndy                 printf("|%9s|%9s|%9s|%15s|\n", "idle", "sys", "usr", "loop");
108e7741141SAndy                 printf("|---------|---------|---------|---------------|\n");
109e7741141SAndy             }
110e7741141SAndy 
111e7741141SAndy             if (i) {
1120f5432bbSfengbojiang                 sys = TOP_DIFF(sys_tsc) / (TOP_DIFF(work_tsc) / 100.0);
1130f5432bbSfengbojiang                 usr = TOP_DIFF(usr_tsc) / (TOP_DIFF(work_tsc) / 100.0);
1140f5432bbSfengbojiang                 idle = TOP_DIFF(idle_tsc) / (TOP_DIFF(work_tsc) / 100.0);
115e7741141SAndy 
1160f5432bbSfengbojiang                 printf("|%8.2f%%|%8.2f%%|%8.2f%%|%15lu|\n",
1170f5432bbSfengbojiang                     idle, sys, usr, TOP_DIFF(loops));
118e7741141SAndy             }
119d02fa78dSfengbojiang(姜凤波)         }else {
120d02fa78dSfengbojiang(姜凤波)             /*
121d02fa78dSfengbojiang(姜凤波)              * get and show cpu usage from proc_id to max_proc_id.
122d02fa78dSfengbojiang(姜凤波)              */
123*93240043Sfengbojiang             if (i % (title_line / (max_proc_id - proc_id + 2)) == 0) {
1240f5432bbSfengbojiang                 printf("|---------|---------|---------|"
1250f5432bbSfengbojiang                     "---------|---------------|\n");
1260f5432bbSfengbojiang                 printf("|%9s|%9s|%9s|%9s|%15s|\n",
1270f5432bbSfengbojiang                     "proc_id", "idle", "sys", "usr", "loop");
1280f5432bbSfengbojiang                 printf("|---------|---------|---------|"
1290f5432bbSfengbojiang                     "---------|---------------|\n");
1300f5432bbSfengbojiang             }
1310f5432bbSfengbojiang 
1320f5432bbSfengbojiang             sys = usr = idle = loops = 0;
133d02fa78dSfengbojiang(姜凤波)             for (j = proc_id; j <= max_proc_id; j++) {
1340f5432bbSfengbojiang                 potop[j] = ptop[j];
1350f5432bbSfengbojiang 
136d02fa78dSfengbojiang(姜凤波)                 ff_set_proc_id(j);
137d02fa78dSfengbojiang(姜凤波)                 if (cpu_status(&ptop[j])) {
138d02fa78dSfengbojiang(姜凤波)                     printf("fstack ipc message error, proc id:%d!\n", j);
139552bc48cSroot                     ff_ipc_exit();
140d02fa78dSfengbojiang(姜凤波)                     return -1;
141d02fa78dSfengbojiang(姜凤波)                 }
142d02fa78dSfengbojiang(姜凤波) 
143d02fa78dSfengbojiang(姜凤波)                 if (i) {
1440f5432bbSfengbojiang                     psys = TOP_DIFF_P(sys_tsc) / \
1450f5432bbSfengbojiang                         (TOP_DIFF_P(work_tsc) / 100.0);
1460f5432bbSfengbojiang                     pusr = TOP_DIFF_P(usr_tsc) / \
1470f5432bbSfengbojiang                         (TOP_DIFF_P(work_tsc) / 100.0);
1480f5432bbSfengbojiang                     pidle = TOP_DIFF_P(idle_tsc) / \
1490f5432bbSfengbojiang                         (TOP_DIFF_P(work_tsc) / 100.0);
1500f5432bbSfengbojiang                     ploops = TOP_DIFF_P(loops);
1510f5432bbSfengbojiang                     printf("|%9d|%8.2f%%|%8.2f%%|%8.2f%%|%15lu|\n",
1520f5432bbSfengbojiang                         j, pidle, psys, pusr, ploops);
153d02fa78dSfengbojiang(姜凤波) 
1540f5432bbSfengbojiang                     sys += psys;
1550f5432bbSfengbojiang                     usr += pusr;
1560f5432bbSfengbojiang                     idle += pidle;
1570f5432bbSfengbojiang                     loops += ploops;
158d02fa78dSfengbojiang(姜凤波) 
1590f5432bbSfengbojiang                     if (j == max_proc_id) {
1600f5432bbSfengbojiang                         printf("|%9s|%8.2f%%|%8.2f%%|%8.2f%%|%15lu|\n",
1610f5432bbSfengbojiang                             "total", idle, sys, usr, loops);
1620f5432bbSfengbojiang                         printf("|         |         |         |"
1630f5432bbSfengbojiang                             "         |               |\n");
1640f5432bbSfengbojiang                     }
1650f5432bbSfengbojiang                 }
166d02fa78dSfengbojiang(姜凤波)             }
167d02fa78dSfengbojiang(姜凤波)         }
168e7741141SAndy 
169e7741141SAndy         if (n && i >= n) {
170e7741141SAndy             break;
171e7741141SAndy         }
172e7741141SAndy 
173e7741141SAndy         otop = top;
174e7741141SAndy         sleep(delay);
175e7741141SAndy     }
176e7741141SAndy 
177552bc48cSroot     ff_ipc_exit();
178552bc48cSroot 
179e7741141SAndy     return 0;
180e7741141SAndy }
181