Skip to content

Commit b55b9e6

Browse files
committed
sentinel: fix sentinel to proc_name conversion
converting an opal_process_name_t means the loss of one bit, it was decided to restrict the local job id to 15 bits, so the useful information of an opal_process_name_t can fit in 63 bits.
1 parent 030a5f2 commit b55b9e6

File tree

3 files changed

+39
-4
lines changed

3 files changed

+39
-4
lines changed

ompi/mca/rte/orte/rte_orte.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* All rights reserved.
44
* Copyright (c) 2013-2015 Intel, Inc. All rights reserved
55
* Copyright (c) 2014 Cisco Systems, Inc. All rights reserved.
6-
* Copyright (c) 2014 Research Organization for Information Science
6+
* Copyright (c) 2014-2016 Research Organization for Information Science
77
* and Technology (RIST). All rights reserved.
88
* Copyright (c) 2015 Intel, Inc. All rights reserved.
99
* $COPYRIGHT$
@@ -59,6 +59,10 @@ typedef orte_ns_cmp_bitmask_t ompi_rte_cmp_bitmask_t;
5959
#define OMPI_RTE_CMP_JOBID ORTE_NS_CMP_JOBID
6060
#define OMPI_RTE_CMP_VPID ORTE_NS_CMP_VPID
6161
#define OMPI_RTE_CMP_ALL ORTE_NS_CMP_ALL
62+
#define OMPI_LOCAL_JOBID(jobid) ORTE_LOCAL_JOBID(jobid)
63+
#define OMPI_JOB_FAMILY(jobid) ORTE_JOB_FAMILY(jobid)
64+
#define OMPI_CONSTRUCT_JOBID(family,local) ORTE_CONSTRUCT_JOBID(family,local)
65+
6266
/* This is the DSS tag to serialize a proc name */
6367
#define OMPI_NAME ORTE_NAME
6468
#define OMPI_PROCESS_NAME_HTON ORTE_PROCESS_NAME_HTON

ompi/proc/proc.h

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -369,15 +369,43 @@ static inline bool ompi_proc_is_sentinel (ompi_proc_t *proc)
369369
return (intptr_t) proc & 0x1;
370370
}
371371

372+
/*
373+
* we assume an ompi_proc_t is at least aligned on two bytes,
374+
* so if the LSB of a pointer to an ompi_proc_t is 1, we have to handle
375+
* this pointer as a sentinel instead of a pointer.
376+
* a sentinel can be seen as an uint64_t with the following format :
377+
* - bit 0 : 1
378+
* - bits 1-15 : local jobid
379+
* - bits 16-31 : job family
380+
* - bits 32-63 : vpid
381+
*/
372382
static inline uintptr_t ompi_proc_name_to_sentinel (opal_process_name_t name)
373383
{
374-
return (*((uintptr_t *) &name) << 1) | 0x1;
384+
uintptr_t tmp, sentinel = 0;
385+
/* local jobid must fit in 15 bits */
386+
assert(! (OMPI_LOCAL_JOBID(name.jobid) & 0x8000));
387+
sentinel |= 0x1;
388+
tmp = (uintptr_t)OMPI_LOCAL_JOBID(name.jobid);
389+
sentinel |= ((tmp << 1) & 0xfffe);
390+
tmp = (uintptr_t)OMPI_JOB_FAMILY(name.jobid);
391+
sentinel |= ((tmp << 16) & 0xffff0000);
392+
tmp = (uintptr_t)name.vpid;
393+
sentinel |= ((tmp << 32) & 0xffffffff00000000);
394+
return sentinel;
375395
}
376396

377397
static inline opal_process_name_t ompi_proc_sentinel_to_name (uintptr_t sentinel)
378398
{
379-
sentinel >>= 1;
380-
return *((opal_process_name_t *) &sentinel);
399+
opal_process_name_t name;
400+
uint32_t local, family;
401+
uint32_t vpid;
402+
assert(sentinel & 0x1);
403+
local = (sentinel >> 1) & 0x7fff;
404+
family = (sentinel >> 16) & 0xffff;
405+
vpid = (sentinel >> 32) & 0xffffffff;
406+
name.jobid = OMPI_CONSTRUCT_JOBID(family,local);
407+
name.vpid = vpid;
408+
return name;
381409
}
382410

383411
END_C_DECLS

orte/util/name_fns.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,9 @@ ORTE_DECLSPEC char *orte_pretty_print_timing(int64_t secs, int64_t usecs);
9797
#define ORTE_CONSTRUCT_LOCAL_JOBID(local, job) \
9898
( ((local) & 0xffff0000) | ((job) & 0x0000ffff) )
9999

100+
#define ORTE_CONSTRUCT_JOBID(family, local) \
101+
ORTE_CONSTRUCT_LOCAL_JOBID(ORTE_CONSTRUCT_JOB_FAMILY(family), local)
102+
100103
/* a macro for identifying that a proc is a daemon */
101104
#define ORTE_JOBID_IS_DAEMON(n) \
102105
!((n) & 0x0000ffff)

0 commit comments

Comments
 (0)