/* * Initialize context for node selection plugin */ extern int slurm_select_init(bool only_default) { int retval = SLURM_SUCCESS; char *select_type = NULL; int i, j, plugin_cnt; char *plugin_type = "select"; List plugin_names = NULL; _plugin_args_t plugin_args = {0}; if ( init_run && select_context ) return retval; slurm_mutex_lock( &select_context_lock ); if ( select_context ) goto done; select_type = slurm_get_select_type(); if (working_cluster_rec) { /* just ignore warnings here */ } else { #ifdef HAVE_NATIVE_CRAY if (xstrcasecmp(select_type, "select/cray")) { error("%s is incompatible with a native Cray system.", select_type); fatal("Use SelectType=select/cray"); } #else /* if (!xstrcasecmp(select_type, "select/cray")) { */ /* fatal("Requested SelectType=select/cray " */ /* "in slurm.conf, but not running on a native Cray " */ /* "system. If looking to run on a Cray " */ /* "system natively use --enable-native-cray."); */ /* } */ #endif } select_context_cnt = 0; plugin_args.plugin_type = plugin_type; plugin_args.default_plugin = select_type; if (only_default) { plugin_names = list_create(slurm_destroy_char); list_append(plugin_names, xstrdup(select_type)); } else { plugin_names = plugin_get_plugins_of_type(plugin_type); } if (plugin_names && (plugin_cnt = list_count(plugin_names))) { ops = xcalloc(plugin_cnt, sizeof(slurm_select_ops_t)); select_context = xcalloc(plugin_cnt, sizeof(plugin_context_t *)); list_for_each(plugin_names, _load_plugins, &plugin_args); } if (select_context_default == -1) fatal("Can't find plugin for %s", select_type); /* Ensure that plugin_id is valid and unique */ for (i=0; i<select_context_cnt; i++) { for (j=i+1; j<select_context_cnt; j++) { if (*(ops[i].plugin_id) != *(ops[j].plugin_id)) continue; fatal("SelectPlugins: Duplicate plugin_id %u for " "%s and %s", *(ops[i].plugin_id), select_context[i]->type, select_context[j]->type); } if (*(ops[i].plugin_id) < 100) { fatal("SelectPlugins: Invalid plugin_id %u (<100) %s", *(ops[i].plugin_id), select_context[i]->type); } } init_run = true; done: slurm_mutex_unlock( &select_context_lock ); if (!working_cluster_rec) { if (select_running_linear_based()) { uint16_t cr_type = slurm_get_select_type_param(); if (cr_type & (CR_CPU | CR_CORE | CR_SOCKET)) { fatal("Invalid SelectTypeParameters for " "%s: %s (%u), it can't contain " "CR_(CPU|CORE|SOCKET).", select_type, select_type_param_string(cr_type), cr_type); } } } xfree(select_type); FREE_NULL_LIST(plugin_names); return retval; }
extern int switch_init(bool only_default) { int retval = SLURM_SUCCESS; char *plugin_type = "switch"; char *switch_type = NULL; int i, j, plugin_cnt; List plugin_names = NULL; _plugin_args_t plugin_args = {0}; if ( init_run && switch_context ) return retval; slurm_mutex_lock( &context_lock ); if ( switch_context ) goto done; switch_context_cnt = 0; switch_type = slurm_get_switch_type(); plugin_args.plugin_type = plugin_type; plugin_args.default_plugin = switch_type; if (only_default) { plugin_names = list_create(slurm_destroy_char); list_append(plugin_names, xstrdup(switch_type)); } else { plugin_names = plugin_get_plugins_of_type(plugin_type); } if (plugin_names && (plugin_cnt = list_count(plugin_names))) { ops = xmalloc(sizeof(slurm_switch_ops_t) * plugin_cnt); switch_context = xmalloc(sizeof(plugin_context_t *) * plugin_cnt); list_for_each(plugin_names, _load_plugins, &plugin_args); } if (switch_context_default == -1) fatal("Can't find plugin for %s", switch_type); /* Insure that plugin_id is valid and unique */ for (i = 0; i < switch_context_cnt; i++) { for (j = i+1; j < switch_context_cnt; j++) { if (*(ops[i].plugin_id) != *(ops[j].plugin_id)) continue; fatal("switchPlugins: Duplicate plugin_id %u for " "%s and %s", *(ops[i].plugin_id), switch_context[i]->type, switch_context[j]->type); } if (*(ops[i].plugin_id) < 100) { fatal("switchPlugins: Invalid plugin_id %u (<100) %s", *(ops[i].plugin_id), switch_context[i]->type); } } init_run = true; done: slurm_mutex_unlock( &context_lock ); xfree(switch_type); FREE_NULL_LIST(plugin_names); return retval; }