ucx
ucx copied to clipboard
UCP_OP_ATTR_FLAG_NO_IMM_CMPL breaks ucp_put_nbx()
Looks like #7317 introduced a problem (in master), when UCP_OP_ATTR_FLAG_NO_IMM_CMPL is passed as the op_attr_mask
. According to this code, in this case contig_length
will be zero and no data will be sent...
The relevant code is copied from rma_send.c:
ucs_status_ptr_t ucp_put_nbx(ucp_ep_h ep, const void *buffer, size_t count,
uint64_t remote_addr, ucp_rkey_h rkey,
const ucp_request_param_t *param)
{
ucp_worker_h worker = ep->worker;
size_t contig_length = 0;
ucp_datatype_t datatype = ucp_dt_make_contig(1);
ucp_ep_rma_config_t *rma_config;
ucs_status_ptr_t ret;
ucs_status_t status;
ucp_request_t *req;
uint32_t attr_mask;
UCP_RMA_CHECK_PTR(worker->context, buffer, count);
UCP_WORKER_THREAD_CS_ENTER_CONDITIONAL(worker);
ucs_trace_req("put_nbx buffer %p count %zu remote_addr %"PRIx64" rkey %p to %s cb %p",
buffer, count, remote_addr, rkey, ucp_ep_peer_name(ep),
(param->op_attr_mask & UCP_OP_ATTR_FIELD_CALLBACK) ?
param->cb.send : NULL);
attr_mask = param->op_attr_mask &
(UCP_OP_ATTR_FIELD_DATATYPE | UCP_OP_ATTR_FLAG_NO_IMM_CMPL);
if (worker->context->config.ext.proto_enable) {
status = ucp_put_send_short(ep, buffer, count, remote_addr, rkey, param);
if (ucs_likely(status != UCS_ERR_NO_RESOURCE)) {
ret = UCS_STATUS_PTR(status);
goto out_unlock;
}
req = ucp_request_get_param(worker, param,
{ret = UCS_STATUS_PTR(UCS_ERR_NO_MEMORY);
goto out_unlock;});
req->send.rma.rkey = rkey;
req->send.rma.remote_addr = remote_addr;
if (ucs_likely(attr_mask == 0)) {
contig_length = count;
} else if (attr_mask & UCP_OP_ATTR_FIELD_DATATYPE) {
datatype = param->datatype;
if (UCP_DT_IS_CONTIG(datatype)) {
contig_length = ucp_contig_dt_length(datatype, count);
}
}
@gleon99