11/*
22** ATOP - System & Process Monitor
33**
4- ** The program 'atop' offers the possibility to view the activity of
4+ ** The program 'atop' offers the possibility to view the activity of
55** the system on system-level as well as process-level.
66**
77** This source-file contains the main-function, which verifies the
8- ** calling-parameters and takes care of initialization.
8+ ** calling-parameters and takes care of initialization.
99** The engine-function drives the main sample-loop in which after the
1010** indicated interval-time a snapshot is taken of the system-level and
1111** process-level counters and the deviations are calculated and
3535** --------------------------------------------------------------------------
3636**
3737** After initialization, the main-function calls the ENGINE.
38- ** For every cycle (so after another interval) the ENGINE calls various
38+ ** For every cycle (so after another interval) the ENGINE calls various
3939** functions as shown below:
4040**
4141** +---------------------------------------------------------------------+
4848** | | ^ | ^ | ^ | ^ | | |
4949** +---|-----|--------|-----|--------|----|--------|----|--------|----|--+
5050** | | | | | | | | | |
51- ** +--V-----|--+ +--V-----|--+ +--V----|--+ +--V----|--+ +--V----|-+
51+ ** +--V-----|--+ +--V-----|--+ +--V----|--+ +--V----|--+ +--V----|-+
5252** | | | | | | | | | |
5353** | photosyst | | photoproc | | acct | | deviate | | print |
5454** | | | | |photoproc | | ...syst | | |
5555** | | | | | | | ...proc | | |
56- ** +-----------+ +-----------+ +----------+ +----------+ +---------+
56+ ** +-----------+ +-----------+ +----------+ +----------+ +---------+
5757** ^ ^ ^ ^ |
5858** | | | | |
59- ** | | | V V
59+ ** | | | V V
6060** ______ _________ __________ ________ _________
6161** / \ / \ / \ / \ / \
6262** /proc /proc accounting task screen or
8484** When all counters have been gathered, functions are called to calculate
8585** the difference between the current counter-values and the counter-values
8686** of the previous cycle. These functions operate on the system-level
87- ** as well as on the task-level counters.
88- ** These differences are stored in a new structure(-table).
87+ ** as well as on the task-level counters.
88+ ** These differences are stored in a new structure(-table).
8989**
9090** - deviatsyst()
9191** Calculates the differences between the current system-level
9898** task-database; this "database" is implemented as a linked list
9999** of taskinfo structures in memory (so no disk-accesses needed).
100100** Within this linked list hash-buckets are maintained for fast searches.
101- ** The entire task-database is handled via a set of well-defined
101+ ** The entire task-database is handled via a set of well-defined
102102** functions from which the name starts with "pdb_..." (see the
103103** source-file procdbase.c).
104104** The processes which have been finished during the last cycle
112112** these addresses can be modified in the main-function depending on particular
113113** flags. In this way various representation-layers (ASCII, graphical, ...)
114114** can be linked with 'atop'; the one to use can eventually be chosen
115- ** at runtime.
115+ ** at runtime.
116116**
117117** $Log: atop.c,v $
118118** Revision 1.49 2010/10/23 14:01:00 gerlof
296296#include "showgeneric.h"
297297#include "parseable.h"
298298#include "gpucom.h"
299+ #include "photobpf.h"
299300
300301#define allflags "ab:cde:fghijklmnopqrstuvwxyz1ABCDEFGHIJKL:MNOP:QRSTUVWXYZ"
301302#define MAXFL 64 /* maximum number of command-line flags */
@@ -321,6 +322,16 @@ char usecolors = 1; /* boolean: colors for high occupation */
321322char threadview = 0 ; /* boolean: show individual threads */
322323char calcpss = 0 ; /* boolean: read/calculate process PSS */
323324
325+ /*
326+ ** arguments for bpf stats sampling
327+ ** We enable bpf stats for bpfsampleinterval seconds every bpfsamplerate
328+ ** atop intervals. bpfsampleinterval must be smaller than atop interval.
329+ **
330+ ** If bpfsamplerate == 0, disable sampling of bpf stats.
331+ */
332+ unsigned int bpfsamplerate = 1 ;
333+ unsigned int bpfsampleinterval = 1 ;
334+
324335unsigned short hertz ;
325336unsigned int pagesize ;
326337unsigned int nrgpus ;
@@ -390,6 +401,9 @@ void do_almostcrit(char *, char *);
390401void do_atopsarflags (char * , char * );
391402void do_pacctdir (char * , char * );
392403void do_perfevents (char * , char * );
404+ void do_bpflines (char * , char * );
405+ void do_bpfsamplerate (char * , char * );
406+ void do_bpfsampleinterval (char * , char * );
393407
394408static struct {
395409 char * tag ;
@@ -439,6 +453,9 @@ static struct {
439453 { "atopsarflags" , do_atopsarflags , 0 , },
440454 { "perfevents" , do_perfevents , 0 , },
441455 { "pacctdir" , do_pacctdir , 1 , },
456+ { "bpflines" , do_bpflines , 0 , },
457+ { "bpfsamplerate" , do_bpfsamplerate , 0 , },
458+ { "bpfsampleinterval" , do_bpfsampleinterval , 0 , },
442459};
443460
444461/*
@@ -465,6 +482,8 @@ main(int argc, char *argv[])
465482 exit (42 );
466483 }
467484
485+ photo_bpf_check ();
486+
468487 /*
469488 ** preserve command arguments to allow restart of other version
470489 */
@@ -496,12 +515,12 @@ main(int argc, char *argv[])
496515 if ( memcmp (p , "atopsar" , 7 ) == 0 )
497516 return atopsar (argc , argv );
498517
499- /*
500- ** interpret command-line arguments & flags
518+ /*
519+ ** interpret command-line arguments & flags
501520 */
502521 if (argc > 1 )
503522 {
504- /*
523+ /*
505524 ** gather all flags for visualization-functions
506525 **
507526 ** generic flags will be handled here;
@@ -595,17 +614,17 @@ main(int argc, char *argv[])
595614 }
596615
597616 /*
598- ** get optional interval-value and optional number of samples
617+ ** get optional interval-value and optional number of samples
599618 */
600619 if (optind < argc && optind < MAXFL )
601620 {
602621 if (!numeric (argv [optind ]))
603622 prusage (argv [0 ]);
604-
623+
605624 interval = atoi (argv [optind ]);
606-
625+
607626 optind ++ ;
608-
627+
609628 if (optind < argc )
610629 {
611630 if (!numeric (argv [optind ]) )
@@ -761,6 +780,7 @@ engine(void)
761780 gpupending = 0 ; /* boolean: request sent */
762781
763782 struct gpupidstat * gp = NULL ;
783+ struct bstats * bstats = NULL ;
764784
765785 /*
766786 ** initialization: allocate required memory dynamically
@@ -812,6 +832,8 @@ engine(void)
812832 if (nrgpus )
813833 supportflags |= GPUSTAT ;
814834
835+ if (system_support_bpf ())
836+ supportflags |= BPFSTAT ;
815837 /*
816838 ** MAIN-LOOP:
817839 ** - Wait for the requested number of seconds or for other trigger
@@ -833,11 +855,15 @@ engine(void)
833855 /*
834856 ** if the limit-flag is specified:
835857 ** check if the next sample is expected before midnight;
836- ** if not, stop atop now
858+ ** if not, stop atop now
837859 */
838860 if (midnightflag && (curtime + interval ) > timelimit )
839861 break ;
840862
863+ if ((supportflags & BPFSTAT ) &&
864+ bpfsamplerate && sampcnt % bpfsamplerate == 0 )
865+ bstats = get_devbstats ();
866+
841867 /*
842868 ** wait for alarm-signal to arrive (except first sample)
843869 ** or wait for SIGUSR1/SIGUSR2
@@ -854,13 +880,13 @@ engine(void)
854880 curtime = time (0 ); /* seconds since 1-1-1970 */
855881
856882 /*
857- ** send request for statistics to atopgpud
883+ ** send request for statistics to atopgpud
858884 */
859885 if (nrgpus )
860886 gpupending = gpud_statrequest ();
861887
862888 /*
863- ** take a snapshot of the current system-level statistics
889+ ** take a snapshot of the current system-level statistics
864890 ** and calculate the deviations (i.e. calculate the activity
865891 ** during the last sample)
866892 */
@@ -913,7 +939,7 @@ engine(void)
913939 curtime - pretime > 0 ? curtime - pretime : 1 );
914940
915941 /*
916- ** take a snapshot of the current task-level statistics
942+ ** take a snapshot of the current task-level statistics
917943 ** and calculate the deviations (i.e. calculate the activity
918944 ** during the last sample)
919945 **
@@ -1008,10 +1034,14 @@ engine(void)
10081034 ** the deviations
10091035 */
10101036 lastcmd = (vis .show_samp )( curtime ,
1011- curtime - pretime > 0 ? curtime - pretime : 1 ,
1012- & devtstat , devsstat ,
1013- nprocexit , noverflow , sampcnt == 0 );
1037+ curtime - pretime > 0 ? curtime - pretime : 1 ,
1038+ & devtstat , devsstat , bstats ,
1039+ nprocexit , noverflow , sampcnt == 0 );
10141040
1041+ if (bstats ) {
1042+ free (bstats -> bpfall );
1043+ bstats = NULL ;
1044+ }
10151045 /*
10161046 ** release dynamically allocated memory
10171047 */
@@ -1060,7 +1090,7 @@ prusage(char *myname)
10601090 printf ("\t -%c show version information\n" , MVERSION );
10611091 printf ("\t -%c show or log all processes (i.s.o. active processes "
10621092 "only)\n" , MALLPROC );
1063- printf ("\t -%c calculate proportional set size (PSS) per process\n" ,
1093+ printf ("\t -%c calculate proportional set size (PSS) per process\n" ,
10641094 MCALCPSS );
10651095 printf ("\t -P generate parseable output for specified label(s)\n" );
10661096 printf ("\t -L alternate line length (default 80) in case of "
@@ -1140,6 +1170,18 @@ do_linelength(char *name, char *val)
11401170 linelen = get_posval (name , val );
11411171}
11421172
1173+ void
1174+ do_bpfsamplerate (char * name , char * val )
1175+ {
1176+ bpfsamplerate = get_posval (name , val );
1177+ }
1178+
1179+ void
1180+ do_bpfsampleinterval (char * name , char * val )
1181+ {
1182+ bpfsampleinterval = get_posval (name , val );
1183+ }
1184+
11431185/*
11441186** read RC-file and modify defaults accordingly
11451187*/
@@ -1190,7 +1232,7 @@ readrc(char *path, int syslevel)
11901232 default :
11911233 if (tagname [0 ] == '#' )
11921234 continue ;
1193-
1235+
11941236 if (tagvalue [0 ] != '#' )
11951237 break ;
11961238
0 commit comments