Beispiel #1
0
/*******************************************************************************
 * 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;
}
Beispiel #2
0
/*******************************************************************************
 * 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;
}