Skip to content

Commit 6ed68da

Browse files
committed
btl/uct: use the correct tl interface attributes
It is apparently possible for different instances of the same UCT transport to have different limits (max short put for example). To account for this we need to store the attributes per TL context not per TL. This commit fixes the issue. Signed-off-by: Nathan Hjelm <hjelmn@lanl.gov>
1 parent 4c5588f commit 6ed68da

File tree

8 files changed

+53
-52
lines changed

8 files changed

+53
-52
lines changed

opal/mca/btl/uct/btl_uct.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,7 @@ int mca_btl_uct_query_tls (mca_btl_uct_module_t *module, mca_btl_uct_md_t *md, u
286286
*/
287287
static inline bool mca_btl_uct_tl_supports_rdma (mca_btl_uct_tl_t *tl)
288288
{
289-
return (tl->uct_iface_attr.cap.flags & (UCT_IFACE_FLAG_PUT_ZCOPY | UCT_IFACE_FLAG_GET_ZCOPY)) ==
289+
return (MCA_BTL_UCT_TL_ATTR(tl, 0).cap.flags & (UCT_IFACE_FLAG_PUT_ZCOPY | UCT_IFACE_FLAG_GET_ZCOPY)) ==
290290
(UCT_IFACE_FLAG_PUT_ZCOPY | UCT_IFACE_FLAG_GET_ZCOPY);
291291
}
292292

@@ -295,7 +295,7 @@ static inline bool mca_btl_uct_tl_supports_rdma (mca_btl_uct_tl_t *tl)
295295
*/
296296
static inline bool mca_btl_uct_tl_support_am (mca_btl_uct_tl_t *tl)
297297
{
298-
return (tl->uct_iface_attr.cap.flags & (UCT_IFACE_FLAG_AM_SHORT | UCT_IFACE_FLAG_AM_BCOPY | UCT_IFACE_FLAG_AM_ZCOPY));
298+
return (MCA_BTL_UCT_TL_ATTR(tl, 0).cap.flags & (UCT_IFACE_FLAG_AM_SHORT | UCT_IFACE_FLAG_AM_BCOPY | UCT_IFACE_FLAG_AM_ZCOPY));
299299
}
300300

301301
/**
@@ -305,7 +305,7 @@ static inline bool mca_btl_uct_tl_support_am (mca_btl_uct_tl_t *tl)
305305
*/
306306
static inline bool mca_btl_uct_tl_supports_conn (mca_btl_uct_tl_t *tl)
307307
{
308-
return (tl->uct_iface_attr.cap.flags & (UCT_IFACE_FLAG_AM_SHORT | UCT_IFACE_FLAG_CONNECT_TO_IFACE)) ==
308+
return (MCA_BTL_UCT_TL_ATTR(tl, 0).cap.flags & (UCT_IFACE_FLAG_AM_SHORT | UCT_IFACE_FLAG_CONNECT_TO_IFACE)) ==
309309
(UCT_IFACE_FLAG_AM_SHORT | UCT_IFACE_FLAG_CONNECT_TO_IFACE);
310310
}
311311

@@ -316,7 +316,7 @@ static inline bool mca_btl_uct_tl_supports_conn (mca_btl_uct_tl_t *tl)
316316
*/
317317
static inline bool mca_btl_uct_tl_requires_connection_tl (mca_btl_uct_tl_t *tl)
318318
{
319-
return !(tl->uct_iface_attr.cap.flags & UCT_IFACE_FLAG_CONNECT_TO_IFACE);
319+
return !(MCA_BTL_UCT_TL_ATTR(tl, 0).cap.flags & UCT_IFACE_FLAG_CONNECT_TO_IFACE);
320320
}
321321

322322
END_C_DECLS

opal/mca/btl/uct/btl_uct_am.c

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ mca_btl_base_descriptor_t *mca_btl_uct_alloc (mca_btl_base_module_t *btl, mca_bt
2525
mca_btl_uct_module_t *uct_btl = (mca_btl_uct_module_t *) btl;
2626
mca_btl_uct_base_frag_t *frag = NULL;
2727

28-
if ((size + 8) <= (size_t) uct_btl->am_tl->uct_iface_attr.cap.am.max_short) {
28+
if ((size + 8) <= (size_t) MCA_BTL_UCT_TL_ATTR(uct_btl->am_tl, 0).cap.am.max_short) {
2929
frag = mca_btl_uct_frag_alloc_short (uct_btl, endpoint);
3030
} else if (size <= uct_btl->super.btl_eager_limit) {
3131
frag = mca_btl_uct_frag_alloc_eager (uct_btl, endpoint);
@@ -97,7 +97,7 @@ struct mca_btl_base_descriptor_t *mca_btl_uct_prepare_src (mca_btl_base_module_t
9797

9898
frag->base.order = order;
9999
frag->base.des_flags = flags;
100-
if (total_size > (size_t) uct_btl->am_tl->uct_iface_attr.cap.am.max_short) {
100+
if (total_size > (size_t) MCA_BTL_UCT_TL_ATTR(uct_btl->am_tl, 0).cap.am.max_short) {
101101
frag->segments[1].seg_len = *size;
102102
frag->segments[1].seg_addr.pval = data_ptr;
103103
frag->base.des_segment_count = 2;
@@ -253,10 +253,11 @@ static size_t mca_btl_uct_sendi_pack (void *data, void *arg)
253253
return args->header_size + args->payload_size + 8;
254254
}
255255

256-
static inline size_t mca_btl_uct_max_sendi (mca_btl_uct_module_t *uct_btl)
256+
static inline size_t mca_btl_uct_max_sendi (mca_btl_uct_module_t *uct_btl, int context_id)
257257
{
258-
return (uct_btl->am_tl->uct_iface_attr.cap.am.max_short > uct_btl->am_tl->uct_iface_attr.cap.am.max_bcopy) ?
259-
uct_btl->am_tl->uct_iface_attr.cap.am.max_short : uct_btl->am_tl->uct_iface_attr.cap.am.max_bcopy;
258+
const mca_btl_uct_tl_t *tl = uct_btl->am_tl;
259+
return (MCA_BTL_UCT_TL_ATTR(tl, context_id).cap.am.max_short > MCA_BTL_UCT_TL_ATTR(tl, context_id).cap.am.max_bcopy) ?
260+
MCA_BTL_UCT_TL_ATTR(tl, context_id).cap.am.max_short : MCA_BTL_UCT_TL_ATTR(tl, context_id).cap.am.max_bcopy;
260261
}
261262

262263
int mca_btl_uct_sendi (mca_btl_base_module_t *btl, mca_btl_base_endpoint_t *endpoint, opal_convertor_t *convertor,
@@ -274,7 +275,7 @@ int mca_btl_uct_sendi (mca_btl_base_module_t *btl, mca_btl_base_endpoint_t *endp
274275
int rc;
275276

276277
rc = mca_btl_uct_endpoint_check_am (uct_btl, endpoint, context, &ep_handle);
277-
if (OPAL_UNLIKELY(OPAL_SUCCESS != rc || msg_size > mca_btl_uct_max_sendi (uct_btl))) {
278+
if (OPAL_UNLIKELY(OPAL_SUCCESS != rc || msg_size > mca_btl_uct_max_sendi (uct_btl, context->context_id))) {
278279
if (descriptor) {
279280
*descriptor = mca_btl_uct_alloc (btl, endpoint, order, total_size, flags);
280281
}
@@ -287,7 +288,7 @@ int mca_btl_uct_sendi (mca_btl_base_module_t *btl, mca_btl_base_endpoint_t *endp
287288
mca_btl_uct_context_lock (context);
288289
if (0 == payload_size) {
289290
ucs_status = uct_ep_am_short (ep_handle, MCA_BTL_UCT_FRAG, am_header.value, header, header_size);
290-
} else if (msg_size < (size_t) uct_btl->am_tl->uct_iface_attr.cap.am.max_short) {
291+
} else if (msg_size < (size_t) MCA_BTL_UCT_TL_ATTR(uct_btl->am_tl, context->context_id).cap.am.max_short) {
291292
int8_t *data = alloca (total_size);
292293
_mca_btl_uct_send_pack (data, header, header_size, convertor, payload_size);
293294
ucs_status = uct_ep_am_short (ep_handle, MCA_BTL_UCT_FRAG, am_header.value, data, total_size);

opal/mca/btl/uct/btl_uct_component.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -152,12 +152,12 @@ static size_t mca_btl_uct_tl_modex_size (mca_btl_uct_tl_t *tl)
152152
{
153153
const size_t size = strlen (tl->uct_tl_name) + 1;
154154

155-
if (tl->uct_iface_attr.cap.flags & UCT_IFACE_FLAG_CONNECT_TO_IFACE) {
155+
if (MCA_BTL_UCT_TL_ATTR(tl, 0).cap.flags & UCT_IFACE_FLAG_CONNECT_TO_IFACE) {
156156
/* pad out to a multiple of 4 bytes */
157-
return (4 + 3 + size + tl->uct_iface_attr.device_addr_len + tl->uct_iface_attr.iface_addr_len) & ~3;
157+
return (4 + 3 + size + MCA_BTL_UCT_TL_ATTR(tl, 0).device_addr_len + MCA_BTL_UCT_TL_ATTR(tl, 0).iface_addr_len) & ~3;
158158
}
159159

160-
return (4 + 3 + size + tl->uct_iface_attr.device_addr_len) & ~3;
160+
return (4 + 3 + size + MCA_BTL_UCT_TL_ATTR(tl, 0).device_addr_len) & ~3;
161161
}
162162

163163
static size_t mca_btl_uct_module_modex_size (mca_btl_uct_module_t *module)
@@ -196,13 +196,13 @@ static size_t mca_btl_uct_tl_modex_pack (mca_btl_uct_tl_t *tl, uint8_t *modex_da
196196
* the same endpoint since we are only doing RDMA. if any of these assumptions are
197197
* wrong then we can't delay creating the other contexts and must include their
198198
* information in the modex. */
199-
if (tl->uct_iface_attr.cap.flags & UCT_IFACE_FLAG_CONNECT_TO_IFACE) {
199+
if (MCA_BTL_UCT_TL_ATTR(tl, 0).cap.flags & UCT_IFACE_FLAG_CONNECT_TO_IFACE) {
200200
uct_iface_get_address (dev_context->uct_iface, (uct_iface_addr_t *) modex_data);
201-
modex_data += tl->uct_iface_attr.iface_addr_len;
201+
modex_data += MCA_BTL_UCT_TL_ATTR(tl, 0).iface_addr_len;
202202
}
203203

204204
uct_iface_get_device_address (dev_context->uct_iface, (uct_device_addr_t *) modex_data);
205-
modex_data += tl->uct_iface_attr.device_addr_len;
205+
modex_data += MCA_BTL_UCT_TL_ATTR(tl, 0).device_addr_len;
206206

207207
return modex_size;
208208
}

opal/mca/btl/uct/btl_uct_endpoint.c

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -109,15 +109,14 @@ static int mca_btl_uct_endpoint_connect_iface (mca_btl_uct_module_t *uct_btl, mc
109109

110110
/* easy case. just connect to the interface */
111111
iface_addr = (uct_iface_addr_t *) tl_data;
112-
device_addr = (uct_device_addr_t *) ((uintptr_t) iface_addr + tl->uct_iface_attr.iface_addr_len);
112+
device_addr = (uct_device_addr_t *) ((uintptr_t) iface_addr + MCA_BTL_UCT_TL_ATTR(tl, tl_context->context_id).iface_addr_len);
113113

114114
BTL_VERBOSE(("connecting endpoint to interface"));
115115

116116
mca_btl_uct_context_lock (tl_context);
117117
ucs_status = uct_ep_create_connected (tl_context->uct_iface, device_addr, iface_addr, &tl_endpoint->uct_ep);
118-
mca_btl_uct_context_unlock (tl_context);
119-
120118
tl_endpoint->flags = MCA_BTL_UCT_ENDPOINT_FLAG_CONN_READY;
119+
mca_btl_uct_context_unlock (tl_context);
121120

122121
return (UCS_OK == ucs_status) ? OPAL_SUCCESS : OPAL_ERROR;
123122
}
@@ -189,7 +188,7 @@ static int mca_btl_uct_endpoint_connect_endpoint (mca_btl_uct_module_t *uct_btl,
189188
mca_btl_uct_tl_endpoint_t *tl_endpoint, uint8_t *tl_data,
190189
uint8_t *conn_tl_data, void *ep_addr)
191190
{
192-
size_t request_length = sizeof (mca_btl_uct_conn_req_t) + tl->uct_iface_attr.ep_addr_len;
191+
size_t request_length = sizeof (mca_btl_uct_conn_req_t) + MCA_BTL_UCT_TL_ATTR(tl, tl_context->context_id).ep_addr_len;
193192
mca_btl_uct_connection_ep_t *conn_ep = endpoint->conn_ep;
194193
mca_btl_uct_tl_t *conn_tl = uct_btl->conn_tl;
195194
mca_btl_uct_device_context_t *conn_tl_context = conn_tl->uct_dev_contexts[0];
@@ -208,7 +207,7 @@ static int mca_btl_uct_endpoint_connect_endpoint (mca_btl_uct_module_t *uct_btl,
208207
opal_process_name_print (endpoint->ep_proc->proc_name)));
209208

210209
iface_addr = (uct_iface_addr_t *) conn_tl_data;
211-
device_addr = (uct_device_addr_t *) ((uintptr_t) conn_tl_data + conn_tl->uct_iface_attr.iface_addr_len);
210+
device_addr = (uct_device_addr_t *) ((uintptr_t) conn_tl_data + MCA_BTL_UCT_TL_ATTR(conn_tl, 0).iface_addr_len);
212211

213212
endpoint->conn_ep = conn_ep = OBJ_NEW(mca_btl_uct_connection_ep_t);
214213
if (OPAL_UNLIKELY(NULL == conn_ep)) {

opal/mca/btl/uct/btl_uct_module.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ static int mca_btl_uct_add_procs (mca_btl_base_module_t *btl,
8888
if (am_tl) {
8989
rc = opal_free_list_init (&uct_module->short_frags, sizeof (mca_btl_uct_base_frag_t),
9090
opal_cache_line_size, OBJ_CLASS(mca_btl_uct_base_frag_t),
91-
am_tl->uct_iface_attr.cap.am.max_short, opal_cache_line_size,
91+
MCA_BTL_UCT_TL_ATTR(am_tl, 0).cap.am.max_short, opal_cache_line_size,
9292
0, 1024, 64, NULL, 0, NULL, NULL, NULL);
9393

9494
rc = opal_free_list_init (&uct_module->eager_frags, sizeof (mca_btl_uct_base_frag_t),

opal/mca/btl/uct/btl_uct_rdma.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,13 +98,12 @@ int mca_btl_uct_get (mca_btl_base_module_t *btl, mca_btl_base_endpoint_t *endpoi
9898

9999
mca_btl_uct_context_lock (context);
100100

101-
if (size <= uct_btl->rdma_tl->uct_iface_attr.cap.get.max_bcopy) {
101+
if (size <= MCA_BTL_UCT_TL_ATTR(uct_btl->rdma_tl, context->context_id).cap.get.max_bcopy) {
102102
ucs_status = uct_ep_get_bcopy (ep_handle, mca_btl_uct_get_unpack, local_address, size, remote_address,
103103
rkey.rkey, &comp->uct_comp);
104104
} else {
105105
uct_iov_t iov = {.buffer = local_address, .length = size, .stride = 0, .count = 1,
106106
.memh = MCA_BTL_UCT_REG_REMOTE_TO_LOCAL(local_handle)->uct_memh};
107-
108107
ucs_status = uct_ep_get_zcopy (ep_handle, &iov, 1, remote_address, rkey.rkey, &comp->uct_comp);
109108
}
110109

@@ -183,7 +182,7 @@ int mca_btl_uct_put (mca_btl_base_module_t *btl, mca_btl_base_endpoint_t *endpoi
183182

184183
/* determine what UCT prototol should be used */
185184
if (size <= uct_btl->super.btl_put_local_registration_threshold) {
186-
use_short = size <= uct_btl->rdma_tl->uct_iface_attr.cap.put.max_short;
185+
use_short = size <= MCA_BTL_UCT_TL_ATTR(uct_btl->rdma_tl, context->context_id).cap.put.max_short;
187186
use_bcopy = !use_short;
188187
}
189188

opal/mca/btl/uct/btl_uct_tl.c

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -61,11 +61,11 @@ static uint64_t mca_btl_uct_cap_to_btl_atomic_flag[][2] = {
6161

6262
static void mca_btl_uct_module_set_atomic_flags (mca_btl_uct_module_t *module, mca_btl_uct_tl_t *tl)
6363
{
64-
uint64_t cap_flags = tl->uct_iface_attr.cap.flags;
64+
uint64_t cap_flags = MCA_BTL_UCT_TL_ATTR(tl, 0).cap.flags;
6565

6666
/* NTH: only use the fetching atomics for now */
67-
uint64_t atomic_flags32 = tl->uct_iface_attr.cap.atomic32.fop_flags;
68-
uint64_t atomic_flags64 = tl->uct_iface_attr.cap.atomic64.fop_flags;
67+
uint64_t atomic_flags32 = MCA_BTL_UCT_TL_ATTR(tl, 0).cap.atomic32.fop_flags;
68+
uint64_t atomic_flags64 = MCA_BTL_UCT_TL_ATTR(tl, 0).cap.atomic64.fop_flags;
6969

7070
/* NTH: don't really have a way to seperate 32-bit and 64-bit right now */
7171
uint64_t all_flags = atomic_flags32 & atomic_flags64;
@@ -110,7 +110,7 @@ static uint64_t mca_btl_uct_cap_to_btl_atomic_flag[][2] = {
110110
*/
111111
static void mca_btl_uct_module_set_atomic_flags (mca_btl_uct_module_t *module, mca_btl_uct_tl_t *tl)
112112
{
113-
uint64_t cap_flags = tl->uct_iface_attr.cap.flags;
113+
uint64_t cap_flags = MCA_BTL_UCT_TL_ATTR(tl, 0).cap.flags;
114114

115115
module->super.btl_atomic_flags = 0;
116116

@@ -299,9 +299,16 @@ mca_btl_uct_device_context_t *mca_btl_uct_context_create (mca_btl_uct_module_t *
299299
return NULL;
300300
}
301301

302-
BTL_VERBOSE(("enabling progress for tl %p context id %d", (void *) tl, context_id));
302+
/* only need to query one of the interfaces to get the attributes */
303+
ucs_status = uct_iface_query (context->uct_iface, &context->uct_iface_attr);
304+
if (UCS_OK != ucs_status) {
305+
BTL_VERBOSE(("Error querying UCT interface"));
306+
mca_btl_uct_context_destroy (context);
307+
return NULL;
308+
}
303309

304310
if (enable_progress) {
311+
BTL_VERBOSE(("enabling progress for tl %p context id %d", (void *) tl, context_id));
305312
mca_btl_uct_context_enable_progress (context);
306313
}
307314

@@ -372,15 +379,8 @@ static mca_btl_uct_tl_t *mca_btl_uct_create_tl (mca_btl_uct_module_t *module, mc
372379
return NULL;
373380
}
374381

375-
/* only need to query one of the interfaces to get the attributes */
376-
ucs_status = uct_iface_query (tl->uct_dev_contexts[0]->uct_iface, &tl->uct_iface_attr);
377-
if (UCS_OK != ucs_status) {
378-
BTL_VERBOSE(("Error querying UCT interface"));
379-
OBJ_RELEASE(tl);
380-
return NULL;
381-
}
382-
383-
BTL_VERBOSE(("Interface CAPS for tl %s::%s: 0x%lx", module->md_name, tl_desc->tl_name, (unsigned long) tl->uct_iface_attr.cap.flags));
382+
BTL_VERBOSE(("Interface CAPS for tl %s::%s: 0x%lx", module->md_name, tl_desc->tl_name,
383+
(unsigned long) MCA_BTL_UCT_TL_ATTR(tl, 0).cap.flags));
384384

385385
return tl;
386386
}
@@ -391,20 +391,20 @@ static void mca_btl_uct_set_tl_rdma (mca_btl_uct_module_t *module, mca_btl_uct_t
391391

392392
mca_btl_uct_module_set_atomic_flags (module, tl);
393393

394-
module->super.btl_get_limit = tl->uct_iface_attr.cap.get.max_zcopy;
395-
if (tl->uct_iface_attr.cap.get.max_bcopy) {
394+
module->super.btl_get_limit = MCA_BTL_UCT_TL_ATTR(tl, 0).cap.get.max_zcopy;
395+
if (MCA_BTL_UCT_TL_ATTR(tl, 0).cap.get.max_bcopy) {
396396
module->super.btl_get_alignment = 0;
397-
module->super.btl_get_local_registration_threshold = tl->uct_iface_attr.cap.get.max_bcopy;
397+
module->super.btl_get_local_registration_threshold = MCA_BTL_UCT_TL_ATTR(tl, 0).cap.get.max_bcopy;
398398
} else {
399399
/* this is overkill in terms of alignment but we have no way to enforce a minimum get size */
400-
module->super.btl_get_alignment = opal_next_poweroftwo_inclusive (tl->uct_iface_attr.cap.get.min_zcopy);
400+
module->super.btl_get_alignment = opal_next_poweroftwo_inclusive (MCA_BTL_UCT_TL_ATTR(tl, 0).cap.get.min_zcopy);
401401
}
402402

403-
module->super.btl_put_limit = tl->uct_iface_attr.cap.put.max_zcopy;
403+
module->super.btl_put_limit = MCA_BTL_UCT_TL_ATTR(tl, 0).cap.put.max_zcopy;
404404
module->super.btl_put_alignment = 0;
405405

406406
/* no registration needed when using short/bcopy put */
407-
module->super.btl_put_local_registration_threshold = tl->uct_iface_attr.cap.put.max_bcopy;
407+
module->super.btl_put_local_registration_threshold = MCA_BTL_UCT_TL_ATTR(tl, 0).cap.put.max_bcopy;
408408

409409
module->rdma_tl = tl;
410410
OBJ_RETAIN(tl);
@@ -480,14 +480,14 @@ static int mca_btl_uct_evaluate_tl (mca_btl_uct_module_t *module, mca_btl_uct_tl
480480
}
481481

482482
if (tl == module->rdma_tl || tl == module->am_tl) {
483-
BTL_VERBOSE(("tl has flags 0x%" PRIx64, tl->uct_iface_attr.cap.flags));
484-
module->super.btl_flags |= mca_btl_uct_module_flags (tl->uct_iface_attr.cap.flags);
483+
BTL_VERBOSE(("tl has flags 0x%" PRIx64, MCA_BTL_UCT_TL_ATTR(tl, 0).cap.flags));
484+
module->super.btl_flags |= mca_btl_uct_module_flags (MCA_BTL_UCT_TL_ATTR(tl, 0).cap.flags);
485485

486486
/* the bandwidth and latency numbers relate to both rdma and active messages. need to
487487
* come up with a better estimate. */
488488

489489
/* UCT bandwidth is in bytes/sec, BTL is in MB/sec */
490-
module->super.btl_bandwidth = (uint32_t) (tl->uct_iface_attr.bandwidth / 1048576.0);
490+
module->super.btl_bandwidth = (uint32_t) (MCA_BTL_UCT_TL_ATTR(tl, 0).bandwidth / 1048576.0);
491491
/* TODO -- figure out how to translate UCT latency to us */
492492
module->super.btl_latency = 1;
493493
}

opal/mca/btl/uct/btl_uct_types.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,9 @@ struct mca_btl_uct_device_context_t {
141141
/** UCT interface handle */
142142
uct_iface_h uct_iface;
143143

144+
/** interface attributes */
145+
uct_iface_attr_t uct_iface_attr;
146+
144147
/** RDMA completions */
145148
opal_free_list_t rdma_completions;
146149

@@ -307,9 +310,6 @@ struct mca_btl_uct_tl_t {
307310
/** device name for this tl (used for creating device contexts) */
308311
char *uct_dev_name;
309312

310-
/** interface attributes */
311-
uct_iface_attr_t uct_iface_attr;
312-
313313
/** maxiumum number of device contexts that can be created */
314314
int max_device_contexts;
315315

@@ -324,4 +324,6 @@ struct mca_btl_uct_tl_t {
324324
typedef struct mca_btl_uct_tl_t mca_btl_uct_tl_t;
325325
OBJ_CLASS_DECLARATION(mca_btl_uct_tl_t);
326326

327+
#define MCA_BTL_UCT_TL_ATTR(tl, context_id) (tl)->uct_dev_contexts[(context_id)]->uct_iface_attr
328+
327329
#endif /* !defined(BTL_UCT_TYPES_H) */

0 commit comments

Comments
 (0)