1 /* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
2 /*
3  * Copyright (c) 2004-2006 The Trustees of Indiana University and Indiana
4  *                         University Research and Technology
5  *                         Corporation.  All rights reserved.
6  * Copyright (c) 2004-2007 The University of Tennessee and The University
7  *                         of Tennessee Research Foundation.  All rights
8  *                         reserved.
9  * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
10  *                         University of Stuttgart.  All rights reserved.
11  * Copyright (c) 2004-2005 The Regents of the University of California.
12  *                         All rights reserved.
13  * Copyright (c) 2010-2012 Sandia National Laboratories.  All rights reserved.
14  * Copyright (c) 2014      Bull SAS.  All rights reserved.
15  * Copyright (c) 2015      Los Alamos National Security, LLC. All rights
16  *                         reserved.
17  * $COPYRIGHT$
18  *
19  * Additional copyrights may follow
20  *
21  * $HEADER$
22  */
23 
24 #ifndef BTL_PORTALS_H_HAS_BEEN_INCLUDED
25 #define BTL_PORTALS_H_HAS_BEEN_INCLUDED
26 
27 #include <portals4.h>
28 #include <btl_portals4_frag.h>
29 
30 #include "opal/class/opal_free_list.h"
31 #include "opal/class/opal_list.h"
32 #include "opal/datatype/opal_convertor.h"
33 #include "opal/mca/btl/btl.h"
34 #include "opal/mca/btl/base/base.h"
35 #include "opal/mca/btl/base/btl_base_error.h"
36 
37 BEGIN_C_DECLS
38 
39 /*
40  * Portals BTL component.
41  */
42 struct mca_btl_portals4_component_t {
43     /* base BTL component */
44     mca_btl_base_component_2_0_0_t super;
45 
46     unsigned int num_btls;
47     unsigned int max_btls; /* Maximum number of accepted Portals4 cards */
48 
49     struct mca_btl_portals4_module_t** btls; /* array of available BTL modules */
50 
51     /* add_procs() can get called multiple times.  this prevents multiple calls to portals4_init_interface(). */
52     int need_init;
53 
54     /* Use the logical to physical table to accelerate portals4 adressing: 1 (true) : 0 (false) */
55     int use_logical;
56 
57     /* initial size of free lists */
58     int portals_free_list_init_num;
59     /* max size of free lists */
60     int portals_free_list_max_num;
61     /* numer of elements to grow free lists */
62     int portals_free_list_inc_num;
63 
64     /* number of eager fragments */
65     int portals_free_list_eager_max_num;
66 
67     /* do I need a portals ACK? */
68     int portals_need_ack;
69 
70     /** Length of the receive event queues */
71     int recv_queue_size;
72 
73     /* number outstanding sends and local rdma */
74     int32_t portals_max_outstanding_ops;
75 
76     /* incoming send message receive memory descriptors */
77     int portals_recv_mds_num;
78     int portals_recv_mds_size;
79 
80     /** Event queue handles table used in PtlEQPoll */
81     ptl_handle_eq_t *eqs_h;
82 
83     /** Upper limit for message sizes */
84     unsigned long portals_max_msg_size;
85 };
86 
87 typedef struct mca_btl_portals4_component_t mca_btl_portals4_component_t;
88 
89 struct mca_btl_portals4_module_t {
90     /* base BTL module interface */
91     mca_btl_base_module_t super;
92 
93     /* number of processes we're actively connected to.  Needed to
94        know when to do activation / shutdown */
95     int32_t portals_num_procs;
96 
97     /* number of the interface (btl) */
98     uint32_t interface_num;
99 
100     /* fragment free lists */
101     opal_free_list_t portals_frag_eager;
102     opal_free_list_t portals_frag_max;
103     opal_free_list_t portals_frag_user;
104 
105     opal_list_t portals_recv_blocks;
106 
107     /** Length of the receive event queues */
108     int recv_queue_size;
109 
110     /** Event queue handle */
111     ptl_handle_eq_t recv_eq_h;
112 
113     /* number outstanding sends and local rdma */
114     volatile int32_t portals_outstanding_ops;
115     int32_t portals_max_outstanding_ops;
116 
117     /* key to use for next rdma operation */
118     volatile int64_t portals_rdma_key;
119 
120     /* our portals network interface */
121     ptl_handle_ni_t portals_ni_h;
122 
123     /** portals index */
124     ptl_pt_index_t recv_idx;
125 
126     /** MD handle for sending ACKS */
127     ptl_handle_md_t zero_md_h;
128 
129     /** Send MD handle */
130     ptl_handle_md_t send_md_h;
131 
132     /** long message receive overflow ME.  Persistent ME, first in
133         overflow list on the recv_idx portal table. */
134     ptl_handle_me_t long_overflow_me_h;
135 };
136 
137 typedef struct mca_btl_portals4_module_t mca_btl_portals4_module_t;
138 
139 /* match/ignore bit manipulation
140  *
141  * 0123 4567 01234567 01234567 01234567 01234567 01234567 01234567 01234567
142  *     |             |                 |
143  * ^   | context id  |      source     |            message tag
144  * |   |             |                 |
145  * +---- protocol
146  */
147 
148 #define BTL_PORTALS4_PROTOCOL_MASK  0xF000000000000000ULL
149 #define BTL_PORTALS4_CONTEXT_MASK   0x0FFF000000000000ULL
150 #define BTL_PORTALS4_SOURCE_MASK    0x0000FFFF00000000ULL
151 #define BTL_PORTALS4_TAG_MASK       0x00000000FFFFFFFFULL
152 
153 #define BTL_PORTALS4_PROTOCOL_IGNR  BTL_PORTALS4_PROTOCOL_MASK
154 #define BTL_PORTALS4_CONTEXT_IGNR   BTL_PORTALS4_CONTEXT_MASK
155 #define BTL_PORTALS4_SOURCE_IGNR    BTL_PORTALS4_SOURCE_MASK
156 #define BTL_PORTALS4_TAG_IGNR       0x000000007FFFFFFFULL
157 
158 #define BTL_PORTALS4_SHORT_MSG      0x1000000000000000ULL
159 #define BTL_PORTALS4_LONG_MSG       0x2000000000000000ULL
160 
161 /* send posting */
162 #define BTL_PORTALS4_SET_SEND_BITS(match_bits, contextid, source, tag, type) \
163     {                                                                   \
164         match_bits = contextid;                                         \
165         match_bits = (match_bits << 16);                                \
166         match_bits |= source;                                           \
167         match_bits = (match_bits << 32);                                \
168         match_bits |= (BTL_PORTALS4_TAG_MASK & tag) | type;             \
169     }
170 
171 #define BTL_PORTALS4_SET_HDR_DATA(hdr_data, opcount, length, sync)   \
172     {                                                                \
173         hdr_data = (sync) ? 1 : 0;                                   \
174         hdr_data = (hdr_data << 15);                                 \
175         hdr_data |= opcount & 0x7FFFULL;                             \
176         hdr_data = (hdr_data << 48);                                 \
177         hdr_data |= (length & 0xFFFFFFFFFFFFULL);                    \
178     }
179 
180 #define REQ_BTL_TABLE_ID	2
181 
182 int mca_btl_portals4_component_progress(void);
183 void mca_btl_portals4_free_module(mca_btl_portals4_module_t *portals4_btl);
184 
185 /* BTL interface functions */
186 int mca_btl_portals4_finalize(struct mca_btl_base_module_t* btl_base);
187 
188 
189 int mca_btl_portals4_add_procs(struct mca_btl_base_module_t* btl_base,
190                               size_t nprocs,
191                               struct opal_proc_t **procs,
192                               struct mca_btl_base_endpoint_t** peers,
193                               opal_bitmap_t* reachable);
194 
195 int mca_btl_portals4_del_procs(struct mca_btl_base_module_t* btl_base,
196                               size_t nprocs,
197                               struct opal_proc_t **procs,
198                               struct mca_btl_base_endpoint_t** peers);
199 
200 mca_btl_base_descriptor_t*
201 mca_btl_portals4_alloc(struct mca_btl_base_module_t* btl_base,
202                       struct mca_btl_base_endpoint_t* endpoint,
203                       uint8_t order,
204                       size_t size,
205                       uint32_t flags);
206 
207 int mca_btl_portals4_free(struct mca_btl_base_module_t* btl_base,
208                          mca_btl_base_descriptor_t* des);
209 
210 mca_btl_base_descriptor_t*
211 mca_btl_portals4_prepare_src(struct mca_btl_base_module_t* btl_base,
212                             struct mca_btl_base_endpoint_t* peer,
213                             struct opal_convertor_t* convertor,
214                             uint8_t order,
215                             size_t reserve,
216                             size_t* size,
217                             uint32_t flags);
218 
219 int mca_btl_portals4_send(struct mca_btl_base_module_t* btl_base,
220                          struct mca_btl_base_endpoint_t* btl_peer,
221                          struct mca_btl_base_descriptor_t* descriptor,
222                          mca_btl_base_tag_t tag);
223 
224 
225 int mca_btl_portals4_sendi(struct mca_btl_base_module_t* btl_base,
226                           struct mca_btl_base_endpoint_t* endpoint,
227                           struct opal_convertor_t* convertor,
228                           void* header,
229                           size_t header_size,
230                           size_t payload_size,
231                           uint8_t order,
232                           uint32_t flags,
233                           mca_btl_base_tag_t tag,
234                           mca_btl_base_descriptor_t** des);
235 
236 int mca_btl_portals4_put(struct mca_btl_base_module_t* btl_base,
237                         struct mca_btl_base_endpoint_t* btl_peer,
238                         struct mca_btl_base_descriptor_t* decriptor);
239 
240 
241 int mca_btl_portals4_get(struct mca_btl_base_module_t* btl_base,
242                         struct mca_btl_base_endpoint_t* btl_peer,
243                         void *local_address,
244                         uint64_t remote_address,
245                         struct mca_btl_base_registration_handle_t *local_handle,
246                         struct mca_btl_base_registration_handle_t *remote_handle,
247                         size_t size,
248                         int flags,
249                         int order,
250                         mca_btl_base_rdma_completion_fn_t cbfunc,
251                         void *cbcontext,
252                         void *cbdata);
253 
254 int mca_btl_portals4_get_error(int ptl_error);
255 
256 struct mca_btl_base_registration_handle_t {
257     /** Portals4 match bits */
258     ptl_match_bits_t key;
259     /** Portals4 me_h */
260     ptl_handle_me_t me_h;
261     /** Remote offset */
262     ptl_size_t remote_offset;
263 };
264 
265 /*
266  * global structures
267  */
268 OPAL_MODULE_DECLSPEC extern mca_btl_portals4_component_t mca_btl_portals4_component;
269 extern mca_btl_portals4_module_t mca_btl_portals4_module;
270 
271 /**
272  * An abstraction that represents a connection to a endpoint process.
273  * An instance of mca_btl_base_endpoint_t is associated w/ each process
274  * and BTL pair at startup. However, connections to the endpoint
275  * are established dynamically on an as-needed basis:
276  */
277 struct mca_btl_base_endpoint_t {
278     ptl_process_t ptl_proc;
279 };
280 typedef struct mca_btl_base_endpoint_t mca_btl_base_endpoint_t;
281 
282 END_C_DECLS
283 
284 #endif  /* BTL_PORTALS_H_HAS_BEEN_INCLUDED */
285