PAPI  5.7.0.0
linux-stealtime.c File Reference

A component that gather info on VM stealtime. More...

Include dependency graph for linux-stealtime.c:

Go to the source code of this file.

Data Structures

struct  STEALTIME_reg_alloc_t
 
struct  STEALTIME_control_state
 
struct  STEALTIME_context
 
struct  statinfo
 

Functions

static int read_stealtime (struct STEALTIME_context *context, int starting)
 
static int _stealtime_shutdown_component (void)
 
static int _stealtime_init_component (int cidx)
 
static int _stealtime_init_thread (hwd_context_t *ctx)
 
static int _stealtime_shutdown_thread (hwd_context_t *ctx)
 
static int _stealtime_init_control_state (hwd_control_state_t *ctl)
 
static int _stealtime_update_control_state (hwd_control_state_t *ctl, NativeInfo_t *native, int count, hwd_context_t *ctx)
 
static int _stealtime_start (hwd_context_t *ctx, hwd_control_state_t *ctl)
 
static int _stealtime_stop (hwd_context_t *ctx, hwd_control_state_t *ctl)
 
static int _stealtime_read (hwd_context_t *ctx, hwd_control_state_t *ctl, long long **events, int flags)
 
static int _stealtime_reset (hwd_context_t *ctx, hwd_control_state_t *ctrl)
 
static int _stealtime_ctl (hwd_context_t *ctx, int code, _papi_int_option_t *option)
 
static int _stealtime_set_domain (hwd_control_state_t *cntrl, int domain)
 
static int _stealtime_ntv_code_to_name (unsigned int EventCode, char *name, int len)
 
static int _stealtime_ntv_code_to_descr (unsigned int EventCode, char *name, int len)
 
static int _stealtime_ntv_code_to_info (unsigned int EventCode, PAPI_event_info_t *info)
 
static int _stealtime_ntv_enum_events (unsigned int *EventCode, int modifier)
 

Variables

static int num_events = 0
 
static struct counter_infoevent_info =NULL
 
papi_vector_t _stealtime_vector
 

Detailed Description

Function Documentation

◆ _stealtime_ctl()

static int _stealtime_ctl ( hwd_context_t ctx,
int  code,
_papi_int_option_t option 
)
static

Definition at line 449 of file linux-stealtime.c.

450 {
451  ( void ) ctx;
452  ( void ) code;
453  ( void ) option;
454 
455  return PAPI_OK;
456 }
#define PAPI_OK
Definition: fpapi.h:105

◆ _stealtime_init_component()

static int _stealtime_init_component ( int  cidx)
static

Definition at line 137 of file linux-stealtime.c.

138 {
139 
140  (void)cidx;
141 
142  FILE *fff;
143  char buffer[BUFSIZ],*result,string[BUFSIZ];
144  int i;
145 
146  /* Make sure /proc/stat exists */
147  fff=fopen("/proc/stat","r");
148  if (fff==NULL) {
150  "Cannot open /proc/stat",PAPI_MAX_STR_LEN);
152  return PAPI_ESYS;
153  }
154 
155  num_events=0;
156  while(1) {
157  result=fgets(buffer,BUFSIZ,fff);
158  if (result==NULL) break;
159 
160  /* /proc/stat line with cpu stats always starts with "cpu" */
161 
162  if (!strncmp(buffer,"cpu",3)) {
163  num_events++;
164  }
165  else {
166  break;
167  }
168 
169  }
170 
171  fclose(fff);
172 
173  if (num_events<1) {
175  "Cannot find enough CPU lines in /proc/stat",
178  return PAPI_ESYS;
179  }
180 
181  event_info=calloc(num_events,sizeof(struct counter_info));
182  if (event_info==NULL) {
184  return PAPI_ENOMEM;
185  }
186 
187 
188  sysconf(_SC_CLK_TCK);
189  event_info[0].name=strdup("TOTAL");
190  event_info[0].description=strdup("Total amount of steal time");
191  event_info[0].units=strdup("us");
192 
193  for(i=1;i<num_events;i++) {
194  sprintf(string,"CPU%d",i);
195  event_info[i].name=strdup(string);
196  sprintf(string,"Steal time for CPU %d",i);
197  event_info[i].description=strdup(string);
198  event_info[i].units=strdup("us");
199  }
200 
201  // printf("Found %d CPUs\n",num_events-1);
202 
206 
207  return PAPI_OK;
208 }
#define PAPI_OK
Definition: fpapi.h:105
char disabled_reason[PAPI_MAX_STR_LEN]
Definition: papi.h:637
static int _stealtime_shutdown_component(void)
#define PAPI_ENOMEM
Definition: fpapi.h:107
PAPI_component_info_t cmp_info
Definition: papi_vector.h:20
FILE * fff[MAX_EVENTS]
#define PAPI_ESYS
Definition: fpapi.h:108
static struct counter_info * event_info
static int cidx
static int num_events
char * buffer
Definition: iozone.c:1366
papi_vector_t _stealtime_vector
int i
Definition: fileop.c:140
#define PAPI_MAX_STR_LEN
Definition: fpapi.h:43
Here is the call graph for this function:

◆ _stealtime_init_control_state()

static int _stealtime_init_control_state ( hwd_control_state_t ctl)
static

Definition at line 277 of file linux-stealtime.c.

278 {
279 
280  struct STEALTIME_control_state *control =
281  (struct STEALTIME_control_state *)ctl;
282 
283  control->values=NULL;
284  control->which_counter=NULL;
285  control->num_events=0;
286 
287  return PAPI_OK;
288 }
#define PAPI_OK
Definition: fpapi.h:105

◆ _stealtime_init_thread()

static int _stealtime_init_thread ( hwd_context_t ctx)
static

Definition at line 218 of file linux-stealtime.c.

219 {
220  struct STEALTIME_context *context=(struct STEALTIME_context *)ctx;
221 
222  context->start_count=calloc(num_events,sizeof(long long));
223  if (context->start_count==NULL) return PAPI_ENOMEM;
224 
225  context->current_count=calloc(num_events,sizeof(long long));
226  if (context->current_count==NULL) return PAPI_ENOMEM;
227 
228  context->value=calloc(num_events,sizeof(long long));
229  if (context->value==NULL) return PAPI_ENOMEM;
230 
231  return PAPI_OK;
232 }
#define PAPI_OK
Definition: fpapi.h:105
#define PAPI_ENOMEM
Definition: fpapi.h:107
long long * current_count
static int num_events
long long * start_count

◆ _stealtime_ntv_code_to_descr()

static int _stealtime_ntv_code_to_descr ( unsigned int  EventCode,
char *  name,
int  len 
)
static

Definition at line 512 of file linux-stealtime.c.

513 {
514 
515  int event=EventCode;
516 
517  if (event >=0 && event < num_events) {
518  strncpy( name, event_info[event].description, len );
519  return PAPI_OK;
520  }
521 
522  return PAPI_ENOEVNT;
523 }
#define PAPI_OK
Definition: fpapi.h:105
static const char * name
Definition: fork_overflow.c:31
static struct counter_info * event_info
static int num_events
#define PAPI_ENOEVNT
Definition: fpapi.h:112

◆ _stealtime_ntv_code_to_info()

static int _stealtime_ntv_code_to_info ( unsigned int  EventCode,
PAPI_event_info_t info 
)
static

Definition at line 528 of file linux-stealtime.c.

529 {
530 
531  int index = EventCode;
532 
533  if ( ( index < 0) || (index >= num_events )) return PAPI_ENOEVNT;
534 
535  strncpy( info->symbol, event_info[index].name,sizeof(info->symbol));
536  info->symbol[sizeof(info->symbol)-1] = '\0';
537 
538  strncpy( info->long_descr, event_info[index].description,sizeof(info->symbol));
539  info->long_descr[sizeof(info->symbol)-1] = '\0';
540 
541  strncpy( info->units, event_info[index].units,sizeof(info->units));
542  info->units[sizeof(info->units)-1] = '\0';
543 
544  return PAPI_OK;
545 
546 }
#define PAPI_OK
Definition: fpapi.h:105
char units[PAPI_MIN_STR_LEN]
Definition: papi.h:976
char long_descr[PAPI_HUGE_STR_LEN]
Definition: papi.h:970
static struct counter_info * event_info
char symbol[PAPI_HUGE_STR_LEN]
Definition: papi.h:967
static int num_events
#define PAPI_ENOEVNT
Definition: fpapi.h:112

◆ _stealtime_ntv_code_to_name()

static int _stealtime_ntv_code_to_name ( unsigned int  EventCode,
char *  name,
int  len 
)
static

Definition at line 494 of file linux-stealtime.c.

495 {
496 
497  int event=EventCode;
498 
499  if (event >=0 && event < num_events) {
500  strncpy( name, event_info[event].name, len );
501  return PAPI_OK;
502  }
503 
504  return PAPI_ENOEVNT;
505 }
#define PAPI_OK
Definition: fpapi.h:105
static const char * name
Definition: fork_overflow.c:31
static struct counter_info * event_info
static int num_events
#define PAPI_ENOEVNT
Definition: fpapi.h:112

◆ _stealtime_ntv_enum_events()

static int _stealtime_ntv_enum_events ( unsigned int *  EventCode,
int  modifier 
)
static

Definition at line 555 of file linux-stealtime.c.

556 {
557 
558  if ( modifier == PAPI_ENUM_FIRST ) {
559  if (num_events==0) return PAPI_ENOEVNT;
560  *EventCode = 0;
561  return PAPI_OK;
562  }
563 
564  if ( modifier == PAPI_ENUM_EVENTS ) {
565  int index;
566 
567  index = *EventCode;
568 
569  if ( (index+1) < num_events ) {
570  *EventCode = *EventCode + 1;
571  return PAPI_OK;
572  } else {
573  return PAPI_ENOEVNT;
574  }
575  }
576 
577  return PAPI_EINVAL;
578 }
#define PAPI_OK
Definition: fpapi.h:105
#define PAPI_EINVAL
Definition: fpapi.h:106
static int num_events
#define PAPI_ENOEVNT
Definition: fpapi.h:112

◆ _stealtime_read()

static int _stealtime_read ( hwd_context_t ctx,
hwd_control_state_t ctl,
long long **  events,
int  flags 
)
static

Definition at line 382 of file linux-stealtime.c.

384 {
385  ( void ) flags;
386 
387  struct STEALTIME_control_state *control;
388  struct STEALTIME_context *context;
389 
390  int i;
391 
392  control = (struct STEALTIME_control_state *)ctl;
393  context = (struct STEALTIME_context *)ctx;
394 
395  read_stealtime( context, 0 );
396 
397  for(i=0;i<control->num_events;i++) {
398  control->values[i]=
399  context->value[control->which_counter[i]];
400  }
401 
402  *events = control->values;
403 
404  return PAPI_OK;
405 
406 }
#define PAPI_OK
Definition: fpapi.h:105
static int read_stealtime(struct STEALTIME_context *context, int starting)
char events[MAX_EVENTS][BUFSIZ]
int i
Definition: fileop.c:140
Here is the call graph for this function:

◆ _stealtime_reset()

static int _stealtime_reset ( hwd_context_t ctx,
hwd_control_state_t ctrl 
)
static

Definition at line 415 of file linux-stealtime.c.

416 {
417 
418  /* re-initializes counter_start values to current */
419 
420  _stealtime_start(ctx,ctrl);
421 
422  return PAPI_OK;
423 }
#define PAPI_OK
Definition: fpapi.h:105
static int _stealtime_start(hwd_context_t *ctx, hwd_control_state_t *ctl)
Here is the call graph for this function:

◆ _stealtime_set_domain()

static int _stealtime_set_domain ( hwd_control_state_t cntrl,
int  domain 
)
static

Definition at line 470 of file linux-stealtime.c.

471 {
472  ( void ) cntrl;
473  int found = 0;
474  if ( PAPI_DOM_USER & domain ) {
475  found = 1;
476  }
477  if ( PAPI_DOM_KERNEL & domain ) {
478  found = 1;
479  }
480  if ( PAPI_DOM_OTHER & domain ) {
481  found = 1;
482  }
483  if ( !found )
484  return PAPI_EINVAL;
485 
486  return PAPI_OK;
487 }
#define PAPI_OK
Definition: fpapi.h:105
#define PAPI_DOM_KERNEL
Definition: fpapi.h:22
#define PAPI_EINVAL
Definition: fpapi.h:106
#define PAPI_DOM_OTHER
Definition: fpapi.h:23
#define PAPI_DOM_USER
Definition: fpapi.h:21

◆ _stealtime_shutdown_component()

static int _stealtime_shutdown_component ( void  )
static

Definition at line 239 of file linux-stealtime.c.

240 {
241  int i;
243  if (event_info!=NULL) {
244  for (i=0; i<num_events; i++){
245  free(event_info[i].name);
246  free(event_info[i].description);
247  free(event_info[i].units);
248  }
249  free(event_info);
250  }
251 
252  return PAPI_OK;
253 }
#define PAPI_OK
Definition: fpapi.h:105
static const char * name
Definition: fork_overflow.c:31
char units[MAX_EVENTS][BUFSIZ]
Definition: powercap_plot.c:15
PAPI_component_info_t cmp_info
Definition: papi_vector.h:20
static struct counter_info * event_info
static int num_events
papi_vector_t _stealtime_vector
int i
Definition: fileop.c:140
Here is the caller graph for this function:

◆ _stealtime_shutdown_thread()

static int _stealtime_shutdown_thread ( hwd_context_t ctx)
static

Definition at line 259 of file linux-stealtime.c.

260 {
261 
262  struct STEALTIME_context *context=(struct STEALTIME_context *)ctx;
263 
264  if (context->start_count!=NULL) free(context->start_count);
265  if (context->current_count!=NULL) free(context->current_count);
266  if (context->value!=NULL) free(context->value);
267 
268  return PAPI_OK;
269 }
#define PAPI_OK
Definition: fpapi.h:105
long long * current_count
long long * start_count

◆ _stealtime_start()

static int _stealtime_start ( hwd_context_t ctx,
hwd_control_state_t ctl 
)
static

Definition at line 334 of file linux-stealtime.c.

335 {
336 
337  (void)ctl;
338 
339  // struct STEALTIME_control_state *control;
340  struct STEALTIME_context *context;
341 
342  //control = (struct STEALTIME_control_state *)ctl;
343  context = (struct STEALTIME_context *)ctx;
344 
345  read_stealtime( context, 1 );
346 
347  /* no need to update control, as we assume only one EventSet */
348  /* is active at once, so starting things at the context level */
349  /* is fine, since stealtime is system-wide */
350 
351  return PAPI_OK;
352 }
#define PAPI_OK
Definition: fpapi.h:105
static int read_stealtime(struct STEALTIME_context *context, int starting)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ _stealtime_stop()

static int _stealtime_stop ( hwd_context_t ctx,
hwd_control_state_t ctl 
)
static

Definition at line 359 of file linux-stealtime.c.

360 {
361 
362  (void) ctl;
363 
364  // struct STEALTIME_control_state *control;
365  struct STEALTIME_context *context;
366 
367  //control = (struct STEALTIME_control_state *)ctl;
368  context = (struct STEALTIME_context *)ctx;
369 
370  read_stealtime( context, 0 );
371 
372  return PAPI_OK;
373 
374 }
#define PAPI_OK
Definition: fpapi.h:105
static int read_stealtime(struct STEALTIME_context *context, int starting)
Here is the call graph for this function:

◆ _stealtime_update_control_state()

static int _stealtime_update_control_state ( hwd_control_state_t ctl,
NativeInfo_t native,
int  count,
hwd_context_t ctx 
)
static

Definition at line 295 of file linux-stealtime.c.

299 {
300 
301  struct STEALTIME_control_state *control;
302 
303  ( void ) ctx;
304  int i, index;
305 
306  control= (struct STEALTIME_control_state *)ctl;
307 
308  if (count!=control->num_events) {
309  // printf("Resizing %d to %d\n",control->num_events,count);
310  control->which_counter=realloc(control->which_counter,
311  count*sizeof(int));
312  control->values=realloc(control->values,
313  count*sizeof(long long));
314 
315  }
316 
317 
318  for ( i = 0; i < count; i++ ) {
319  index = native[i].ni_event;
320  control->which_counter[i]=index;
321  native[i].ni_position = i;
322  }
323 
324  control->num_events=count;
325 
326  return PAPI_OK;
327 }
#define PAPI_OK
Definition: fpapi.h:105
static int native
static long count
int i
Definition: fileop.c:140

◆ read_stealtime()

static int read_stealtime ( struct STEALTIME_context context,
int  starting 
)
static

Definition at line 74 of file linux-stealtime.c.

74  {
75 
76  FILE *fff;
77  char buffer[BUFSIZ],*result;
78  int i,count;
79  struct statinfo our_stat;
80 
81  int hz=sysconf(_SC_CLK_TCK);
82 
83 
84  fff=fopen("/proc/stat","r");
85  if (fff==NULL) {
86  return PAPI_ESYS;
87  }
88 
89  for(i=0;i<num_events;i++) {
90  result=fgets(buffer,BUFSIZ,fff);
91  if (result==NULL) break;
92 
93  count=sscanf(buffer,"%*s %lld %lld %lld %lld %lld %lld %lld %lld %lld",
94  &our_stat.user,
95  &our_stat.nice,
96  &our_stat.system,
97  &our_stat.idle,
98  &our_stat.iowait,
99  &our_stat.irq,
100  &our_stat.softirq,
101  &our_stat.steal,
102  &our_stat.guest);
103  if (count<=7) {
104  fclose(fff);
105  return PAPI_ESYS;
106  }
107 
108  if (starting) {
109  context->start_count[i]=our_stat.steal;
110  }
111  context->current_count[i]=our_stat.steal;
112 
113  /* convert to us */
114  context->value[i]=(context->current_count[i]-context->start_count[i])*
115  (1000000/hz);
116  }
117 
118 
119  fclose(fff);
120 
121  return PAPI_OK;
122 
123 }
#define PAPI_OK
Definition: fpapi.h:105
FILE * fff[MAX_EVENTS]
#define PAPI_ESYS
Definition: fpapi.h:108
long long * current_count
static int num_events
char * buffer
Definition: iozone.c:1366
long long * start_count
static long count
int i
Definition: fileop.c:140
Here is the caller graph for this function:

Variable Documentation

◆ _stealtime_vector

papi_vector_t _stealtime_vector

Definition at line 55 of file linux-stealtime.c.

◆ event_info

struct counter_info* event_info =NULL
static

Definition at line 52 of file linux-stealtime.c.

◆ num_events

int num_events = 0
static

Definition at line 50 of file linux-stealtime.c.