1
1
openmpi/ompi/mca/btl/pcie/btl_pcie_cfg.c
Ralph Castain 4d3aa5a8a4 Once again, into the breach!
Yes, friends, our favorite PCIE BTL has resurfaced as mgmt vacillates over its existence. This is an updated version that actually mostly works, in its final stages of debugging.

Some generalization still remains to be done...

This commit was SVN r21358.
2009-06-02 22:26:36 +00:00

197 строки
4.3 KiB
C

/*
* Copyright (c) 2007 Los Alamos National Security, LLC.
* All righs reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
#include "ompi_config.h"
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#include "opal/util/output.h"
#include "opal/util/os_path.h"
#include "opal/mca/base/mca_base_param.h"
#include "opal/mca/installdirs/installdirs.h"
#include "orte/util/proc_info.h"
#include "orte/util/show_help.h"
#include "btl_pcie.h"
#include "btl_pcie_lex.h"
static char *cfg_filename;
static char *key_buffer = NULL;
static size_t key_buffer_len = 0;
/*
* Local functions
*/
static char* parse_file(char *filename, bool local, char *key);
/**************************************************************************/
char *
ompi_btl_pcie_cfg_get_local_device(char* hostname, int core)
{
char *key, *ret, *file;
file = opal_os_path(false,
opal_install_dirs.sysconfdir,
"mca-btl-pcie-local-resources.cfg",
NULL);
asprintf(&key, "%s:%d", hostname, core);
ret = parse_file(file, true, key);
free(key);
free(file);
return ret;
}
char *
ompi_btl_pcie_cfg_get_matching_device(char* remote_hostname,
char* remote_device)
{
char *key, *ret, *pos, *file;
file = opal_os_path(false,
opal_install_dirs.sysconfdir,
"mca-btl-pcie-remote-resources.cfg",
NULL);
asprintf(&key, "%s:%s", remote_hostname, remote_device);
ret = parse_file(file, false, key);
free(file);
free(key);
if (ret == NULL) return NULL;
pos = strchr(ret, ':');
if (pos == NULL) {
free(ret);
return NULL;
}
/* make sure this is my hostname */
*pos = '\0';
if (0 != strcmp(orte_process_info.nodename, ret)) {
free(ret);
return NULL;
}
pos++;
pos = strdup(pos);
free(ret);
return pos;
}
/*
* Parse a single file
*/
static char* parse_file(char *filename, bool local, char* key)
{
int val;
bool me;
char *tmp = NULL;
/* Open the file */
cfg_filename = filename;
btl_pcie_cfg_yyin = fopen(filename, "r");
if (NULL == btl_pcie_cfg_yyin) {
orte_show_help("help-mpi-btl-pcie.txt", "ini file:file not found",
true, filename);
goto cleanup;
}
/* Do the parsing */
btl_pcie_cfg_parse_done = false;
btl_pcie_cfg_yynewlines = 1;
btl_pcie_cfg_init_buffer(btl_pcie_cfg_yyin);
while (!btl_pcie_cfg_parse_done) {
val = btl_pcie_cfg_yylex();
switch (val) {
case BTL_PCIE_CFG_PARSE_DONE:
/* This will also set btl_pcie_cfg_parse_done to true, so just
break here */
break;
case BTL_PCIE_CFG_PARSE_NEWLINE:
/* blank line! ignore it */
break;
case BTL_PCIE_CFG_PARSE_HOSTNAME_CORE:
if (!local) {
return NULL;
}
if (0 == strcmp(key, btl_pcie_cfg_yytext)) {
me = true;
} else {
me = false;
}
val = btl_pcie_cfg_yylex();
if (BTL_PCIE_CFG_PARSE_DEVICE != val) {
abort();
}
if (me) return strdup(btl_pcie_cfg_yytext);
break;
case BTL_PCIE_CFG_PARSE_HOSTNAME_DEVICE:
if (local) {
return NULL;
}
if (0 == strcmp(key, btl_pcie_cfg_yytext)) {
me = true;
} else {
tmp = strdup(btl_pcie_cfg_yytext);
me = false;
}
val = btl_pcie_cfg_yylex();
if (BTL_PCIE_CFG_PARSE_HOSTNAME_DEVICE != val) {
abort();
}
if (me) {
return strdup(btl_pcie_cfg_yytext);
} else {
if (0 == strcmp(key, btl_pcie_cfg_yytext)) {
return tmp;
} else {
free(tmp);
}
}
break;
default:
return NULL;
break;
}
}
fclose(btl_pcie_cfg_yyin);
cleanup:
if (NULL != key_buffer) {
free(key_buffer);
key_buffer = NULL;
key_buffer_len = 0;
}
return NULL;
}