diff --git a/orte/mca/rmaps/ppr/rmaps_ppr.c b/orte/mca/rmaps/ppr/rmaps_ppr.c index 767e1134e3..000dcbb529 100644 --- a/orte/mca/rmaps/ppr/rmaps_ppr.c +++ b/orte/mca/rmaps/ppr/rmaps_ppr.c @@ -3,6 +3,8 @@ * Copyright (c) 2011 Los Alamos National Security, LLC. * All rights reserved. * Copyright (c) 2014-2015 Intel, Inc. All rights reserved. + * Copyright (c) 2015 Research Organization for Information Science + * and Technology (RIST). All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -346,6 +348,22 @@ static int ppr_mapper(orte_job_t *jdata) * properly set */ ORTE_FLAG_SET(node, ORTE_NODE_FLAG_OVERSUBSCRIBED); + /* check for permission */ + if (ORTE_FLAG_TEST(node, ORTE_NODE_FLAG_SLOTS_GIVEN)) { + /* if we weren't given a directive either way, then we will error out + * as the #slots were specifically given, either by the host RM or + * via hostfile/dash-host */ + if (!(ORTE_MAPPING_SUBSCRIBE_GIVEN & ORTE_GET_MAPPING_DIRECTIVE(orte_rmaps_base.mapping))) { + orte_show_help("help-orte-rmaps-base.txt", "orte-rmaps-base:alloc-error", + true, app->num_procs, app->app); + return ORTE_ERR_SILENT; + } else if (ORTE_MAPPING_NO_OVERSUBSCRIBE & ORTE_GET_MAPPING_DIRECTIVE(jdata->map->mapping)) { + /* if we were explicitly told not to oversubscribe, then don't */ + orte_show_help("help-orte-rmaps-base.txt", "orte-rmaps-base:alloc-error", + true, app->num_procs, app->app); + return ORTE_ERR_SILENT; + } + } } /* if we haven't mapped all the procs, continue on to the diff --git a/orte/mca/rmaps/round_robin/rmaps_rr_mappers.c b/orte/mca/rmaps/round_robin/rmaps_rr_mappers.c index 0cb4044059..4b821308c2 100644 --- a/orte/mca/rmaps/round_robin/rmaps_rr_mappers.c +++ b/orte/mca/rmaps/round_robin/rmaps_rr_mappers.c @@ -11,6 +11,8 @@ * All rights reserved. * Copyright (c) 2009-2013 Cisco Systems, Inc. All rights reserved. * Copyright (c) 2013-2015 Intel, Inc. All rights reserved. + * Copyright (c) 2015 Research Organization for Information Science + * and Technology (RIST). All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -184,6 +186,22 @@ int orte_rmaps_rr_byslot(orte_job_t *jdata, * properly set */ ORTE_FLAG_SET(node, ORTE_NODE_FLAG_OVERSUBSCRIBED); + /* check for permission */ + if (ORTE_FLAG_TEST(node, ORTE_NODE_FLAG_SLOTS_GIVEN)) { + /* if we weren't given a directive either way, then we will error out + * as the #slots were specifically given, either by the host RM or + * via hostfile/dash-host */ + if (!(ORTE_MAPPING_SUBSCRIBE_GIVEN & ORTE_GET_MAPPING_DIRECTIVE(orte_rmaps_base.mapping))) { + orte_show_help("help-orte-rmaps-base.txt", "orte-rmaps-base:alloc-error", + true, app->num_procs, app->app); + return ORTE_ERR_SILENT; + } else if (ORTE_MAPPING_NO_OVERSUBSCRIBE & ORTE_GET_MAPPING_DIRECTIVE(jdata->map->mapping)) { + /* if we were explicitly told not to oversubscribe, then don't */ + orte_show_help("help-orte-rmaps-base.txt", "orte-rmaps-base:alloc-error", + true, app->num_procs, app->app); + return ORTE_ERR_SILENT; + } + } } /* if we have mapped everything, then we are done */ if (nprocs_mapped == app->num_procs) { @@ -349,6 +367,22 @@ int orte_rmaps_rr_bynode(orte_job_t *jdata, * properly set */ ORTE_FLAG_SET(node, ORTE_NODE_FLAG_OVERSUBSCRIBED); + /* check for permission */ + if (ORTE_FLAG_TEST(node, ORTE_NODE_FLAG_SLOTS_GIVEN)) { + /* if we weren't given a directive either way, then we will error out + * as the #slots were specifically given, either by the host RM or + * via hostfile/dash-host */ + if (!(ORTE_MAPPING_SUBSCRIBE_GIVEN & ORTE_GET_MAPPING_DIRECTIVE(orte_rmaps_base.mapping))) { + orte_show_help("help-orte-rmaps-base.txt", "orte-rmaps-base:alloc-error", + true, app->num_procs, app->app); + return ORTE_ERR_SILENT; + } else if (ORTE_MAPPING_NO_OVERSUBSCRIBE & ORTE_GET_MAPPING_DIRECTIVE(jdata->map->mapping)) { + /* if we were explicitly told not to oversubscribe, then don't */ + orte_show_help("help-orte-rmaps-base.txt", "orte-rmaps-base:alloc-error", + true, app->num_procs, app->app); + return ORTE_ERR_SILENT; + } + } } if (nprocs_mapped == app->num_procs) { /* we are done */ @@ -550,6 +584,22 @@ int orte_rmaps_rr_byobj(orte_job_t *jdata, * properly set */ ORTE_FLAG_SET(node, ORTE_NODE_FLAG_OVERSUBSCRIBED); + /* check for permission */ + if (ORTE_FLAG_TEST(node, ORTE_NODE_FLAG_SLOTS_GIVEN)) { + /* if we weren't given a directive either way, then we will error out + * as the #slots were specifically given, either by the host RM or + * via hostfile/dash-host */ + if (!(ORTE_MAPPING_SUBSCRIBE_GIVEN & ORTE_GET_MAPPING_DIRECTIVE(orte_rmaps_base.mapping))) { + orte_show_help("help-orte-rmaps-base.txt", "orte-rmaps-base:alloc-error", + true, app->num_procs, app->app); + return ORTE_ERR_SILENT; + } else if (ORTE_MAPPING_NO_OVERSUBSCRIBE & ORTE_GET_MAPPING_DIRECTIVE(jdata->map->mapping)) { + /* if we were explicitly told not to oversubscribe, then don't */ + orte_show_help("help-orte-rmaps-base.txt", "orte-rmaps-base:alloc-error", + true, app->num_procs, app->app); + return ORTE_ERR_SILENT; + } + } } if (nprocs_mapped == app->num_procs) { /* we are done */ diff --git a/orte/mca/rmaps/seq/rmaps_seq.c b/orte/mca/rmaps/seq/rmaps_seq.c index ea70d8abd5..d08fe589e0 100644 --- a/orte/mca/rmaps/seq/rmaps_seq.c +++ b/orte/mca/rmaps/seq/rmaps_seq.c @@ -370,6 +370,22 @@ static int orte_rmaps_seq_map(orte_job_t *jdata) * properly set */ ORTE_FLAG_SET(node, ORTE_NODE_FLAG_OVERSUBSCRIBED); + /* check for permission */ + if (ORTE_FLAG_TEST(node, ORTE_NODE_FLAG_SLOTS_GIVEN)) { + /* if we weren't given a directive either way, then we will error out + * as the #slots were specifically given, either by the host RM or + * via hostfile/dash-host */ + if (!(ORTE_MAPPING_SUBSCRIBE_GIVEN & ORTE_GET_MAPPING_DIRECTIVE(orte_rmaps_base.mapping))) { + orte_show_help("help-orte-rmaps-base.txt", "orte-rmaps-base:alloc-error", + true, app->num_procs, app->app); + return ORTE_ERR_SILENT; + } else if (ORTE_MAPPING_NO_OVERSUBSCRIBE & ORTE_GET_MAPPING_DIRECTIVE(jdata->map->mapping)) { + /* if we were explicitly told not to oversubscribe, then don't */ + orte_show_help("help-orte-rmaps-base.txt", "orte-rmaps-base:alloc-error", + true, app->num_procs, app->app); + return ORTE_ERR_SILENT; + } + } } /* assign the vpid */ proc->name.vpid = vpid++;