1
1
openmpi/opal/mca/btl/vader/btl_vader_endpoint.h
Nathan Hjelm 17b80a987e btl/vader: fix fast box support for 32-bit architectures
On 32-bit architectures loads/stores of fast box headers may take
multiple instructions. This can lead to a data race between the
sender/receiver when reading/writing the sequence number. This can
lead to a situation where the receiver could process incomplete
data. To fix the issue this commit re-orders the fast box header to
put the sequence number and the tag in the same 32-bits to ensure they
are always loaded/stored together.

Fixes #473

Signed-off-by: Nathan Hjelm <hjelmn@lanl.gov>
2015-03-30 16:28:16 -06:00

117 строки
4.0 KiB
C

/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
/*
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
* University Research and Technology
* Corporation. All rights reserved.
* Copyright (c) 2004-2005 The University of Tennessee and The University
* of Tennessee Research Foundation. All rights
* reserved.
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
* University of Stuttgart. All rights reserved.
* Copyright (c) 2004-2005 The Regents of the University of California.
* All rights reserved.
* Copyright (c) 2006-2007 Voltaire. All rights reserved.
* Copyright (c) 2012-2015 Los Alamos National Security, LLC. All rights
* reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
/**
* @file
*/
#ifndef MCA_BTL_VADER_ENDPOINT_H
#define MCA_BTL_VADER_ENDPOINT_H
#include "opal_config.h"
#include "btl_vader_xpmem.h"
#define MCA_BTL_VADER_FBOX_ALIGNMENT 32
#define MCA_BTL_VADER_FBOX_ALIGNMENT_MASK (MCA_BTL_VADER_FBOX_ALIGNMENT - 1)
struct vader_fifo_t;
/**
* An abstraction that represents a connection to a endpoint process.
* An instance of mca_ptl_base_endpoint_t is associated w/ each process
* and BTL pair at startup.
*/
struct mca_btl_vader_fbox_t;
typedef struct mca_btl_base_endpoint_t {
opal_list_item_t super;
/* per peer buffers */
struct {
unsigned char *buffer; /**< starting address of peer's fast box out */
uint32_t *startp;
unsigned int start;
uint16_t seq;
} fbox_in;
struct {
unsigned char *buffer; /**< starting address of peer's fast box in */
uint32_t *startp; /**< pointer to location storing start offset */
unsigned int start, end;
uint16_t seq;
} fbox_out;
int32_t peer_smp_rank; /**< my peer's SMP process rank. Used for accessing
* SMP specfic data structures. */
uint32_t send_count; /**< number of fragments sent to this peer */
char *segment_base; /**< start of the peer's segment (in the address space
* of this process) */
struct vader_fifo_t *fifo; /**< */
opal_mutex_t lock; /**< lock to protect endpoint structures from concurrent
* access */
union {
#if OPAL_BTL_VADER_HAVE_XPMEM
struct {
struct mca_rcache_base_module_t *rcache;
xpmem_apid_t apid; /**< xpmem apid for remote peer */
} xpmem;
#endif
struct {
pid_t pid; /**< pid of remote peer (used for CMA) */
opal_shmem_ds_t *seg_ds; /**< stored segment information for detach */
} other;
} segment_data;
opal_list_t pending_frags; /**< fragments pending fast box space */
bool waiting; /**< endpoint is on the component wait list */
} mca_btl_base_endpoint_t;
typedef mca_btl_base_endpoint_t mca_btl_vader_endpoint_t;
OBJ_CLASS_DECLARATION(mca_btl_vader_endpoint_t);
static inline void mca_btl_vader_endpoint_setup_fbox_recv (struct mca_btl_base_endpoint_t *endpoint, void *base)
{
endpoint->fbox_in.buffer = base;
endpoint->fbox_in.startp = (uint32_t *) base;
endpoint->fbox_in.start = MCA_BTL_VADER_FBOX_ALIGNMENT;
endpoint->fbox_in.seq = 0;
}
static inline void mca_btl_vader_endpoint_setup_fbox_send (struct mca_btl_base_endpoint_t *endpoint, void *base)
{
endpoint->fbox_out.buffer = base;
endpoint->fbox_out.start = MCA_BTL_VADER_FBOX_ALIGNMENT;
endpoint->fbox_out.end = MCA_BTL_VADER_FBOX_ALIGNMENT;
endpoint->fbox_out.startp = (uint32_t *) base;
endpoint->fbox_out.startp[0] = MCA_BTL_VADER_FBOX_ALIGNMENT;
endpoint->fbox_out.seq = 0;
/* zero out the first header in the fast box */
memset ((char *) base + MCA_BTL_VADER_FBOX_ALIGNMENT, 0, MCA_BTL_VADER_FBOX_ALIGNMENT);
}
#endif /* MCA_BTL_VADER_ENDPOINT_H */