in prov/gni/include/gnix.h [881:988]
static inline int gnix_ops_allowed(struct gnix_fid_ep *ep,
uint64_t peer_caps,
uint64_t flags)
{
uint64_t caps = ep->caps;
GNIX_DEBUG(FI_LOG_EP_DATA, "flags:0x%llx, %s\n", flags,
fi_tostr(&flags, FI_TYPE_OP_FLAGS));
GNIX_DEBUG(FI_LOG_EP_DATA, "peer_caps:0x%llx, %s\n", peer_caps,
fi_tostr(&peer_caps, FI_TYPE_OP_FLAGS));
GNIX_DEBUG(FI_LOG_EP_DATA, "caps:0x%llx, %s\n",
ep->caps, fi_tostr(&ep->caps, FI_TYPE_CAPS));
if ((flags & FI_RMA) && (flags & FI_READ)) {
if (OFI_UNLIKELY(!ep->ep_ops.rma_read_allowed)) {
/* check if read initiate capabilities are allowed */
if (caps & FI_RMA) {
if (caps & FI_READ) {
;
} else if (caps & (FI_WRITE |
FI_REMOTE_WRITE |
FI_REMOTE_READ)) {
return 0;
}
} else {
return 0;
}
/* check if read remote capabilities are allowed */
if (gnix_rma_read_target_allowed(peer_caps, flags)) {
ep->ep_ops.rma_read_allowed = 1;
return 1;
}
return 0;
}
return 1;
} else if ((flags & FI_RMA) && (flags & FI_WRITE)) {
if (OFI_UNLIKELY(!ep->ep_ops.rma_write_allowed)) {
/* check if write initiate capabilities are allowed */
if (caps & FI_RMA) {
if (caps & FI_WRITE) {
;
} else if (caps & (FI_READ |
FI_REMOTE_WRITE |
FI_REMOTE_READ)) {
return 0;
}
} else {
return 0;
}
/* check if write remote capabilities are allowed */
if (gnix_rma_write_target_allowed(peer_caps, flags)) {
ep->ep_ops.rma_write_allowed = 1;
return 1;
}
return 0;
}
return 1;
} else if ((flags & FI_ATOMICS) && (flags & FI_READ)) {
if (OFI_UNLIKELY(!ep->ep_ops.atomic_read_allowed)) {
/* check if read initiate capabilities are allowed */
if (caps & FI_ATOMICS) {
if (caps & FI_READ) {
;
} else if (caps & (FI_WRITE |
FI_REMOTE_WRITE |
FI_REMOTE_READ)) {
return 0;
}
} else {
return 0;
}
/* check if read remote capabilities are allowed */
if (gnix_atomic_read_target_allowed(peer_caps, flags)) {
ep->ep_ops.atomic_read_allowed = 1;
return 1;
}
return 0;
}
return 1;
} else if ((flags & FI_ATOMICS) && (flags & FI_WRITE)) {
if (OFI_UNLIKELY(!ep->ep_ops.atomic_write_allowed)) {
/* check if write initiate capabilities are allowed */
if (caps & FI_ATOMICS) {
if (caps & FI_WRITE) {
;
} else if (caps & (FI_READ |
FI_REMOTE_WRITE |
FI_REMOTE_READ)) {
return 0;
}
} else {
return 0;
}
/* check if write remote capabilities are allowed */
if (gnix_atomic_write_target_allowed(peer_caps,
flags)) {
ep->ep_ops.atomic_write_allowed = 1;
return 1;
}
return 0;
}
return 1;
}
GNIX_ERR(FI_LOG_EP_DATA, "flags do not make sense %llx\n", flags);
return 0;
}