Skip to content

Commit fddaa2b

Browse files
committed
UCT/IB: Propagate traffic class in IB address for symmetric QoS
Pack the traffic class into the IB address exchanged during connection setup so the remote side can apply it when the local interface has no traffic class configured. This fixes one-directional DSCP/TC when UCX_IB_TRAFFIC_CLASS is set, ensuring both sides of an RC connection use the same traffic class value. Also update the DevX QP connect path to read traffic class from ah_attr (which may carry the remote value) instead of always using the local iface config. Closes #10325
1 parent 6dda7bd commit fddaa2b

4 files changed

Lines changed: 46 additions & 11 deletions

File tree

src/uct/ib/base/ib_device.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,10 @@ enum {
129129
/* Used for IB link layer. */
130130
UCT_IB_ADDRESS_FLAG_SUBNET64 = UCS_BIT(5),
131131
/* Used for IB link layer. */
132-
UCT_IB_ADDRESS_FLAG_IF_ID = UCS_BIT(6)
132+
UCT_IB_ADDRESS_FLAG_IF_ID = UCS_BIT(6),
133+
134+
/* Traffic class value, used for both ETH or IB link layer. */
135+
UCT_IB_ADDRESS_FLAG_TRAFFIC_CLASS = UCS_BIT(7)
133136
};
134137

135138

src/uct/ib/base/ib_iface.c

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -408,6 +408,10 @@ size_t uct_ib_address_size(const uct_ib_address_pack_params_t *params)
408408
size += sizeof(uint16_t);
409409
}
410410

411+
if (params->flags & UCT_IB_ADDRESS_PACK_FLAG_TRAFFIC_CLASS) {
412+
size += sizeof(uint8_t);
413+
}
414+
411415
return size;
412416
}
413417

@@ -486,6 +490,11 @@ void uct_ib_address_pack(const uct_ib_address_pack_params_t *params,
486490
ib_addr->flags |= UCT_IB_ADDRESS_FLAG_PKEY;
487491
*ucs_serialize_next(&ptr, uint16_t) = params->pkey;
488492
}
493+
494+
if (params->flags & UCT_IB_ADDRESS_PACK_FLAG_TRAFFIC_CLASS) {
495+
ib_addr->flags |= UCT_IB_ADDRESS_FLAG_TRAFFIC_CLASS;
496+
*ucs_serialize_next(&ptr, uint8_t) = params->traffic_class;
497+
}
489498
}
490499

491500
unsigned uct_ib_iface_address_pack_flags(uct_ib_iface_t *iface)
@@ -512,6 +521,10 @@ unsigned uct_ib_iface_address_pack_flags(uct_ib_iface_t *iface)
512521
pack_flags |= UCT_IB_ADDRESS_PACK_FLAG_PATH_MTU;
513522
}
514523

524+
if (iface->config.traffic_class != 0) {
525+
pack_flags |= UCT_IB_ADDRESS_PACK_FLAG_TRAFFIC_CLASS;
526+
}
527+
515528
return pack_flags;
516529
}
517530

@@ -529,14 +542,15 @@ void uct_ib_iface_address_pack(uct_ib_iface_t *iface, uct_ib_address_t *ib_addr)
529542
{
530543
uct_ib_address_pack_params_t params;
531544

532-
params.flags = uct_ib_iface_address_pack_flags(iface);
533-
params.gid = iface->gid_info.gid;
534-
params.lid = uct_ib_iface_port_attr(iface)->lid;
535-
params.roce_info = iface->gid_info.roce_info;
536-
params.path_mtu = iface->config.path_mtu;
545+
params.flags = uct_ib_iface_address_pack_flags(iface);
546+
params.gid = iface->gid_info.gid;
547+
params.lid = uct_ib_iface_port_attr(iface)->lid;
548+
params.roce_info = iface->gid_info.roce_info;
549+
params.path_mtu = iface->config.path_mtu;
537550
/* to suppress gcc 4.3.4 warning */
538-
params.gid_index = UCT_IB_ADDRESS_INVALID_GID_INDEX;
539-
params.pkey = iface->pkey;
551+
params.gid_index = UCT_IB_ADDRESS_INVALID_GID_INDEX;
552+
params.pkey = iface->pkey;
553+
params.traffic_class = iface->config.traffic_class;
540554
uct_ib_address_pack(&params, ib_addr);
541555
}
542556

@@ -610,6 +624,11 @@ ucs_status_t uct_ib_address_unpack(const uct_ib_address_t *ib_addr,
610624
/* PKEY is always in params */
611625
params.flags |= UCT_IB_ADDRESS_PACK_FLAG_PKEY;
612626

627+
if (ib_addr->flags & UCT_IB_ADDRESS_FLAG_TRAFFIC_CLASS) {
628+
params.traffic_class = *ucs_serialize_next(&ptr, const uint8_t);
629+
params.flags |= UCT_IB_ADDRESS_PACK_FLAG_TRAFFIC_CLASS;
630+
}
631+
613632
*params_p = params;
614633
return UCS_OK;
615634
}
@@ -1125,6 +1144,15 @@ uct_ib_iface_fill_ah_attr_from_addr(uct_ib_iface_t *iface,
11251144
lid = (flid == 0) ? params.lid : flid;
11261145
uct_ib_iface_fill_ah_attr_from_gid_lid(iface, lid, gid, params.gid_index,
11271146
path_index, ah_attr);
1147+
1148+
/* If the remote address carries a traffic class and the local interface
1149+
* does not have one configured, apply the remote value so that both
1150+
* directions of the connection use the same traffic class. */
1151+
if ((params.flags & UCT_IB_ADDRESS_PACK_FLAG_TRAFFIC_CLASS) &&
1152+
(iface->config.traffic_class == 0)) {
1153+
ah_attr->grh.traffic_class = params.traffic_class;
1154+
}
1155+
11281156
return UCS_OK;
11291157
}
11301158

src/uct/ib/base/ib_iface.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,8 @@ enum {
105105
UCT_IB_ADDRESS_PACK_FLAG_SUBNET_PREFIX = UCS_BIT(2),
106106
UCT_IB_ADDRESS_PACK_FLAG_PATH_MTU = UCS_BIT(3),
107107
UCT_IB_ADDRESS_PACK_FLAG_GID_INDEX = UCS_BIT(4),
108-
UCT_IB_ADDRESS_PACK_FLAG_PKEY = UCS_BIT(5)
108+
UCT_IB_ADDRESS_PACK_FLAG_PKEY = UCS_BIT(5),
109+
UCT_IB_ADDRESS_PACK_FLAG_TRAFFIC_CLASS = UCS_BIT(6)
109110
};
110111

111112

@@ -147,6 +148,9 @@ typedef struct uct_ib_address_pack_params {
147148
/* PKEY value,
148149
must be valid if @ref UCT_IB_ADDRESS_PACK_FLAG_PKEY is set. */
149150
uint16_t pkey;
151+
/* Traffic class value,
152+
must be valid if @ref UCT_IB_ADDRESS_PACK_FLAG_TRAFFIC_CLASS is set. */
153+
uint8_t traffic_class;
150154
} uct_ib_address_pack_params_t;
151155

152156

src/uct/ib/mlx5/rc/rc_mlx5_devx.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -434,7 +434,7 @@ ucs_status_t uct_rc_mlx5_iface_common_devx_connect_qp(
434434
UCT_IB_MLX5DV_SET(qpc, qpc, primary_address_path.udp_sport,
435435
ah_attr->dlid);
436436
UCT_IB_MLX5DV_SET(qpc, qpc, primary_address_path.dscp,
437-
uct_ib_iface_roce_dscp(&iface->super.super));
437+
ah_attr->grh.traffic_class >> 2);
438438
}
439439

440440
uct_ib_mlx5_devx_set_qpc_port_affinity(md, path_index, qpc,
@@ -457,7 +457,7 @@ ucs_status_t uct_rc_mlx5_iface_common_devx_connect_qp(
457457
UCT_IB_MLX5DV_FLD_SZ_BYTES(qpc, primary_address_path.rgid_rip));
458458
/* TODO add flow_label support */
459459
UCT_IB_MLX5DV_SET(qpc, qpc, primary_address_path.tclass,
460-
iface->super.super.config.traffic_class);
460+
ah_attr->grh.traffic_class);
461461
}
462462
}
463463

0 commit comments

Comments
 (0)