PAPI 7.1.0.0
Loading...
Searching...
No Matches
linux-mx.c
Go to the documentation of this file.
1
7#include "papi.h"
8#include "papi_internal.h"
9#include "papi_vector.h"
10
11#include <stdio.h>
12#include <stdlib.h>
13#include <unistd.h>
14#include <string.h>
15#include <ctype.h>
16
17#define MX_MAX_COUNTERS 100
18#define MX_MAX_COUNTER_TERMS MX_MAX_COUNTERS
19
20#define LINELEN 128
21
22typedef struct MX_register
23{
24 /* indicate which counters this event can live on */
25 unsigned int selector;
27
28typedef struct MX_native_event_entry
29{
30 /* description of the resources required by this native event */
32 /* If it exists, then this is the name of this event */
33 char *name;
34 /* If it exists, then this is the description of this event */
37
38typedef struct MX_reg_alloc
39{
42
43typedef struct MX_control_state
44{
45 long long start_count[MX_MAX_COUNTERS];
46 long long current_count[MX_MAX_COUNTERS];
47 long long difference[MX_MAX_COUNTERS];
48 int which_counter[MX_MAX_COUNTERS];
51
52typedef struct MX_context
53{
56
57
59 {{1, }, "LANAI_UPTIME", "Lanai uptime (seconds)"},
60 {{2, }, "COUNTERS_UPTIME", "Counters uptime (seconds)"},
61 {{3, }, "BAD_CRC8", "Bad CRC8 (Port 0)"},
62 {{4, }, "BAD_CRC32", "Bad CRC32 (Port 0)"},
63 {{5, }, "UNSTRIPPED_ROUTE", "Unstripped route (Port 0)"},
64 {{6, }, "PKT_DESC_INVALID", "pkt_desc_invalid (Port 0)"},
65 {{7, }, "RECV_PKT_ERRORS", "recv_pkt_errors (Port 0)"},
66 {{8, }, "PKT_MISROUTED", "pkt_misrouted (Port 0)"},
67 {{9, }, "DATA_SRC_UNKNOWN", "data_src_unknown"},
68 {{10, }, "DATA_BAD_ENDPT", "data_bad_endpt"},
69 {{11, }, "DATA_ENDPT_CLOSED", "data_endpt_closed"},
70 {{12, }, "DATA_BAD_SESSION", "data_bad_session"},
71 {{13, }, "PUSH_BAD_WINDOW", "push_bad_window"},
72 {{14, }, "PUSH_DUPLICATE", "push_duplicate"},
73 {{15, }, "PUSH_OBSOLETE", "push_obsolete"},
74 {{16, }, "PUSH_RACE_DRIVER", "push_race_driver"},
75 {{17, }, "PUSH_BAD_SEND_HANDLE_MAGIC", "push_bad_send_handle_magic"},
76 {{18, }, "PUSH_BAD_SRC_MAGIC", "push_bad_src_magic"},
77 {{19, }, "PULL_OBSOLETE", "pull_obsolete"},
78 {{20, }, "PULL_NOTIFY_OBSOLETE", "pull_notify_obsolete"},
79 {{21, }, "PULL_RACE_DRIVER", "pull_race_driver"},
80 {{22, }, "ACK_BAD_TYPE", "ack_bad_type"},
81 {{23, }, "ACK_BAD_MAGIC", "ack_bad_magic"},
82 {{24, }, "ACK_RESEND_RACE", "ack_resend_race"},
83 {{25, }, "LATE_ACK", "Late ack"},
84 {{26, }, "ACK_NACK_FRAMES_IN_PIPE", "ack_nack_frames_in_pipe"},
85 {{27, }, "NACK_BAD_ENDPT", "nack_bad_endpt"},
86 {{28, }, "NACK_ENDPT_CLOSED", "nack_endpt_closed"},
87 {{29, }, "NACK_BAD_SESSION", "nack_bad_session"},
88 {{30, }, "NACK_BAD_RDMAWIN", "nack_bad_rdmawin"},
89 {{31, }, "NACK_EVENTQ_FULL", "nack_eventq_full"},
90 {{32, }, "SEND_BAD_RDMAWIN", "send_bad_rdmawin"},
91 {{33, }, "CONNECT_TIMEOUT", "connect_timeout"},
92 {{34, }, "CONNECT_SRC_UNKNOWN", "connect_src_unknown"},
93 {{35, }, "QUERY_BAD_MAGIC", "query_bad_magic"},
94 {{36, }, "QUERY_TIMED_OUT", "query_timed_out"},
95 {{37, }, "QUERY_SRC_UNKNOWN", "query_src_unknown"},
96 {{38, }, "RAW_SENDS", "Raw sends (Port 0)"},
97 {{39, }, "RAW_RECEIVES", "Raw receives (Port 0)"},
98 {{40, }, "RAW_OVERSIZED_PACKETS", "Raw oversized packets (Port 0)"},
99 {{41, }, "RAW_RECV_OVERRUN", "raw_recv_overrun"},
100 {{42, }, "RAW_DISABLED", "raw_disabled"},
101 {{43, }, "CONNECT_SEND", "connect_send"},
102 {{44, }, "CONNECT_RECV", "connect_recv"},
103 {{45, }, "ACK_SEND", "ack_send (Port 0)"},
104 {{46, }, "ACK_RECV", "ack_recv (Port 0)"},
105 {{47, }, "PUSH_SEND", "push_send (Port 0)"},
106 {{48, }, "PUSH_RECV", "push_recv (Port 0)"},
107 {{49, }, "QUERY_SEND", "query_send (Port 0)"},
108 {{50, }, "QUERY_RECV", "query_recv (Port 0)"},
109 {{51, }, "REPLY_SEND", "reply_send (Port 0)"},
110 {{52, }, "REPLY_RECV", "reply_recv (Port 0)"},
111 {{53, }, "QUERY_UNKNOWN", "query_unknown (Port 0)"},
112/* {{ 54, }, "QUERY_UNKNOWN", "query_unknown (Port 0)"},*/
113 {{55, }, "DATA_SEND_NULL", "data_send_null (Port 0)"},
114 {{56, }, "DATA_SEND_SMALL", "data_send_small (Port 0)"},
115 {{57, }, "DATA_SEND_MEDIUM", "data_send_medium (Port 0)"},
116 {{58, }, "DATA_SEND_RNDV", "data_send_rndv (Port 0)"},
117 {{59, }, "DATA_SEND_PULL", "data_send_pull (Port 0)"},
118 {{60, }, "DATA_RECV_NULL", "data_recv_null (Port 0)"},
119 {{61, }, "DATA_RECV_SMALL_INLINE", "data_recv_small_inline (Port 0)"},
120 {{62, }, "DATA_RECV_SMALL_COPY", "data_recv_small_copy (Port 0)"},
121 {{63, }, "DATA_RECV_MEDIUM", "data_recv_medium (Port 0)"},
122 {{64, }, "DATA_RECV_RNDV", "data_recv_rndv (Port 0)"},
123 {{65, }, "DATA_RECV_PULL", "data_recv_pull (Port 0)"},
124 {{66, }, "ETHER_SEND_UNICAST_CNT", "ether_send_unicast_cnt (Port 0)"},
125 {{67, }, "ETHER_SEND_MULTICAST_CNT", "ether_send_multicast_cnt (Port 0)"},
126 {{68, }, "ETHER_RECV_SMALL_CNT", "ether_recv_small_cnt (Port 0)"},
127 {{69, }, "ETHER_RECV_BIG_CNT", "ether_recv_big_cnt (Port 0)"},
128 {{70, }, "ETHER_OVERRUN", "ether_overrun"},
129 {{71, }, "ETHER_OVERSIZED", "ether_oversized"},
130 {{72, }, "DATA_RECV_NO_CREDITS", "data_recv_no_credits"},
131 {{73, }, "PACKETS_RECENT", "Packets resent"},
132 {{74, }, "PACKETS_DROPPED", "Packets dropped (data send side)"},
133 {{75, }, "MAPPER_ROUTES_UPDATE", "Mapper routes update"},
134 {{76, }, "ROUTE_DISPERSION", "Route dispersion (Port 0)"},
135 {{77, }, "OUT_OF_SEND_HANDLES", "out_of_send_handles"},
136 {{78, }, "OUT_OF_PULL_HANDLES", "out_of_pull_handles"},
137 {{79, }, "OUT_OF_PUSH_HANDLES", "out_of_push_handles"},
138 {{80, }, "MEDIUM_CONT_RACE", "medium_cont_race"},
139 {{81, }, "CMD_TYPE_UNKNOWN", "cmd_type_unknown"},
140 {{82, }, "UREQ_TYPE_UNKNOWN", "ureq_type_unknown"},
141 {{83, }, "INTERRUPTS_OVERRUN", "Interrupts overrun"},
142 {{84, }, "WAITING_FOR_INTERRUPT_DMA", "Waiting for interrupt DMA"},
143 {{85, }, "WAITING_FOR_INTERRUPT_ACK", "Waiting for interrupt Ack"},
144 {{86, }, "WAITING_FOR_INTERRUPT_TIMER", "Waiting for interrupt Timer"},
145 {{87, }, "SLABS_RECYCLING", "Slabs recycling"},
146 {{88, }, "SLABS_PRESSURE", "Slabs pressure"},
147 {{89, }, "SLABS_STARVATION", "Slabs starvation"},
148 {{90, }, "OUT_OF_RDMA_HANDLES", "out_of_rdma handles"},
149 {{91, }, "EVENTQ_FULL", "eventq_full"},
150 {{92, }, "BUFFER_DROP", "buffer_drop (Port 0)"},
151 {{93, }, "MEMORY_DROP", "memory_drop (Port 0)"},
152 {{94, }, "HARDWARE_FLOW_CONTROL", "Hardware flow control (Port 0)"},
153 {{95, }, "SIMULATED_PACKETS_LOST", "(Devel) Simulated packets lost (Port 0)"},
154 {{96, }, "LOGGING_FRAMES_DUMPED", "(Logging) Logging frames dumped"},
155 {{97, }, "WAKE_INTERRUPTS", "Wake interrupts"},
156 {{98, }, "AVERTED_WAKEUP_RACE", "Averted wakeup race"},
157 {{99, }, "DMA_METADATA_RACE", "Dma metadata race"},
158 {{0, }, "", ""}
159};
160
161static int num_events=0;
163
164static char mx_counters_exe[BUFSIZ];
165
166static int
167read_mx_counters( long long *counters )
168{
169 FILE *fp;
170 char line[LINELEN];
171 int i, linenum;
172
173 /* Open a pipe to the mx_counters executable */
174
175 fp = popen( mx_counters_exe, "r" );
176 if ( !fp ) {
177 perror( "popen" );
178 return PAPI_ECMP;
179 }
180
181
182 /* A line of output looks something similar to: */
183 /* " Lanai uptime (seconds): 766268 (0xbb13c)" */
184
185 /* This code may fail if number of ports on card > 1 */
186
187 linenum = 0;
188 while ( fgets( line, LINELEN, fp ) ) {
189 // printf("%s",line);
190 for(i=0; line[i]!= '\0' && i<LINELEN-1;i++) {
191
192 /* skip to colon */
193 if (line[i]==':') {
194
195 /* read in value */
196 if (line[i+1]!='\0') {
197 // printf("Line %d trying %s",linenum,&line[i+1]);
198 sscanf(&line[i+1],"%lld",&counters[linenum]);
199 linenum++;
200 break;
201 }
202 }
203 }
204 if (linenum>=MX_MAX_COUNTERS) break;
205 }
206
207 pclose( fp );
208
209 return PAPI_OK;
210}
211
212
213
214/*
215 * Component setup and shutdown
216 */
217
218/* Initialize hardware counters, setup the function vector table
219 * and get hardware information, this routine is called when the
220 * PAPI process is initialized (IE PAPI_library_init)
221 */
222static int
224{
225 int retval = PAPI_OK;
226 FILE *fff;
227 char *path;
228 int checklen, len, pathlen;
229
230 /* detect if MX available */
231
232 path = getenv("PATH");
233 pathlen = strlen(path);
234 while(pathlen > 0) {
235 len = strcspn(path, ":");
236 if (len < BUFSIZ) {
237 strncpy(mx_counters_exe, path, len);
238 } else {
239 fff = NULL;
240 break;
241 }
242 mx_counters_exe[len] = '\0';
243 checklen = len + strlen("/mx_counters");
244 if (checklen < BUFSIZ) {
245 strcat(mx_counters_exe, "/mx_counters");
246 } else {
247 fff = NULL;
248 break;
249 }
250 fff = fopen(mx_counters_exe, "r");
251 if (fff != NULL) {
252 checklen = checklen + strlen(" 2> /dev/null");
253 if (checklen < BUFSIZ) {
254 strcat(mx_counters_exe, " 2> /dev/null");
255 break;
256 } else {
257 fclose(fff);
258 fff = NULL;
259 break;
260 }
261 }
262 pathlen = pathlen - len - 1;
263 if (pathlen > 0) {
264 path = path + len + 1;
265 }
266 }
267 if (fff == NULL) {
268 /* mx_counters not found */
270 "No MX utilities found",PAPI_MAX_STR_LEN);
272 goto fn_fail;
273 }
274 fclose(fff);
275
278
279 /* Export the component id */
281
282 fn_exit:
283 _papi_hwd[cidx]->cmp_info.disabled = retval;
284 return retval;
285 fn_fail:
286 goto fn_exit;
287}
288
289
290/*
291 * This is called whenever a thread is initialized
292 */
293static int
295{
296 ( void ) ctx; /*unused */
297 return PAPI_OK;
298}
299
300
301static int
303{
304 return PAPI_OK;
305}
306
307static int
309{
310 ( void ) ctx; /*unused */
311 return PAPI_OK;
312}
313
314
315
316/*
317 * Control of counters (Reading/Writing/Starting/Stopping/Setup)
318 * functions
319 */
320static int
322{
323 ( void ) ctl; /*unused */
324
325 return PAPI_OK;
326}
327
328static int
330 int count, hwd_context_t *ctx )
331{
332 ( void ) ctx; /*unused */
333 int i, index;
334
335 MX_control_state_t *mx_ctl = (MX_control_state_t *)ctl;
336
337 for(i=0; i<count; i++ ) {
338 index = native[i].ni_event;
339 mx_ctl->which_counter[i]=index;
340 // printf("Mapping event# %d to HW counter %d (count=%d)\n",
341 // i,index,count);
342 native[i].ni_position = i;
343 }
344
345 mx_ctl->num_events=count;
346
347 return PAPI_OK;
348}
349
350
351static int
353{
354
355 long long mx_counters[MX_MAX_COUNTERS];
356
357 ( void ) ctx; /*unused */
358
359 MX_control_state_t *mx_ctl = (MX_control_state_t *)ctl;
360 int i;
361
362 read_mx_counters( mx_counters );
363
364 // for(i=0;i<MX_MAX_COUNTERS;i++) printf("%d %lld\n",i,mx_counters[i]);
365
366 for(i=0;i<mx_ctl->num_events;i++) {
367 mx_ctl->current_count[i]=
368 mx_counters[mx_ctl->which_counter[i]];
369 mx_ctl->start_count[i]=mx_ctl->current_count[i];
370 }
371
372 return PAPI_OK;
373}
374
375
376static int
378{
379 ( void ) ctx; /*unused */
380
381 long long mx_counters[MX_MAX_COUNTERS];
382 MX_control_state_t *mx_ctl = (MX_control_state_t *)ctl;
383 int i;
384
385 read_mx_counters( mx_counters );
386
387 for(i=0;i<mx_ctl->num_events;i++) {
388 mx_ctl->current_count[i]=
389 mx_counters[mx_ctl->which_counter[i]];
390 }
391
392 return PAPI_OK;
393}
394
395static int
397 int flags )
398{
399 ( void ) ctx; /*unused */
400 ( void ) flags; /*unused */
401 int i;
402 long long mx_counters[MX_MAX_COUNTERS];
403
404 MX_control_state_t *mx_ctl = (MX_control_state_t *)ctl;
405
406 read_mx_counters( mx_counters );
407
408 for ( i = 0; i < mx_ctl->num_events; i++ ) {
409 mx_ctl->current_count[i]=
410 mx_counters[mx_ctl->which_counter[i]];
411 mx_ctl->difference[i] = mx_ctl->current_count[i]-
412 mx_ctl->start_count[i];
413 }
414 *events = mx_ctl->difference;
415
416 return PAPI_OK;
417}
418
419
420static int
422{
423 _mx_start( ctx, ctrl );
424 return PAPI_OK;
425}
426
427/* Unused write function */
428/* static int */
429/* _mx_write( hwd_context_t * ctx, hwd_control_state_t * ctrl, long long *from ) */
430/* { */
431/* ( void ) ctx; /\*unused *\/ */
432/* ( void ) ctrl; /\*unused *\/ */
433/* ( void ) from; /\*unused *\/ */
434
435/* return PAPI_OK; */
436/* } */
437
438/*
439 * Functions for setting up various options
440 */
441
442/* This function sets various options in the component
443 * The valid codes being passed in are PAPI_SET_DEFDOM,
444 * PAPI_SET_DOMAIN, PAPI_SETDEFGRN, PAPI_SET_GRANUL * and PAPI_SET_INHERIT
445 */
446static int
447_mx_ctl( hwd_context_t * ctx, int code, _papi_int_option_t * option )
448{
449 ( void ) ctx; /*unused */
450 ( void ) code; /*unused */
451 ( void ) option; /*unused */
452
453 return PAPI_OK;
454}
455
456/*
457 * This function has to set the bits needed to count different domains
458 * In particular: PAPI_DOM_USER, PAPI_DOM_KERNEL PAPI_DOM_OTHER
459 * By default return PAPI_EINVAL if none of those are specified
460 * and PAPI_OK with success
461 * PAPI_DOM_USER is only user context is counted
462 * PAPI_DOM_KERNEL is only the Kernel/OS context is counted
463 * PAPI_DOM_OTHER is Exception/transient mode (like user TLB misses)
464 * PAPI_DOM_ALL is all of the domains
465 */
466static int
468{
469 ( void ) cntrl; /*unused */
470 if ( PAPI_DOM_ALL != domain ) {
471 return PAPI_EINVAL;
472 }
473
474 return PAPI_OK;
475}
476
477
478
479static int
480_mx_ntv_code_to_name( unsigned int EventCode, char *name, int len )
481{
482
483 int event=EventCode;
484
485 if (event >=0 && event < num_events) {
486 strncpy( name, mx_native_table[event].name, len );
487 return PAPI_OK;
488 }
489 return PAPI_ENOEVNT;
490
491
492}
493
494static int
495_mx_ntv_code_to_descr( unsigned int EventCode, char *name, int len )
496{
497 int event=EventCode;
498
499 if (event >=0 && event < num_events) {
500 strncpy( name, mx_native_table[event].description, len );
501 return PAPI_OK;
502 }
503 return PAPI_ENOEVNT;
504}
505
506
507
508static int
509_mx_ntv_enum_events( unsigned int *EventCode, int modifier )
510{
511
512 if ( modifier == PAPI_ENUM_FIRST ) {
513 if (num_events==0) return PAPI_ENOEVNT;
514 *EventCode = 0;
515 return PAPI_OK;
516 }
517
518 if ( modifier == PAPI_ENUM_EVENTS ) {
519 int index = *EventCode;
520
521 if ( mx_native_table[index + 1].resources.selector ) {
522 *EventCode = *EventCode + 1;
523 return PAPI_OK;
524 } else {
525 return PAPI_ENOEVNT;
526 }
527 }
528
529 return PAPI_EINVAL;
530}
531
532
534 .cmp_info = {
535 .name = "mx",
536 .short_name = "mx",
537 .version = "1.4",
538 .description = "Myricom MX (Myrinet Express) statistics",
539 .num_mpx_cntrs = MX_MAX_COUNTERS,
540 .num_cntrs = MX_MAX_COUNTERS,
541 .default_domain = PAPI_DOM_ALL,
542 .default_granularity = PAPI_GRN_SYS,
543 .available_granularities = PAPI_GRN_SYS,
544 .hardware_intr_sig = PAPI_INT_SIGNAL,
545
546 /* component specific cmp_info initializations */
547 .fast_real_timer = 0,
548 .fast_virtual_timer = 0,
549 .attach = 0,
550 .attach_must_ptrace = 0,
551 .available_domains = PAPI_DOM_ALL,
552 },
553
554 /* sizes of framework-opaque component-private structures */
555 .size = {
556 .context = sizeof ( MX_context_t ),
557 .control_state = sizeof ( MX_control_state_t ),
558 .reg_value = sizeof ( MX_register_t ),
559 .reg_alloc = sizeof ( MX_reg_alloc_t ),
560 },
561 /* function pointers in this component */
562 .init_thread = _mx_init_thread,
563 .init_component = _mx_init_component,
564 .init_control_state = _mx_init_control_state,
565 .start = _mx_start,
566 .stop = _mx_stop,
567 .read = _mx_read,
568 .shutdown_thread = _mx_shutdown_thread,
569 .shutdown_component = _mx_shutdown_component,
570 .ctl = _mx_ctl,
571 .update_control_state = _mx_update_control_state,
572 .set_domain = _mx_set_domain,
573 .reset = _mx_reset,
574
575 .ntv_enum_events = _mx_ntv_enum_events,
576 .ntv_code_to_name = _mx_ntv_code_to_name,
577 .ntv_code_to_descr = _mx_ntv_code_to_descr,
578};
int i
static long count
struct papi_vectors * _papi_hwd[]
#define PAPI_ENUM_EVENTS
Definition: f90papi.h:224
#define PAPI_OK
Definition: f90papi.h:73
#define PAPI_ENUM_FIRST
Definition: f90papi.h:85
#define PAPI_ENOEVNT
Definition: f90papi.h:139
#define PAPI_EINVAL
Definition: f90papi.h:115
#define PAPI_MAX_STR_LEN
Definition: f90papi.h:77
#define PAPI_ECMP
Definition: f90papi.h:214
#define PAPI_GRN_SYS
Definition: f90papi.h:43
#define PAPI_DOM_ALL
Definition: f90papi.h:261
FILE * fff[MAX_EVENTS]
char events[MAX_EVENTS][BUFSIZ]
static const MX_native_event_entry_t mx_native_table[]
Definition: linux-mx.c:58
static int _mx_ntv_code_to_name(unsigned int EventCode, char *name, int len)
Definition: linux-mx.c:480
static int _mx_shutdown_thread(hwd_context_t *ctx)
Definition: linux-mx.c:308
static int num_events
Definition: linux-mx.c:161
papi_vector_t _mx_vector
Definition: linux-mx.c:162
static int _mx_stop(hwd_context_t *ctx, hwd_control_state_t *ctl)
Definition: linux-mx.c:377
static int _mx_start(hwd_context_t *ctx, hwd_control_state_t *ctl)
Definition: linux-mx.c:352
static int _mx_ctl(hwd_context_t *ctx, int code, _papi_int_option_t *option)
Definition: linux-mx.c:447
static int _mx_ntv_enum_events(unsigned int *EventCode, int modifier)
Definition: linux-mx.c:509
#define LINELEN
Definition: linux-mx.c:20
static int _mx_read(hwd_context_t *ctx, hwd_control_state_t *ctl, long long **events, int flags)
Definition: linux-mx.c:396
static int _mx_set_domain(hwd_control_state_t *cntrl, int domain)
Definition: linux-mx.c:467
static int _mx_init_component(int cidx)
Definition: linux-mx.c:223
static int _mx_init_thread(hwd_context_t *ctx)
Definition: linux-mx.c:294
static char mx_counters_exe[BUFSIZ]
Definition: linux-mx.c:164
static int _mx_shutdown_component(void)
Definition: linux-mx.c:302
static int _mx_ntv_code_to_descr(unsigned int EventCode, char *name, int len)
Definition: linux-mx.c:495
static int _mx_init_control_state(hwd_control_state_t *ctl)
Definition: linux-mx.c:321
static int _mx_update_control_state(hwd_control_state_t *ctl, NativeInfo_t *native, int count, hwd_context_t *ctx)
Definition: linux-mx.c:329
static int read_mx_counters(long long *counters)
Definition: linux-mx.c:167
static int _mx_reset(hwd_context_t *ctx, hwd_control_state_t *ctrl)
Definition: linux-mx.c:421
#define MX_MAX_COUNTERS
Definition: linux-mx.c:17
Return codes and api definitions.
int fclose(FILE *__stream)
#define PAPI_INT_SIGNAL
Definition: papi_internal.h:52
static FILE * fp
static int native
static int cidx
const char * name
Definition: rocs.c:225
MX_control_state_t state
Definition: linux-mx.c:54
long long difference[MX_MAX_COUNTERS]
Definition: linux-mx.c:47
int which_counter[MX_MAX_COUNTERS]
Definition: linux-mx.c:48
long long current_count[MX_MAX_COUNTERS]
Definition: linux-mx.c:46
long long start_count[MX_MAX_COUNTERS]
Definition: linux-mx.c:45
Definition: linux-mx.c:29
char * description
Definition: linux-mx.c:35
MX_register_t resources
Definition: linux-mx.c:31
char * name
Definition: linux-mx.c:33
MX_register_t ra_bits
Definition: linux-mx.c:40
unsigned int selector
Definition: linux-mx.c:25
char name[PAPI_MAX_STR_LEN]
Definition: papi.h:627
char disabled_reason[PAPI_HUGE_STR_LEN]
Definition: papi.h:634
PAPI_component_info_t cmp_info
Definition: papi_vector.h:20
int retval
Definition: zero_fork.c:53