File: btl_ugni_smsg.h

package info (click to toggle)
openmpi 5.0.8-4
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 201,684 kB
  • sloc: ansic: 613,078; makefile: 42,353; sh: 11,194; javascript: 9,244; f90: 7,052; java: 6,404; perl: 5,179; python: 1,859; lex: 740; fortran: 61; cpp: 20; tcl: 12
file content (131 lines) | stat: -rw-r--r-- 4,811 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
/*
 * Copyright (c) 2011-2018 Los Alamos National Security, LLC. All rights
 *                         reserved.
 * Copyright (c) 2011      UT-Battelle, LLC. All rights reserved.
 * $COPYRIGHT$
 *
 * Additional copyrights may follow
 *
 * $HEADER$
 */

#if !defined(MCA_BTL_UGNI_SMSG_H)
#    define MCA_BTL_UGNI_SMSG_H

#    include "btl_ugni.h"
#    include "btl_ugni_endpoint.h"
#    include "btl_ugni_frag.h"
#    include "btl_ugni_rdma.h"

typedef enum {
    MCA_BTL_UGNI_TAG_SEND,
    MCA_BTL_UGNI_TAG_DISCONNECT,
    MCA_BTL_UGNI_TAG_GET_INIT,
    MCA_BTL_UGNI_TAG_RDMA_COMPLETE
} mca_btl_ugni_smsg_tag_t;

typedef struct mca_btl_ugni_smsg_mbox_t {
    opal_free_list_item_t super;
    mca_btl_ugni_endpoint_attr_t attr;
} mca_btl_ugni_smsg_mbox_t;

OBJ_CLASS_DECLARATION(mca_btl_ugni_smsg_mbox_t);

int mca_btl_ugni_smsg_init(mca_btl_ugni_module_t *ugni_module);
int mca_btl_ugni_smsg_process(mca_btl_base_endpoint_t *ep);
int mca_btl_ugni_progress_remote_smsg(mca_btl_ugni_module_t *btl);

static inline int mca_btl_ugni_progress_local_smsg(mca_btl_ugni_module_t *ugni_module,
                                                   mca_btl_ugni_device_t *device)
{
    mca_btl_ugni_base_frag_t *frag;
    gni_cq_entry_t event_data;
    gni_return_t grc;

    grc = mca_btl_ugni_cq_get_event(device, &device->dev_smsg_local_cq, &event_data);
    if (GNI_RC_NOT_DONE == grc) {
        return OPAL_SUCCESS;
    }

    if (OPAL_UNLIKELY((GNI_RC_SUCCESS != grc && !event_data) || GNI_CQ_OVERRUN(event_data))) {
        /* TODO -- need to handle overrun -- how do we do this without an event?
         * will the event eventually come back? Ask Cray */
        return mca_btl_ugni_event_fatal_error(grc, event_data);
    }

    assert(GNI_CQ_GET_TYPE(event_data) == GNI_CQ_EVENT_TYPE_SMSG);

    frag = (mca_btl_ugni_base_frag_t *)
        opal_pointer_array_get_item(&ugni_module->pending_smsg_frags_bb,
                                    GNI_CQ_GET_MSG_ID(event_data));
    if (OPAL_UNLIKELY(NULL == frag)) {
        assert(0);
        return OPAL_ERROR;
    }

    frag->flags |= MCA_BTL_UGNI_FRAG_SMSG_COMPLETE;

    if (!(frag->flags & MCA_BTL_UGNI_FRAG_IGNORE)) {
        mca_btl_ugni_frag_complete(frag, OPAL_SUCCESS);
    }

    return 1;
}

static inline int opal_mca_btl_ugni_smsg_send(mca_btl_ugni_base_frag_t *frag, void *hdr,
                                              size_t hdr_len, void *payload, size_t payload_len,
                                              mca_btl_ugni_smsg_tag_t tag)
{
    mca_btl_base_endpoint_t *endpoint = frag->endpoint;
    mca_btl_ugni_module_t *ugni_module = mca_btl_ugni_ep_btl(endpoint);
    gni_return_t grc;

    grc = mca_btl_ugni_endpoint_smsg_send_wtag(endpoint, hdr, hdr_len, payload, payload_len,
                                               frag->msg_id, tag);
    if (OPAL_LIKELY(GNI_RC_SUCCESS == grc)) {
        if (mca_btl_ugni_component.progress_thread_enabled) {
            if (frag->base.des_flags & MCA_BTL_DES_FLAGS_SIGNAL) {
                /* errors for PostCqWrite treated as non-fatal */
                (void) mca_btl_ugni_post_cqwrite(endpoint,
                                                 &ugni_module->devices[0].dev_rdma_local_cq,
                                                 endpoint->rmt_irq_mem_hndl, 0xdead, NULL, NULL,
                                                 NULL);
            }
        }

        (void) mca_btl_ugni_progress_local_smsg(ugni_module, endpoint->smsg_ep_handle.device);
        return OPAL_SUCCESS;
    }

    if (OPAL_LIKELY(GNI_RC_NOT_DONE == grc)) {
        BTL_VERBOSE(("out of credits"));

        return OPAL_ERR_OUT_OF_RESOURCE;
    }

    BTL_ERROR(("GNI_SmsgSendWTag failed with rc = %d. handle = %lu, hdr_len = %d, payload_len = %d",
               grc, (uintptr_t) frag->endpoint->smsg_ep_handle.gni_handle, (int) hdr_len,
               (int) payload_len));

    return OPAL_ERROR;
}

static inline int mca_btl_ugni_send_frag(struct mca_btl_base_endpoint_t *btl_peer,
                                         mca_btl_ugni_base_frag_t *frag)
{
    if (OPAL_LIKELY(!(frag->flags & MCA_BTL_UGNI_FRAG_EAGER))) {
        return opal_mca_btl_ugni_smsg_send(frag, &frag->hdr.send, frag->hdr_size,
                                           frag->segments[1].seg_addr.pval,
                                           frag->segments[1].seg_len, MCA_BTL_UGNI_TAG_SEND);
    }

    frag->hdr.eager.size = frag->segments[1].seg_len;
    frag->hdr.eager.address = frag->segments[1].seg_addr.lval;
    frag->hdr.eager.ctx = (void *) frag;

    return opal_mca_btl_ugni_smsg_send(frag, &frag->hdr.eager, frag->hdr_size, NULL, 0,
                                       MCA_BTL_UGNI_TAG_GET_INIT);
}

#endif /* MCA_BTL_UGNI_SMSG_H */