Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 57520751 authored by Dasaratharaman Chandramouli's avatar Dasaratharaman Chandramouli Committed by Doug Ledford
Browse files

IB/SA: Add OPA path record type



Add opa_sa_path_rec to sa_path_rec data structure.
The 'type' field in sa_path_rec identifies the
type of the path record.

Reviewed-by: default avatarDon Hiatt <don.hiatt@intel.com>
Reviewed-by: default avatarIra Weiny <ira.weiny@intel.com>
Signed-off-by: default avatarDasaratharaman Chandramouli <dasaratharaman.chandramouli@intel.com>
Signed-off-by: default avatarDoug Ledford <dledford@redhat.com>
parent 9fdca4da
Loading
Loading
Loading
Loading
+22 −12
Original line number Diff line number Diff line
@@ -1203,8 +1203,10 @@ static void cm_format_req(struct cm_req_msg *req_msg,
	}

	if (pri_path->hop_limit <= 1) {
		req_msg->primary_local_lid = sa_path_get_slid(pri_path);
		req_msg->primary_remote_lid = sa_path_get_dlid(pri_path);
		req_msg->primary_local_lid =
			htons(ntohl(sa_path_get_slid(pri_path)));
		req_msg->primary_remote_lid =
			htons(ntohl(sa_path_get_dlid(pri_path)));
	} else {
		/* Work-around until there's a way to obtain remote LID info */
		req_msg->primary_local_lid = IB_LID_PERMISSIVE;
@@ -1224,8 +1226,10 @@ static void cm_format_req(struct cm_req_msg *req_msg,

	if (alt_path) {
		if (alt_path->hop_limit <= 1) {
			req_msg->alt_local_lid = sa_path_get_slid(alt_path);
			req_msg->alt_remote_lid = sa_path_get_dlid(alt_path);
			req_msg->alt_local_lid =
				htons(ntohl(sa_path_get_slid(alt_path)));
			req_msg->alt_remote_lid =
				htons(ntohl(sa_path_get_dlid(alt_path)));
		} else {
			req_msg->alt_local_lid = IB_LID_PERMISSIVE;
			req_msg->alt_remote_lid = IB_LID_PERMISSIVE;
@@ -1407,8 +1411,10 @@ static void cm_format_paths_from_req(struct cm_req_msg *req_msg,
{
	primary_path->dgid = req_msg->primary_local_gid;
	primary_path->sgid = req_msg->primary_remote_gid;
	sa_path_set_dlid(primary_path, req_msg->primary_local_lid);
	sa_path_set_slid(primary_path, req_msg->primary_remote_lid);
	sa_path_set_dlid(primary_path,
			 htonl(ntohs(req_msg->primary_local_lid)));
	sa_path_set_slid(primary_path,
			 htonl(ntohs(req_msg->primary_remote_lid)));
	primary_path->flow_label = cm_req_get_primary_flow_label(req_msg);
	primary_path->hop_limit = req_msg->primary_hop_limit;
	primary_path->traffic_class = req_msg->primary_traffic_class;
@@ -1428,8 +1434,10 @@ static void cm_format_paths_from_req(struct cm_req_msg *req_msg,
	if (req_msg->alt_local_lid) {
		alt_path->dgid = req_msg->alt_local_gid;
		alt_path->sgid = req_msg->alt_remote_gid;
		sa_path_set_dlid(alt_path, req_msg->alt_local_lid);
		sa_path_set_slid(alt_path, req_msg->alt_remote_lid);
		sa_path_set_dlid(alt_path,
				 htonl(ntohs(req_msg->alt_local_lid)));
		sa_path_set_slid(alt_path,
				 htonl(ntohs(req_msg->alt_remote_lid)));
		alt_path->flow_label = cm_req_get_alt_flow_label(req_msg);
		alt_path->hop_limit = req_msg->alt_hop_limit;
		alt_path->traffic_class = req_msg->alt_traffic_class;
@@ -2842,8 +2850,10 @@ static void cm_format_lap(struct cm_lap_msg *lap_msg,
	cm_lap_set_remote_qpn(lap_msg, cm_id_priv->remote_qpn);
	/* todo: need remote CM response timeout */
	cm_lap_set_remote_resp_timeout(lap_msg, 0x1F);
	lap_msg->alt_local_lid = sa_path_get_slid(alternate_path);
	lap_msg->alt_remote_lid = sa_path_get_dlid(alternate_path);
	lap_msg->alt_local_lid =
		htons(ntohl(sa_path_get_slid(alternate_path)));
	lap_msg->alt_remote_lid =
		htons(ntohl(sa_path_get_dlid(alternate_path)));
	lap_msg->alt_local_gid = alternate_path->sgid;
	lap_msg->alt_remote_gid = alternate_path->dgid;
	cm_lap_set_flow_label(lap_msg, alternate_path->flow_label);
@@ -2922,8 +2932,8 @@ static void cm_format_path_from_lap(struct cm_id_private *cm_id_priv,
	path->rec_type = SA_PATH_REC_TYPE_IB;
	path->dgid = lap_msg->alt_local_gid;
	path->sgid = lap_msg->alt_remote_gid;
	sa_path_set_dlid(path, lap_msg->alt_local_lid);
	sa_path_set_slid(path, lap_msg->alt_remote_lid);
	sa_path_set_dlid(path, htonl(ntohs(lap_msg->alt_local_lid)));
	sa_path_set_slid(path, htonl(ntohs(lap_msg->alt_remote_lid)));
	path->flow_label = cm_lap_get_flow_label(lap_msg);
	path->hop_limit = lap_msg->alt_hop_limit;
	path->traffic_class = cm_lap_get_traffic_class(lap_msg);
+2 −2
Original line number Diff line number Diff line
@@ -1110,9 +1110,9 @@ int ib_init_ah_from_path(struct ib_device *device, u8 port_num,
	memset(ah_attr, 0, sizeof *ah_attr);
	ah_attr->type = rdma_ah_find_type(device, port_num);

	rdma_ah_set_dlid(ah_attr, be16_to_cpu(sa_path_get_dlid(rec)));
	rdma_ah_set_dlid(ah_attr, be32_to_cpu(sa_path_get_dlid(rec)));
	rdma_ah_set_sl(ah_attr, rec->sl);
	rdma_ah_set_path_bits(ah_attr, be16_to_cpu(sa_path_get_slid(rec)) &
	rdma_ah_set_path_bits(ah_attr, be32_to_cpu(sa_path_get_slid(rec)) &
			      get_src_path_mask(device, port_num));
	rdma_ah_set_port_num(ah_attr, port_num);
	rdma_ah_set_static_rate(ah_attr, rec->rate);
+19 −3
Original line number Diff line number Diff line
@@ -898,11 +898,18 @@ static ssize_t ucma_query_path(struct ucma_context *ctx,
	for (i = 0, out_len -= sizeof(*resp);
	     i < resp->num_paths && out_len > sizeof(struct ib_path_rec_data);
	     i++, out_len -= sizeof(struct ib_path_rec_data)) {
		struct sa_path_rec *rec = &ctx->cm_id->route.path_rec[i];

		resp->path_data[i].flags = IB_PATH_GMP | IB_PATH_PRIMARY |
					   IB_PATH_BIDIRECTIONAL;
		ib_sa_pack_path(&ctx->cm_id->route.path_rec[i],
				&resp->path_data[i].path_rec);
		if (rec->rec_type == SA_PATH_REC_TYPE_IB) {
			ib_sa_pack_path(rec, &resp->path_data[i].path_rec);
		} else {
			struct sa_path_rec ib;

			sa_convert_path_opa_to_ib(&ib, rec);
			ib_sa_pack_path(&ib, &resp->path_data[i].path_rec);
		}
	}

	if (copy_to_user(response, resp,
@@ -1215,8 +1222,17 @@ static int ucma_set_ib_path(struct ucma_context *ctx,

	memset(&sa_path, 0, sizeof(sa_path));

	sa_path.rec_type = SA_PATH_REC_TYPE_IB;
	ib_sa_unpack_path(path_data->path_rec, &sa_path);

	if (rdma_cap_opa_ah(ctx->cm_id->device, ctx->cm_id->port_num)) {
		struct sa_path_rec opa;

		sa_convert_path_ib_to_opa(&opa, &sa_path);
		ret = rdma_set_ib_paths(ctx->cm_id, &opa, 1);
	} else {
		ret = rdma_set_ib_paths(ctx->cm_id, &sa_path, 1);
	}
	if (ret)
		return ret;

+33 −7
Original line number Diff line number Diff line
@@ -96,14 +96,14 @@ void ib_copy_qp_attr_to_user(struct ib_uverbs_qp_attr *dst,
}
EXPORT_SYMBOL(ib_copy_qp_attr_to_user);

void ib_copy_path_rec_to_user(struct ib_user_path_rec *dst,
void __ib_copy_path_rec_to_user(struct ib_user_path_rec *dst,
				struct sa_path_rec *src)
{
	memcpy(dst->dgid, src->dgid.raw, sizeof src->dgid);
	memcpy(dst->sgid, src->sgid.raw, sizeof src->sgid);

	dst->dlid		= sa_path_get_dlid(src);
	dst->slid		= sa_path_get_slid(src);
	dst->dlid		= htons(ntohl(sa_path_get_dlid(src)));
	dst->slid		= htons(ntohl(sa_path_get_slid(src)));
	dst->raw_traffic	= sa_path_get_raw_traffic(src);
	dst->flow_label		= src->flow_label;
	dst->hop_limit		= src->hop_limit;
@@ -120,17 +120,42 @@ void ib_copy_path_rec_to_user(struct ib_user_path_rec *dst,
	dst->preference		= src->preference;
	dst->packet_life_time_selector = src->packet_life_time_selector;
}

void ib_copy_path_rec_to_user(struct ib_user_path_rec *dst,
			      struct sa_path_rec *src)
{
	struct sa_path_rec rec;

	if (src->rec_type == SA_PATH_REC_TYPE_OPA) {
		sa_convert_path_opa_to_ib(&rec, src);
		__ib_copy_path_rec_to_user(dst, &rec);
		return;
	}
	__ib_copy_path_rec_to_user(dst, src);
}
EXPORT_SYMBOL(ib_copy_path_rec_to_user);

void ib_copy_path_rec_from_user(struct sa_path_rec *dst,
				struct ib_user_path_rec *src)
{
	__be32 slid, dlid;

	memset(dst, 0, sizeof(*dst));
	if ((ib_is_opa_gid((union ib_gid *)src->sgid)) ||
	    (ib_is_opa_gid((union ib_gid *)src->dgid))) {
		dst->rec_type = SA_PATH_REC_TYPE_OPA;
		slid = htonl(opa_get_lid_from_gid((union ib_gid *)src->sgid));
		dlid = htonl(opa_get_lid_from_gid((union ib_gid *)src->dgid));
	} else {
		dst->rec_type = SA_PATH_REC_TYPE_IB;
		slid = htonl(ntohs(src->slid));
		dlid = htonl(ntohs(src->dlid));
	}
	memcpy(dst->dgid.raw, src->dgid, sizeof dst->dgid);
	memcpy(dst->sgid.raw, src->sgid, sizeof dst->sgid);

	dst->rec_type = SA_PATH_REC_TYPE_IB;
	sa_path_set_dlid(dst, src->dlid);
	sa_path_set_slid(dst, src->slid);
	sa_path_set_dlid(dst, dlid);
	sa_path_set_slid(dst, slid);
	sa_path_set_raw_traffic(dst, src->raw_traffic);
	dst->flow_label		= src->flow_label;
	dst->hop_limit		= src->hop_limit;
@@ -147,6 +172,7 @@ void ib_copy_path_rec_from_user(struct sa_path_rec *dst,
	dst->preference		= src->preference;
	dst->packet_life_time_selector = src->packet_life_time_selector;

	/* TODO: No need to set this */
	sa_path_set_dmac_zero(dst);
	sa_path_set_ndev(dst, NULL);
	sa_path_set_ifindex(dst, 0);
+1 −1
Original line number Diff line number Diff line
@@ -219,7 +219,7 @@ static int ipoib_path_seq_show(struct seq_file *file, void *iter_ptr)
			   "  DLID:     0x%04x\n"
			   "  SL: %12d\n"
			   "  rate: %8d.%d Gb/sec\n",
			   be16_to_cpu(sa_path_get_dlid(&path.pathrec)),
			   be32_to_cpu(sa_path_get_dlid(&path.pathrec)),
			   path.pathrec.sl,
			   rate / 1000, rate % 1000);
	}
Loading