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