From 65b51636586962482b83c228021a3ad8bcb5fc0d Mon Sep 17 00:00:00 2001 From: "David M. Ozog" Date: Tue, 7 Jan 2020 17:29:12 -0500 Subject: [PATCH] Fix team creation with invalid parent or xrange * Set xrange to be less than or equal to the parent_team size * Return nonzero in strided split when parent is invalid * Return nonzero in 2D split when parent is invalid * Correct shmemx_team_reuse_teams example accordingly Signed-off-by: David M. Ozog --- src/shmem_team.c | 15 ++++++++++++--- test/shmemx/shmemx_team_reuse_teams.c | 2 +- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/shmem_team.c b/src/shmem_team.c index ef876bcdd..eec249500 100644 --- a/src/shmem_team.c +++ b/src/shmem_team.c @@ -249,7 +249,7 @@ int shmem_internal_team_split_strided(shmem_internal_team_t *parent_team, int PE *new_team = SHMEMX_TEAM_INVALID; if (parent_team == SHMEMX_TEAM_INVALID) { - return 0; + return 1; } int global_PE_start = shmem_internal_team_pe(parent_team, PE_start); @@ -365,6 +365,17 @@ int shmem_internal_team_split_2d(shmem_internal_team_t *parent_team, int xrange, shmem_internal_team_t **xaxis_team, const shmemx_team_config_t *yaxis_config, long yaxis_mask, shmem_internal_team_t **yaxis_team) { + *xaxis_team = SHMEMX_TEAM_INVALID; + *yaxis_team = SHMEMX_TEAM_INVALID; + + if (parent_team == SHMEMX_TEAM_INVALID) { + return 1; + } + + if (xrange > parent_team->size) { + xrange = parent_team->size; + } + const int parent_start = parent_team->start; const int parent_stride = parent_team->stride; const int parent_size = parent_team->size; @@ -373,7 +384,6 @@ int shmem_internal_team_split_2d(shmem_internal_team_t *parent_team, int xrange, int start = 0; int ret = 0; - *xaxis_team = SHMEMX_TEAM_INVALID; for (int i = 0; i < num_xteams; i++) { shmem_internal_team_t *my_xteam; @@ -393,7 +403,6 @@ int shmem_internal_team_split_2d(shmem_internal_team_t *parent_team, int xrange, } start = 0; - *yaxis_team = SHMEMX_TEAM_INVALID; for (int i = 0; i < num_yteams; i++) { shmem_internal_team_t *my_yteam; diff --git a/test/shmemx/shmemx_team_reuse_teams.c b/test/shmemx/shmemx_team_reuse_teams.c index 33f3b6120..0aeb59d06 100644 --- a/test/shmemx/shmemx_team_reuse_teams.c +++ b/test/shmemx/shmemx_team_reuse_teams.c @@ -57,7 +57,7 @@ int main(void) } ret = shmemx_team_split_strided(old_team, 1, 1, shmemx_team_n_pes(old_team)-1, NULL, 0, &new_team); - if (ret) ++errors; + if (old_team != SHMEMX_TEAM_INVALID && ret) ++errors; shmemx_team_destroy(old_team); old_team = new_team;