diff --git a/infiniband.c b/infiniband.c index 5c8655c41391da7feb49af46aca48619acf31e48..fb8928c4a6e68f6fce1badd09e4061d9f9c678a0 100644 --- a/infiniband.c +++ b/infiniband.c @@ -24,9 +24,19 @@ #include <glob.h> -int *init_infiniband(char* infi_path) { +#include <stdint.h> + +struct network_t { + uint64_t values[4]; + uint64_t tmp_values[4]; + int sources[4]; +}; +unsigned int _get_network(uint64_t* results, int* sources); + + +unsigned int init_infiniband(char* infi_path, void**ptr) { if(infi_path==NULL) - return NULL; + return 0; if(strcmp(infi_path,"X")==0) { @@ -34,7 +44,7 @@ int *init_infiniband(char* infi_path) { glob("/sys/class/infiniband/*/ports/*/counters/", 0, NULL, &res); if(res.gl_pathc == 0) - return NULL; + return 0; infi_path = res.gl_pathv[0]; } @@ -42,14 +52,19 @@ int *init_infiniband(char* infi_path) { "%s/port_rcv_data", "%s/port_xmit_packets", "%s/port_xmit_data"}; - int* sources = malloc(sizeof(int)*4); + + struct network_t *state = malloc(sizeof(struct network_t)); + char buffer[1024]; for(int i=0; i<4; i++) { sprintf(buffer, filenames[i], infi_path); - sources[i] = open(buffer, O_RDONLY); + state->sources[i] = open(buffer, O_RDONLY); } + + *ptr = (void*) state; + _get_network(state->values, state->sources); - return sources; + return 4; } /* void get_network(long long* results, char** sources) { */ diff --git a/mojitos.c b/mojitos.c index 924c685cff1c2359a8efc35d7e84ec8d30ac4899..2b511f323f00666427824017930c0a4110c22921 100644 --- a/mojitos.c +++ b/mojitos.c @@ -146,8 +146,6 @@ int main(int argc, char **argv) { int total_time=1; int delta=0; int frequency=1; - char *dev = NULL; - char *infi_path = NULL; char **application = NULL; int rapl_mode = -1; @@ -177,10 +175,10 @@ int main(int argc, char **argv) { } break; case 'd': - dev = argv[optind]; + add_source(init_network, argv[optind], label_network, get_network, clean_network); break; case 'i': - infi_path = argv[optind]; + add_source(init_infiniband, argv[optind], label_network, get_network, clean_network); break; case 'o': output = fopen(argv[optind],"wb"); @@ -210,22 +208,22 @@ int main(int argc, char **argv) { } - // Network initialization - int *network_sources = NULL; - if(dev != NULL) - network_sources = init_network(dev); - uint64_t network_values[4]={0,0,0,0}; - uint64_t tmp_network_values[4]={0,0,0,0}; - get_network(network_values, network_sources); - - int * infiniband_sources = NULL; - if(infi_path != NULL) - infiniband_sources = init_infiniband(infi_path); - if(infiniband_sources == NULL) - infi_path = NULL; - uint64_t infiniband_values[4]={0,0,0,0}; - uint64_t tmp_infiniband_values[4]={0,0,0,0}; - get_network(infiniband_values, infiniband_sources); + /* // Network initialization */ + /* int *network_sources = NULL; */ + /* if(dev != NULL) */ + /* network_sources = init_network(dev); */ + /* uint64_t network_values[4]={0,0,0,0}; */ + /* uint64_t tmp_network_values[4]={0,0,0,0}; */ + /* get_network(network_values, network_sources); */ + + /* int * infiniband_sources = NULL; */ + /* if(infi_path != NULL) */ + /* infiniband_sources = init_infiniband(infi_path); */ + /* if(infiniband_sources == NULL) */ + /* infi_path = NULL; */ + /* uint64_t infiniband_values[4]={0,0,0,0}; */ + /* uint64_t tmp_infiniband_values[4]={0,0,0,0}; */ + /* get_network(infiniband_values, infiniband_sources); */ // RAPL initialization _rapl_t* rapl=NULL; @@ -265,10 +263,10 @@ int main(int argc, char **argv) { if(perf_mode==0) for(int i=0; i<nb_perf;i++) fprintf(output, "%s ", perf_static_info[perf_indexes[i]].name); - if(dev!=NULL) - fprintf(output, "rxp rxb txp txb "); - if(infi_path!=NULL) - fprintf(output, "irxp irxb itxp itxb "); + /* if(dev!=NULL) */ + /* fprintf(output, "rxp rxb txp txb "); */ + /* if(infi_path!=NULL) */ + /* fprintf(output, "irxp irxb itxp itxb "); */ if(rapl_mode==0) for (int r=0; r<nb_rapl; r++) @@ -296,10 +294,10 @@ int main(int argc, char **argv) { // Get Data if(perf_mode==0) get_counters(fd, tmp_counter_values); - if(dev != NULL) - get_network(tmp_network_values, network_sources); - if(infi_path != NULL) - get_network(tmp_infiniband_values, infiniband_sources); + // if(dev != NULL) + // get_network(tmp_network_values, network_sources); + //if(infi_path != NULL) + // get_network(tmp_infiniband_values, infiniband_sources); if(rapl_mode==0) get_rapl(tmp_rapl_values, rapl); @@ -343,12 +341,12 @@ int main(int argc, char **argv) { if(perf_mode==0) for(int i=0; i<nb_perf;i++) fprintf(output, "%" PRIu64 " ", tmp_counter_values[i]-counter_values[i]); - if(dev != NULL) - for(int i=0; i<4; i++) - fprintf(output, "%" PRIu64 " ", tmp_network_values[i]-network_values[i]); - if(infi_path != NULL) - for(int i=0; i<4; i++) - fprintf(output, "%" PRIu64 " ", tmp_infiniband_values[i]-infiniband_values[i]); + /* if(dev != NULL) */ + /* for(int i=0; i<4; i++) */ + /* fprintf(output, "%" PRIu64 " ", tmp_network_values[i]-network_values[i]); */ + /* if(infi_path != NULL) */ + /* for(int i=0; i<4; i++) */ + /* fprintf(output, "%" PRIu64 " ", tmp_infiniband_values[i]-infiniband_values[i]); */ if(rapl_mode==0) for (int r=0; r<nb_rapl; r++) fprintf(output, "%" PRIu64 " ", tmp_rapl_values[r]-rapl_values[r]); @@ -369,10 +367,10 @@ int main(int argc, char **argv) { if(rapl_mode==0) memcpy(rapl_values, tmp_rapl_values, nb_rapl*sizeof(uint64_t)); - if(dev !=NULL) - memcpy(network_values, tmp_network_values, sizeof(network_values)); - if(infi_path !=NULL) - memcpy(infiniband_values, tmp_infiniband_values, sizeof(infiniband_values)); + /* if(dev !=NULL) */ + /* memcpy(network_values, tmp_network_values, sizeof(network_values)); */ + /* if(infi_path !=NULL) */ + /* memcpy(infiniband_values, tmp_infiniband_values, sizeof(infiniband_values)); */ clock_gettime(CLOCK_MONOTONIC, &ts); usleep(1000*1000/frequency-(ts.tv_nsec/1000)%(1000*1000/frequency)); } @@ -385,10 +383,10 @@ int main(int argc, char **argv) { for(int i=0; i<nb_sources;i++) cleaner[i](states[i]); - if(dev!=NULL) - clean_network(network_sources); - if(infi_path!=NULL) - clean_network(infiniband_sources); + /* if(dev!=NULL) */ + /* clean_network(network_sources); */ + /* if(infi_path!=NULL) */ + /* clean_network(infiniband_sources); */ if(perf_mode==0){ clean_counters(fd); free(counter_values); diff --git a/network.c b/network.c index f3f8b3c43e1eace354aa8cbe2dd4e94234f85c3d..f197b9770ccc0e5aa808c80273d7298fb2781429 100644 --- a/network.c +++ b/network.c @@ -24,9 +24,29 @@ #include <string.h> #include <stdint.h> -int *init_network(char* dev) { +struct network_t { + uint64_t values[4]; + uint64_t tmp_values[4]; + int sources[4]; +}; + +unsigned int _get_network(uint64_t* results, int* sources) { + if(sources==NULL) + return 0; + char buffer[128]; + for(int i=0; i<4; i++){ + pread(sources[i], buffer, 127, 0); + + results[i] = strtoull(buffer, NULL, 10); + } + return 4; +} + + + +unsigned int init_network(char* dev, void**ptr) { if(dev==NULL) - return NULL; + return 0; if(strcmp(dev,"X")==0) { int f = open("/proc/net/route", O_RDONLY); @@ -43,33 +63,41 @@ int *init_network(char* dev) { "/sys/class/net/%s/statistics/rx_bytes", "/sys/class/net/%s/statistics/tx_packets", "/sys/class/net/%s/statistics/tx_bytes"}; - int* sources = malloc(sizeof(int)*4); + + struct network_t *state = malloc(sizeof(struct network_t)); + char buffer2[256]; for(int i=0; i<4; i++) { sprintf(buffer2, filenames[i], dev); - sources[i] = open(buffer2, O_RDONLY); + state->sources[i] = open(buffer2, O_RDONLY); } + *ptr = (void*) state; + _get_network(state->values, state->sources); - return sources; + return 4; } -void get_network(uint64_t* results, int *sources) { - if(sources==NULL) - return; - char buffer[128]; - for(int i=0; i<4; i++){ - pread(sources[i], buffer, 127, 0); +unsigned int get_network(uint64_t* results, void* ptr) { + struct network_t *state = (struct network_t *) ptr; + _get_network(state->tmp_values, state->sources); + for(int i=0; i<4; i++) + results[i] = state->tmp_values[i] - state->values[i]; - results[i] = strtoull(buffer, NULL, 10); - - //results[i] = atoll(buffer); - } + memcpy(state->values, state->tmp_values, 4*sizeof(uint64_t)); + return 4; } -void clean_network(int *sources) { - if(sources==NULL) +void clean_network(void *ptr) { + struct network_t *state = (struct network_t *) ptr; + if(state==NULL) return; for(int i=0;i<4;i++) - close(sources[i]); - free(sources); + close(state->sources[i]); + free(state); } + +char *_labels_network[4] = {"rxp", "rxb", "txp", "txb"}; +void label_network(char **labels) { + for(int i=0; i<4; i++) + labels[i] = _labels_network[i]; +} diff --git a/network.h b/network.h index 7ff14ba3e81052135745fe9bcf35bdce1beb61ee..df25df89448421eb8fabc73607c6778b49b77cbb 100644 --- a/network.h +++ b/network.h @@ -18,6 +18,8 @@ *******************************************************/ -int *init_network(char* dev); -void get_network(uint64_t* results, int * sources); -void clean_network(int *sources); +unsigned int init_network(char*, void **); +unsigned int get_network(uint64_t* results, void*); +void clean_network(void *); +void label_network(char **labels); +