Skip to content

Commit aa323ec

Browse files
author
CKI KWF Bot
committed
Merge: Backport more upstream MANA patches to RHEL 10.2
MR: https://gitlab.com/redhat/centos-stream/src/kernel/centos-stream-10/-/merge_requests/1435 JIRA: https://issues.redhat.com/browse/RHEL-109580 Tested: passed basic tests on an Azure D2s_v6 instance. Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com> Approved-by: Vitaly Kuznetsov <vkuznets@redhat.com> Approved-by: John W. Linville <linville@redhat.com> Approved-by: Michal Schmidt <mschmidt@redhat.com> Approved-by: CKI KWF Bot <cki-ci-bot+kwf-gitlab-com@redhat.com> Merged-by: CKI GitLab Kmaint Pipeline Bot <26919896-cki-kmaint-pipeline-bot@users.noreply.gitlab.com>
2 parents 6001cca + edb5969 commit aa323ec

File tree

15 files changed

+1014
-184
lines changed

15 files changed

+1014
-184
lines changed

drivers/infiniband/hw/mana/counters.c

Lines changed: 76 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,32 @@ static const struct rdma_stat_desc mana_ib_port_stats_desc[] = {
3232
[MANA_IB_RATE_INC_EVENTS].name = "rate_inc_events",
3333
[MANA_IB_NUM_QPS_RECOVERED].name = "num_qps_recovered",
3434
[MANA_IB_CURRENT_RATE].name = "current_rate",
35+
[MANA_IB_DUP_RX_REQ].name = "dup_rx_requests",
36+
[MANA_IB_TX_BYTES].name = "tx_bytes",
37+
[MANA_IB_RX_BYTES].name = "rx_bytes",
38+
[MANA_IB_RX_SEND_REQ].name = "rx_send_requests",
39+
[MANA_IB_RX_WRITE_REQ].name = "rx_write_requests",
40+
[MANA_IB_RX_READ_REQ].name = "rx_read_requests",
41+
[MANA_IB_TX_PKT].name = "tx_packets",
42+
[MANA_IB_RX_PKT].name = "rx_packets",
3543
};
3644

45+
static const struct rdma_stat_desc mana_ib_device_stats_desc[] = {
46+
[MANA_IB_SENT_CNPS].name = "sent_cnps",
47+
[MANA_IB_RECEIVED_ECNS].name = "received_ecns",
48+
[MANA_IB_RECEIVED_CNP_COUNT].name = "received_cnp_count",
49+
[MANA_IB_QP_CONGESTED_EVENTS].name = "qp_congested_events",
50+
[MANA_IB_QP_RECOVERED_EVENTS].name = "qp_recovered_events",
51+
[MANA_IB_DEV_RATE_INC_EVENTS].name = "rate_inc_events",
52+
};
53+
54+
struct rdma_hw_stats *mana_ib_alloc_hw_device_stats(struct ib_device *ibdev)
55+
{
56+
return rdma_alloc_hw_stats_struct(mana_ib_device_stats_desc,
57+
ARRAY_SIZE(mana_ib_device_stats_desc),
58+
RDMA_HW_STATS_DEFAULT_LIFESPAN);
59+
}
60+
3761
struct rdma_hw_stats *mana_ib_alloc_hw_port_stats(struct ib_device *ibdev,
3862
u32 port_num)
3963
{
@@ -42,8 +66,39 @@ struct rdma_hw_stats *mana_ib_alloc_hw_port_stats(struct ib_device *ibdev,
4266
RDMA_HW_STATS_DEFAULT_LIFESPAN);
4367
}
4468

45-
int mana_ib_get_hw_stats(struct ib_device *ibdev, struct rdma_hw_stats *stats,
46-
u32 port_num, int index)
69+
static int mana_ib_get_hw_device_stats(struct ib_device *ibdev, struct rdma_hw_stats *stats)
70+
{
71+
struct mana_ib_dev *mdev = container_of(ibdev, struct mana_ib_dev,
72+
ib_dev);
73+
struct mana_rnic_query_device_cntrs_resp resp = {};
74+
struct mana_rnic_query_device_cntrs_req req = {};
75+
int err;
76+
77+
mana_gd_init_req_hdr(&req.hdr, MANA_IB_QUERY_DEVICE_COUNTERS,
78+
sizeof(req), sizeof(resp));
79+
req.hdr.dev_id = mdev->gdma_dev->dev_id;
80+
req.adapter = mdev->adapter_handle;
81+
82+
err = mana_gd_send_request(mdev_to_gc(mdev), sizeof(req), &req,
83+
sizeof(resp), &resp);
84+
if (err) {
85+
ibdev_err(&mdev->ib_dev, "Failed to query device counters err %d",
86+
err);
87+
return err;
88+
}
89+
90+
stats->value[MANA_IB_SENT_CNPS] = resp.sent_cnps;
91+
stats->value[MANA_IB_RECEIVED_ECNS] = resp.received_ecns;
92+
stats->value[MANA_IB_RECEIVED_CNP_COUNT] = resp.received_cnp_count;
93+
stats->value[MANA_IB_QP_CONGESTED_EVENTS] = resp.qp_congested_events;
94+
stats->value[MANA_IB_QP_RECOVERED_EVENTS] = resp.qp_recovered_events;
95+
stats->value[MANA_IB_DEV_RATE_INC_EVENTS] = resp.rate_inc_events;
96+
97+
return ARRAY_SIZE(mana_ib_device_stats_desc);
98+
}
99+
100+
static int mana_ib_get_hw_port_stats(struct ib_device *ibdev, struct rdma_hw_stats *stats,
101+
u32 port_num)
47102
{
48103
struct mana_ib_dev *mdev = container_of(ibdev, struct mana_ib_dev,
49104
ib_dev);
@@ -53,6 +108,7 @@ int mana_ib_get_hw_stats(struct ib_device *ibdev, struct rdma_hw_stats *stats,
53108

54109
mana_gd_init_req_hdr(&req.hdr, MANA_IB_QUERY_VF_COUNTERS,
55110
sizeof(req), sizeof(resp));
111+
req.hdr.resp.msg_version = GDMA_MESSAGE_V2;
56112
req.hdr.dev_id = mdev->gdma_dev->dev_id;
57113
req.adapter = mdev->adapter_handle;
58114

@@ -101,5 +157,23 @@ int mana_ib_get_hw_stats(struct ib_device *ibdev, struct rdma_hw_stats *stats,
101157
stats->value[MANA_IB_NUM_QPS_RECOVERED] = resp.num_qps_recovered;
102158
stats->value[MANA_IB_CURRENT_RATE] = resp.current_rate;
103159

160+
stats->value[MANA_IB_DUP_RX_REQ] = resp.dup_rx_req;
161+
stats->value[MANA_IB_TX_BYTES] = resp.tx_bytes;
162+
stats->value[MANA_IB_RX_BYTES] = resp.rx_bytes;
163+
stats->value[MANA_IB_RX_SEND_REQ] = resp.rx_send_req;
164+
stats->value[MANA_IB_RX_WRITE_REQ] = resp.rx_write_req;
165+
stats->value[MANA_IB_RX_READ_REQ] = resp.rx_read_req;
166+
stats->value[MANA_IB_TX_PKT] = resp.tx_pkt;
167+
stats->value[MANA_IB_RX_PKT] = resp.rx_pkt;
168+
104169
return ARRAY_SIZE(mana_ib_port_stats_desc);
105170
}
171+
172+
int mana_ib_get_hw_stats(struct ib_device *ibdev, struct rdma_hw_stats *stats,
173+
u32 port_num, int index)
174+
{
175+
if (!port_num)
176+
return mana_ib_get_hw_device_stats(ibdev, stats);
177+
else
178+
return mana_ib_get_hw_port_stats(ibdev, stats, port_num);
179+
}

drivers/infiniband/hw/mana/counters.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,28 @@ enum mana_ib_port_counters {
3535
MANA_IB_RATE_INC_EVENTS,
3636
MANA_IB_NUM_QPS_RECOVERED,
3737
MANA_IB_CURRENT_RATE,
38+
MANA_IB_DUP_RX_REQ,
39+
MANA_IB_TX_BYTES,
40+
MANA_IB_RX_BYTES,
41+
MANA_IB_RX_SEND_REQ,
42+
MANA_IB_RX_WRITE_REQ,
43+
MANA_IB_RX_READ_REQ,
44+
MANA_IB_TX_PKT,
45+
MANA_IB_RX_PKT,
46+
};
47+
48+
enum mana_ib_device_counters {
49+
MANA_IB_SENT_CNPS,
50+
MANA_IB_RECEIVED_ECNS,
51+
MANA_IB_RECEIVED_CNP_COUNT,
52+
MANA_IB_QP_CONGESTED_EVENTS,
53+
MANA_IB_QP_RECOVERED_EVENTS,
54+
MANA_IB_DEV_RATE_INC_EVENTS,
3855
};
3956

4057
struct rdma_hw_stats *mana_ib_alloc_hw_port_stats(struct ib_device *ibdev,
4158
u32 port_num);
59+
struct rdma_hw_stats *mana_ib_alloc_hw_device_stats(struct ib_device *ibdev);
4260
int mana_ib_get_hw_stats(struct ib_device *ibdev, struct rdma_hw_stats *stats,
4361
u32 port_num, int index);
4462
#endif /* _COUNTERS_H_ */

drivers/infiniband/hw/mana/device.c

Lines changed: 66 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,10 @@ static const struct ib_device_ops mana_ib_stats_ops = {
6565
.get_hw_stats = mana_ib_get_hw_stats,
6666
};
6767

68+
static const struct ib_device_ops mana_ib_device_stats_ops = {
69+
.alloc_hw_device_stats = mana_ib_alloc_hw_device_stats,
70+
};
71+
6872
static int mana_ib_netdev_event(struct notifier_block *this,
6973
unsigned long event, void *ptr)
7074
{
@@ -73,28 +77,31 @@ static int mana_ib_netdev_event(struct notifier_block *this,
7377
struct gdma_context *gc = dev->gdma_dev->gdma_context;
7478
struct mana_context *mc = gc->mana.driver_data;
7579
struct net_device *ndev;
80+
int i;
7681

7782
/* Only process events from our parent device */
78-
if (event_dev != mc->ports[0])
79-
return NOTIFY_DONE;
80-
81-
switch (event) {
82-
case NETDEV_CHANGEUPPER:
83-
ndev = mana_get_primary_netdev(mc, 0, &dev->dev_tracker);
84-
/*
85-
* RDMA core will setup GID based on updated netdev.
86-
* It's not possible to race with the core as rtnl lock is being
87-
* held.
88-
*/
89-
ib_device_set_netdev(&dev->ib_dev, ndev, 1);
90-
91-
/* mana_get_primary_netdev() returns ndev with refcount held */
92-
netdev_put(ndev, &dev->dev_tracker);
93-
94-
return NOTIFY_OK;
95-
default:
96-
return NOTIFY_DONE;
97-
}
83+
for (i = 0; i < dev->ib_dev.phys_port_cnt; i++)
84+
if (event_dev == mc->ports[i]) {
85+
switch (event) {
86+
case NETDEV_CHANGEUPPER:
87+
ndev = mana_get_primary_netdev(mc, i, &dev->dev_tracker);
88+
/*
89+
* RDMA core will setup GID based on updated netdev.
90+
* It's not possible to race with the core as rtnl lock is being
91+
* held.
92+
*/
93+
ib_device_set_netdev(&dev->ib_dev, ndev, i + 1);
94+
95+
/* mana_get_primary_netdev() returns ndev with refcount held */
96+
if (ndev)
97+
netdev_put(ndev, &dev->dev_tracker);
98+
99+
return NOTIFY_OK;
100+
default:
101+
return NOTIFY_DONE;
102+
}
103+
}
104+
return NOTIFY_DONE;
98105
}
99106

100107
static int mana_ib_probe(struct auxiliary_device *adev,
@@ -107,7 +114,7 @@ static int mana_ib_probe(struct auxiliary_device *adev,
107114
struct net_device *ndev;
108115
struct mana_ib_dev *dev;
109116
u8 mac_addr[ETH_ALEN];
110-
int ret;
117+
int ret, i;
111118

112119
dev = ib_alloc_device(mana_ib_dev, ib_dev);
113120
if (!dev)
@@ -122,51 +129,56 @@ static int mana_ib_probe(struct auxiliary_device *adev,
122129

123130
if (mana_ib_is_rnic(dev)) {
124131
dev->ib_dev.phys_port_cnt = 1;
125-
ndev = mana_get_primary_netdev(mc, 0, &dev->dev_tracker);
126-
if (!ndev) {
127-
ret = -ENODEV;
128-
ibdev_err(&dev->ib_dev, "Failed to get netdev for IB port 1");
129-
goto free_ib_device;
130-
}
131-
ether_addr_copy(mac_addr, ndev->dev_addr);
132-
addrconf_addr_eui48((u8 *)&dev->ib_dev.node_guid, ndev->dev_addr);
133-
ret = ib_device_set_netdev(&dev->ib_dev, ndev, 1);
134-
/* mana_get_primary_netdev() returns ndev with refcount held */
135-
netdev_put(ndev, &dev->dev_tracker);
136-
if (ret) {
137-
ibdev_err(&dev->ib_dev, "Failed to set ib netdev, ret %d", ret);
138-
goto free_ib_device;
139-
}
140-
141-
dev->nb.notifier_call = mana_ib_netdev_event;
142-
ret = register_netdevice_notifier(&dev->nb);
143-
if (ret) {
144-
ibdev_err(&dev->ib_dev, "Failed to register net notifier, %d",
145-
ret);
146-
goto free_ib_device;
147-
}
148-
132+
addrconf_addr_eui48((u8 *)&dev->ib_dev.node_guid, mc->ports[0]->dev_addr);
149133
ret = mana_ib_gd_query_adapter_caps(dev);
150134
if (ret) {
151135
ibdev_err(&dev->ib_dev, "Failed to query device caps, ret %d", ret);
152-
goto deregister_net_notifier;
136+
goto free_ib_device;
153137
}
154138

155139
ib_set_device_ops(&dev->ib_dev, &mana_ib_stats_ops);
140+
if (dev->adapter_caps.feature_flags & MANA_IB_FEATURE_DEV_COUNTERS_SUPPORT)
141+
ib_set_device_ops(&dev->ib_dev, &mana_ib_device_stats_ops);
156142

157143
ret = mana_ib_create_eqs(dev);
158144
if (ret) {
159145
ibdev_err(&dev->ib_dev, "Failed to create EQs, ret %d", ret);
160-
goto deregister_net_notifier;
146+
goto free_ib_device;
161147
}
162148

163149
ret = mana_ib_gd_create_rnic_adapter(dev);
164150
if (ret)
165151
goto destroy_eqs;
166152

167-
ret = mana_ib_gd_config_mac(dev, ADDR_OP_ADD, mac_addr);
153+
if (dev->adapter_caps.feature_flags & MANA_IB_FEATURE_MULTI_PORTS_SUPPORT)
154+
dev->ib_dev.phys_port_cnt = mc->num_ports;
155+
156+
for (i = 0; i < dev->ib_dev.phys_port_cnt; i++) {
157+
ndev = mana_get_primary_netdev(mc, i, &dev->dev_tracker);
158+
if (!ndev) {
159+
ret = -ENODEV;
160+
ibdev_err(&dev->ib_dev,
161+
"Failed to get netdev for IB port %d", i + 1);
162+
goto destroy_rnic;
163+
}
164+
ether_addr_copy(mac_addr, ndev->dev_addr);
165+
ret = ib_device_set_netdev(&dev->ib_dev, ndev, i + 1);
166+
/* mana_get_primary_netdev() returns ndev with refcount held */
167+
netdev_put(ndev, &dev->dev_tracker);
168+
if (ret) {
169+
ibdev_err(&dev->ib_dev, "Failed to set ib netdev, ret %d", ret);
170+
goto destroy_rnic;
171+
}
172+
ret = mana_ib_gd_config_mac(dev, ADDR_OP_ADD, mac_addr);
173+
if (ret) {
174+
ibdev_err(&dev->ib_dev, "Failed to add Mac address, ret %d", ret);
175+
goto destroy_rnic;
176+
}
177+
}
178+
dev->nb.notifier_call = mana_ib_netdev_event;
179+
ret = register_netdevice_notifier(&dev->nb);
168180
if (ret) {
169-
ibdev_err(&dev->ib_dev, "Failed to add Mac address, ret %d", ret);
181+
ibdev_err(&dev->ib_dev, "Failed to register net notifier, %d", ret);
170182
goto destroy_rnic;
171183
}
172184
} else {
@@ -182,7 +194,7 @@ static int mana_ib_probe(struct auxiliary_device *adev,
182194
MANA_AV_BUFFER_SIZE, 0);
183195
if (!dev->av_pool) {
184196
ret = -ENOMEM;
185-
goto destroy_rnic;
197+
goto deregister_net_notifier;
186198
}
187199

188200
ibdev_dbg(&dev->ib_dev, "mdev=%p id=%d num_ports=%d\n", mdev,
@@ -199,15 +211,15 @@ static int mana_ib_probe(struct auxiliary_device *adev,
199211

200212
deallocate_pool:
201213
dma_pool_destroy(dev->av_pool);
214+
deregister_net_notifier:
215+
if (mana_ib_is_rnic(dev))
216+
unregister_netdevice_notifier(&dev->nb);
202217
destroy_rnic:
203218
if (mana_ib_is_rnic(dev))
204219
mana_ib_gd_destroy_rnic_adapter(dev);
205220
destroy_eqs:
206221
if (mana_ib_is_rnic(dev))
207222
mana_ib_destroy_eqs(dev);
208-
deregister_net_notifier:
209-
if (mana_ib_is_rnic(dev))
210-
unregister_netdevice_notifier(&dev->nb);
211223
free_ib_device:
212224
xa_destroy(&dev->qp_table_wq);
213225
ib_dealloc_device(&dev->ib_dev);
@@ -221,9 +233,9 @@ static void mana_ib_remove(struct auxiliary_device *adev)
221233
ib_unregister_device(&dev->ib_dev);
222234
dma_pool_destroy(dev->av_pool);
223235
if (mana_ib_is_rnic(dev)) {
236+
unregister_netdevice_notifier(&dev->nb);
224237
mana_ib_gd_destroy_rnic_adapter(dev);
225238
mana_ib_destroy_eqs(dev);
226-
unregister_netdevice_notifier(&dev->nb);
227239
}
228240
xa_destroy(&dev->qp_table_wq);
229241
ib_dealloc_device(&dev->ib_dev);

drivers/infiniband/hw/mana/main.c

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -563,8 +563,14 @@ int mana_ib_get_port_immutable(struct ib_device *ibdev, u32 port_num,
563563
immutable->gid_tbl_len = attr.gid_tbl_len;
564564

565565
if (mana_ib_is_rnic(dev)) {
566-
immutable->core_cap_flags = RDMA_CORE_PORT_IBA_ROCE_UDP_ENCAP;
567-
immutable->max_mad_size = IB_MGMT_MAD_SIZE;
566+
if (port_num == 1) {
567+
immutable->core_cap_flags = RDMA_CORE_PORT_IBA_ROCE_UDP_ENCAP;
568+
immutable->max_mad_size = IB_MGMT_MAD_SIZE;
569+
} else {
570+
immutable->core_cap_flags = RDMA_CORE_CAP_PROT_ROCE_UDP_ENCAP
571+
| RDMA_CORE_CAP_ETH_AH;
572+
immutable->max_mad_size = 0;
573+
}
568574
} else {
569575
immutable->core_cap_flags = RDMA_CORE_PORT_RAW_PACKET;
570576
}
@@ -633,8 +639,9 @@ int mana_ib_query_port(struct ib_device *ibdev, u32 port,
633639
props->pkey_tbl_len = 1;
634640
if (mana_ib_is_rnic(dev)) {
635641
props->gid_tbl_len = 16;
636-
props->port_cap_flags = IB_PORT_CM_SUP;
637642
props->ip_gids = true;
643+
if (port == 1)
644+
props->port_cap_flags = IB_PORT_CM_SUP;
638645
}
639646

640647
return 0;

0 commit comments

Comments
 (0)