/******************************************************************************* * FI_AV_TABLE specific implementations. ******************************************************************************/ static int table_insert(struct gnix_fid_av *av_priv, const void *addr, size_t count, fi_addr_t *fi_addr, uint64_t flags, void *context) { struct gnix_ep_name *temp = NULL; int ret = count; size_t index; size_t i; if (gnix_check_capacity(av_priv, count)) { ret = -FI_ENOMEM; goto err; } assert(av_priv->table); for (index = av_priv->count, i = 0; i < count; index++, i++) { temp = &((struct gnix_ep_name *)addr)[i]; av_priv->table[index].gnix_addr = temp->gnix_addr; av_priv->valid_entry_vec[index] = 1; av_priv->table[index].name_type = temp->name_type; av_priv->table[index].cookie = temp->cookie; av_priv->table[index].cm_nic_cdm_id = temp->cm_nic_cdm_id; if (fi_addr) fi_addr[i] = index; } av_priv->count += count; err: return ret; }
/******************************************************************************* * FI_AV_TABLE specific implementations. ******************************************************************************/ static int table_insert(struct gnix_fid_av *av_priv, const void *addr, size_t count, fi_addr_t *fi_addr, uint64_t flags, void *context) { struct gnix_ep_name ep_name; int ret = count; size_t index, i; int *entry_err = context; if (gnix_check_capacity(av_priv, count)) { return -FI_ENOMEM; } assert(av_priv->table); for (index = av_priv->count, i = 0; i < count; index++, i++) { _gnix_get_ep_name(addr, i, &ep_name, av_priv->domain); /* check if this ep_name fits in the av context bits */ if (ep_name.name_type & GNIX_EPN_TYPE_SEP) { if ((1 << av_priv->rx_ctx_bits) < ep_name.rx_ctx_cnt) { if (flags & FI_SYNC_ERR) { entry_err[i] = -FI_EINVAL; fi_addr[i] = FI_ADDR_NOTAVAIL; ret = -FI_EINVAL; continue; } GNIX_DEBUG(FI_LOG_AV, "ep_name doesn't fit " "into the av context bits\n"); return -FI_EINVAL; } } av_priv->table[index].gnix_addr = ep_name.gnix_addr; av_priv->valid_entry_vec[index] = 1; av_priv->table[index].name_type = ep_name.name_type; av_priv->table[index].cookie = ep_name.cookie; av_priv->table[index].rx_ctx_cnt = ep_name.rx_ctx_cnt; av_priv->table[index].cm_nic_cdm_id = ep_name.cm_nic_cdm_id; av_priv->table[index].key_offset = ep_name.key_offset; if (fi_addr) fi_addr[i] = index; if (flags & FI_SYNC_ERR) { entry_err[i] = FI_SUCCESS; } } av_priv->count += count; return ret; }