* [PATCH v7 0/4] Support PERF MGMT for RXE
@ 2026-04-14 6:29 zhenwei pi
2026-04-14 6:29 ` [PATCH v7 1/4] RDMA/rxe: remove rxe_ib_device_get_netdev() and RXE_PORT zhenwei pi
` (3 more replies)
0 siblings, 4 replies; 5+ messages in thread
From: zhenwei pi @ 2026-04-14 6:29 UTC (permalink / raw)
To: linux-kernel, linux-rdma; +Cc: zyjzyj2000, jgg, leon, zhenwei pi
v7:
- use 'counters/port_xmit_data' & 'counters/port_rcv_data' instead of
'hw_counters/sent_bytes' & 'hw_counters/rcvd_bytes'
v6:
- return IB_MAD_RESULT_SUCCESS instead of 'IB_MAD_RESULT_SUCCESS | IB_MAD_RESULT_REPLY'
on unsupported method
- add a script to verify the sent/rcvd bytes which is wrotten by Yanjun
v5:
- remove patch "RDMA/core: Fix memory free for GID table", it was
applied by Jason separately.
- suggested by Yanjun, use 'skb_network_offset' to calculate the
length of received packets.
v4:
- drop rxe_ib_device_get_netdev and RXE_PORT, use 1 instead
- avoid UAF to get skb length
- remove one-line wrapper rxe_counter_get, use atomic64_read instead
- fix memory free for GID table, this is a new patch in this series.
v3:
- merge 'RDMA/rxe: use rxe_counter_get' into previous commit
- zero *out* MAD memory
- return success with error status rather than failure to avoid
uplayer hang
v2:
- Fix overflow for PMA counter *link_downed_counter*
- Use *rxe_counter_get* instead of *atomic64_read* for hw-counters
v1:
Support PERF MGMT for RXE, add sent/received bytes for RXE counters,
also improve coding style.
Zhu Yanjun (1):
selftest/rxe: Add selftests for perf
zhenwei pi (3):
RDMA/rxe: remove rxe_ib_device_get_netdev() and RXE_PORT
RDMA/rxe: add SENT/RCVD bytes
RDMA/rxe: support perf mgmt GET method
drivers/infiniband/sw/rxe/Makefile | 1 +
drivers/infiniband/sw/rxe/rxe_hw_counters.c | 2 +
drivers/infiniband/sw/rxe/rxe_hw_counters.h | 2 +
drivers/infiniband/sw/rxe/rxe_loc.h | 6 ++
drivers/infiniband/sw/rxe/rxe_mad.c | 101 ++++++++++++++++++
drivers/infiniband/sw/rxe/rxe_mcast.c | 4 +-
drivers/infiniband/sw/rxe/rxe_net.c | 9 +-
drivers/infiniband/sw/rxe/rxe_recv.c | 2 +
drivers/infiniband/sw/rxe/rxe_verbs.c | 5 +-
drivers/infiniband/sw/rxe/rxe_verbs.h | 10 +-
tools/testing/selftests/rdma/Makefile | 3 +-
.../selftests/rdma/rxe_sent_rcvd_bytes.sh | 75 +++++++++++++
12 files changed, 206 insertions(+), 14 deletions(-)
create mode 100644 drivers/infiniband/sw/rxe/rxe_mad.c
create mode 100755 tools/testing/selftests/rdma/rxe_sent_rcvd_bytes.sh
--
2.43.0
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v7 1/4] RDMA/rxe: remove rxe_ib_device_get_netdev() and RXE_PORT
2026-04-14 6:29 [PATCH v7 0/4] Support PERF MGMT for RXE zhenwei pi
@ 2026-04-14 6:29 ` zhenwei pi
2026-04-14 6:29 ` [PATCH v7 2/4] RDMA/rxe: add SENT/RCVD bytes zhenwei pi
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: zhenwei pi @ 2026-04-14 6:29 UTC (permalink / raw)
To: linux-kernel, linux-rdma; +Cc: zyjzyj2000, jgg, leon, zhenwei pi
Suggested by Leon, remove the rxe_ib_device_get_netdev() wrapper and
the RXE_PORT definition. These additions do not improve readability,
and RXE has always had only a single port.
Signed-off-by: zhenwei pi <zhenwei.pi@linux.dev>
---
drivers/infiniband/sw/rxe/rxe_mcast.c | 4 ++--
drivers/infiniband/sw/rxe/rxe_net.c | 7 +++----
drivers/infiniband/sw/rxe/rxe_verbs.c | 4 ++--
drivers/infiniband/sw/rxe/rxe_verbs.h | 6 ------
4 files changed, 7 insertions(+), 14 deletions(-)
diff --git a/drivers/infiniband/sw/rxe/rxe_mcast.c b/drivers/infiniband/sw/rxe/rxe_mcast.c
index 5cad72073eca..acd03bd87794 100644
--- a/drivers/infiniband/sw/rxe/rxe_mcast.c
+++ b/drivers/infiniband/sw/rxe/rxe_mcast.c
@@ -34,7 +34,7 @@ static int rxe_mcast_add(struct rxe_dev *rxe, union ib_gid *mgid)
struct net_device *ndev;
int ret;
- ndev = rxe_ib_device_get_netdev(&rxe->ib_dev);
+ ndev = ib_device_get_netdev(&rxe->ib_dev, 1);
if (!ndev)
return -ENODEV;
@@ -59,7 +59,7 @@ static int rxe_mcast_del(struct rxe_dev *rxe, union ib_gid *mgid)
struct net_device *ndev;
int ret;
- ndev = rxe_ib_device_get_netdev(&rxe->ib_dev);
+ ndev = ib_device_get_netdev(&rxe->ib_dev, 1);
if (!ndev)
return -ENODEV;
diff --git a/drivers/infiniband/sw/rxe/rxe_net.c b/drivers/infiniband/sw/rxe/rxe_net.c
index 211bd3000acc..6621d01ac32d 100644
--- a/drivers/infiniband/sw/rxe/rxe_net.c
+++ b/drivers/infiniband/sw/rxe/rxe_net.c
@@ -602,7 +602,7 @@ const char *rxe_parent_name(struct rxe_dev *rxe, unsigned int port_num)
struct net_device *ndev;
char *ndev_name;
- ndev = rxe_ib_device_get_netdev(&rxe->ib_dev);
+ ndev = ib_device_get_netdev(&rxe->ib_dev, 1);
if (!ndev)
return NULL;
ndev_name = ndev->name;
@@ -646,12 +646,11 @@ static void rxe_sock_put(struct sock *sk,
void rxe_net_del(struct ib_device *dev)
{
- struct rxe_dev *rxe = container_of(dev, struct rxe_dev, ib_dev);
struct net_device *ndev;
struct sock *sk;
struct net *net;
- ndev = rxe_ib_device_get_netdev(&rxe->ib_dev);
+ ndev = ib_device_get_netdev(dev, 1);
if (!ndev)
return;
@@ -699,7 +698,7 @@ void rxe_set_port_state(struct rxe_dev *rxe)
{
struct net_device *ndev;
- ndev = rxe_ib_device_get_netdev(&rxe->ib_dev);
+ ndev = ib_device_get_netdev(&rxe->ib_dev, 1);
if (!ndev)
return;
diff --git a/drivers/infiniband/sw/rxe/rxe_verbs.c b/drivers/infiniband/sw/rxe/rxe_verbs.c
index 4d4891dc2884..eb17b6086d5e 100644
--- a/drivers/infiniband/sw/rxe/rxe_verbs.c
+++ b/drivers/infiniband/sw/rxe/rxe_verbs.c
@@ -50,7 +50,7 @@ static int rxe_query_port(struct ib_device *ibdev,
goto err_out;
}
- ndev = rxe_ib_device_get_netdev(ibdev);
+ ndev = ib_device_get_netdev(ibdev, 1);
if (!ndev) {
err = -ENODEV;
goto err_out;
@@ -1441,7 +1441,7 @@ static int rxe_enable_driver(struct ib_device *ib_dev)
struct rxe_dev *rxe = container_of(ib_dev, struct rxe_dev, ib_dev);
struct net_device *ndev;
- ndev = rxe_ib_device_get_netdev(ib_dev);
+ ndev = ib_device_get_netdev(ib_dev, 1);
if (!ndev)
return -ENODEV;
diff --git a/drivers/infiniband/sw/rxe/rxe_verbs.h b/drivers/infiniband/sw/rxe/rxe_verbs.h
index d92f80d16f78..e800545d1046 100644
--- a/drivers/infiniband/sw/rxe/rxe_verbs.h
+++ b/drivers/infiniband/sw/rxe/rxe_verbs.h
@@ -415,7 +415,6 @@ struct rxe_port {
u32 qp_gsi_index;
};
-#define RXE_PORT 1
struct rxe_dev {
struct ib_device ib_dev;
struct ib_device_attr attr;
@@ -451,11 +450,6 @@ struct rxe_dev {
struct rxe_port port;
};
-static inline struct net_device *rxe_ib_device_get_netdev(struct ib_device *dev)
-{
- return ib_device_get_netdev(dev, RXE_PORT);
-}
-
static inline void rxe_counter_inc(struct rxe_dev *rxe, enum rxe_counters index)
{
atomic64_inc(&rxe->stats_counters[index]);
--
2.43.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v7 2/4] RDMA/rxe: add SENT/RCVD bytes
2026-04-14 6:29 [PATCH v7 0/4] Support PERF MGMT for RXE zhenwei pi
2026-04-14 6:29 ` [PATCH v7 1/4] RDMA/rxe: remove rxe_ib_device_get_netdev() and RXE_PORT zhenwei pi
@ 2026-04-14 6:29 ` zhenwei pi
2026-04-14 6:29 ` [PATCH v7 3/4] RDMA/rxe: support perf mgmt GET method zhenwei pi
2026-04-14 6:29 ` [PATCH v7 4/4] selftest/rxe: Add selftests for perf zhenwei pi
3 siblings, 0 replies; 5+ messages in thread
From: zhenwei pi @ 2026-04-14 6:29 UTC (permalink / raw)
To: linux-kernel, linux-rdma; +Cc: zyjzyj2000, jgg, leon, zhenwei pi
There is a lack of sent/received counter in bytes.
Signed-off-by: zhenwei pi <zhenwei.pi@linux.dev>
---
drivers/infiniband/sw/rxe/rxe_hw_counters.c | 2 ++
drivers/infiniband/sw/rxe/rxe_hw_counters.h | 2 ++
drivers/infiniband/sw/rxe/rxe_net.c | 2 ++
drivers/infiniband/sw/rxe/rxe_recv.c | 2 ++
drivers/infiniband/sw/rxe/rxe_verbs.h | 6 ++++++
5 files changed, 14 insertions(+)
diff --git a/drivers/infiniband/sw/rxe/rxe_hw_counters.c b/drivers/infiniband/sw/rxe/rxe_hw_counters.c
index 437917a7d8f2..17edaa9a9b9b 100644
--- a/drivers/infiniband/sw/rxe/rxe_hw_counters.c
+++ b/drivers/infiniband/sw/rxe/rxe_hw_counters.c
@@ -22,6 +22,8 @@ static const struct rdma_stat_desc rxe_counter_descs[] = {
[RXE_CNT_LINK_DOWNED].name = "link_downed",
[RXE_CNT_RDMA_SEND].name = "rdma_sends",
[RXE_CNT_RDMA_RECV].name = "rdma_recvs",
+ [RXE_CNT_SENT_BYTES].name = "sent_bytes",
+ [RXE_CNT_RCVD_BYTES].name = "rcvd_bytes",
};
int rxe_ib_get_hw_stats(struct ib_device *ibdev,
diff --git a/drivers/infiniband/sw/rxe/rxe_hw_counters.h b/drivers/infiniband/sw/rxe/rxe_hw_counters.h
index 051f9e1c3852..01b355103cbc 100644
--- a/drivers/infiniband/sw/rxe/rxe_hw_counters.h
+++ b/drivers/infiniband/sw/rxe/rxe_hw_counters.h
@@ -26,6 +26,8 @@ enum rxe_counters {
RXE_CNT_LINK_DOWNED,
RXE_CNT_RDMA_SEND,
RXE_CNT_RDMA_RECV,
+ RXE_CNT_SENT_BYTES,
+ RXE_CNT_RCVD_BYTES,
RXE_NUM_OF_COUNTERS
};
diff --git a/drivers/infiniband/sw/rxe/rxe_net.c b/drivers/infiniband/sw/rxe/rxe_net.c
index 6621d01ac32d..86660031ffa2 100644
--- a/drivers/infiniband/sw/rxe/rxe_net.c
+++ b/drivers/infiniband/sw/rxe/rxe_net.c
@@ -503,6 +503,7 @@ int rxe_xmit_packet(struct rxe_qp *qp, struct rxe_pkt_info *pkt,
int err;
int is_request = pkt->mask & RXE_REQ_MASK;
struct rxe_dev *rxe = to_rdev(qp->ibqp.device);
+ unsigned int skblen = skb->len;
unsigned long flags;
spin_lock_irqsave(&qp->state_lock, flags);
@@ -526,6 +527,7 @@ int rxe_xmit_packet(struct rxe_qp *qp, struct rxe_pkt_info *pkt,
}
rxe_counter_inc(rxe, RXE_CNT_SENT_PKTS);
+ rxe_counter_add(rxe, RXE_CNT_SENT_BYTES, skblen);
goto done;
drop:
diff --git a/drivers/infiniband/sw/rxe/rxe_recv.c b/drivers/infiniband/sw/rxe/rxe_recv.c
index 5861e4244049..e7bab89e7d8d 100644
--- a/drivers/infiniband/sw/rxe/rxe_recv.c
+++ b/drivers/infiniband/sw/rxe/rxe_recv.c
@@ -318,6 +318,7 @@ void rxe_rcv(struct sk_buff *skb)
int err;
struct rxe_pkt_info *pkt = SKB_TO_PKT(skb);
struct rxe_dev *rxe = pkt->rxe;
+ unsigned int skblen = skb->len - skb_network_offset(skb);
if (unlikely(skb->len < RXE_BTH_BYTES))
goto drop;
@@ -341,6 +342,7 @@ void rxe_rcv(struct sk_buff *skb)
if (unlikely(err))
goto drop;
+ rxe_counter_add(rxe, RXE_CNT_RCVD_BYTES, skblen);
rxe_counter_inc(rxe, RXE_CNT_RCVD_PKTS);
if (unlikely(bth_qpn(pkt) == IB_MULTICAST_QPN))
diff --git a/drivers/infiniband/sw/rxe/rxe_verbs.h b/drivers/infiniband/sw/rxe/rxe_verbs.h
index e800545d1046..0f5ffd94643f 100644
--- a/drivers/infiniband/sw/rxe/rxe_verbs.h
+++ b/drivers/infiniband/sw/rxe/rxe_verbs.h
@@ -455,6 +455,12 @@ static inline void rxe_counter_inc(struct rxe_dev *rxe, enum rxe_counters index)
atomic64_inc(&rxe->stats_counters[index]);
}
+static inline void rxe_counter_add(struct rxe_dev *rxe, enum rxe_counters index,
+ s64 val)
+{
+ atomic64_add(val, &rxe->stats_counters[index]);
+}
+
static inline struct rxe_dev *to_rdev(struct ib_device *dev)
{
return dev ? container_of(dev, struct rxe_dev, ib_dev) : NULL;
--
2.43.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v7 3/4] RDMA/rxe: support perf mgmt GET method
2026-04-14 6:29 [PATCH v7 0/4] Support PERF MGMT for RXE zhenwei pi
2026-04-14 6:29 ` [PATCH v7 1/4] RDMA/rxe: remove rxe_ib_device_get_netdev() and RXE_PORT zhenwei pi
2026-04-14 6:29 ` [PATCH v7 2/4] RDMA/rxe: add SENT/RCVD bytes zhenwei pi
@ 2026-04-14 6:29 ` zhenwei pi
2026-04-14 6:29 ` [PATCH v7 4/4] selftest/rxe: Add selftests for perf zhenwei pi
3 siblings, 0 replies; 5+ messages in thread
From: zhenwei pi @ 2026-04-14 6:29 UTC (permalink / raw)
To: linux-kernel, linux-rdma; +Cc: zyjzyj2000, jgg, leon, zhenwei pi
In RXE, hardware counters are already supported, but not in a
standardized manner. For instance, user-space monitoring tools like
atop only read from the *counters* directory. Therefore, it is
necessary to add perf management support to RXE.
Also use rxe_counter_get instead of raw atomic64_read in hw-counters.
Signed-off-by: zhenwei pi <zhenwei.pi@linux.dev>
---
drivers/infiniband/sw/rxe/Makefile | 1 +
drivers/infiniband/sw/rxe/rxe_loc.h | 6 ++
drivers/infiniband/sw/rxe/rxe_mad.c | 101 ++++++++++++++++++++++++++
drivers/infiniband/sw/rxe/rxe_verbs.c | 1 +
4 files changed, 109 insertions(+)
create mode 100644 drivers/infiniband/sw/rxe/rxe_mad.c
diff --git a/drivers/infiniband/sw/rxe/Makefile b/drivers/infiniband/sw/rxe/Makefile
index 3977f4f13258..e097c1ca1874 100644
--- a/drivers/infiniband/sw/rxe/Makefile
+++ b/drivers/infiniband/sw/rxe/Makefile
@@ -23,6 +23,7 @@ rdma_rxe-y := \
rxe_task.o \
rxe_net.o \
rxe_hw_counters.o \
+ rxe_mad.o \
rxe_ns.o
rdma_rxe-$(CONFIG_INFINIBAND_ON_DEMAND_PAGING) += rxe_odp.o
diff --git a/drivers/infiniband/sw/rxe/rxe_loc.h b/drivers/infiniband/sw/rxe/rxe_loc.h
index e095c12699cb..64d636bf80fd 100644
--- a/drivers/infiniband/sw/rxe/rxe_loc.h
+++ b/drivers/infiniband/sw/rxe/rxe_loc.h
@@ -242,4 +242,10 @@ static inline int rxe_ib_advise_mr(struct ib_pd *pd,
#endif /* CONFIG_INFINIBAND_ON_DEMAND_PAGING */
+/* rxe-mad.c */
+int rxe_process_mad(struct ib_device *ibdev, int mad_flags, u32 port_num,
+ const struct ib_wc *in_wc, const struct ib_grh *in_grh,
+ const struct ib_mad *in, struct ib_mad *out,
+ size_t *out_mad_size, u16 *out_mad_pkey_index);
+
#endif /* RXE_LOC_H */
diff --git a/drivers/infiniband/sw/rxe/rxe_mad.c b/drivers/infiniband/sw/rxe/rxe_mad.c
new file mode 100644
index 000000000000..d54ee49e225e
--- /dev/null
+++ b/drivers/infiniband/sw/rxe/rxe_mad.c
@@ -0,0 +1,101 @@
+// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
+/*
+ * Copyright (c) 2026 zhenwei pi <zhenwei.pi@linux.dev>
+ */
+
+#include <rdma/ib_pma.h>
+#include "rxe.h"
+#include "rxe_hw_counters.h"
+
+static int rxe_get_pma_info(struct ib_mad *out)
+{
+ struct ib_class_port_info cpi = {};
+
+ cpi.capability_mask = IB_PMA_CLASS_CAP_EXT_WIDTH;
+ memcpy((out->data + 40), &cpi, sizeof(cpi));
+
+ return IB_MAD_RESULT_SUCCESS | IB_MAD_RESULT_REPLY;
+}
+
+static int rxe_get_pma_counters(struct rxe_dev *rxe, struct ib_mad *out)
+{
+ struct ib_pma_portcounters *pma_cnt = (struct ib_pma_portcounters *)(out->data + 40);
+ s64 val;
+
+ /* IBA release 1.8, 16.1.3.5: During operation, instead of overflowing, they shall stop
+ * at all ones.
+ */
+ val = atomic64_read(&rxe->stats_counters[RXE_CNT_LINK_DOWNED]);
+ if (val > U8_MAX)
+ pma_cnt->link_downed_counter = U8_MAX;
+ else
+ pma_cnt->link_downed_counter = (u8)val;
+
+ return IB_MAD_RESULT_SUCCESS | IB_MAD_RESULT_REPLY;
+}
+
+static int rxe_get_pma_counters_ext(struct rxe_dev *rxe, struct ib_mad *out)
+{
+ struct ib_pma_portcounters_ext *pma_cnt_ext =
+ (struct ib_pma_portcounters_ext *)(out->data + 40);
+ s64 val;
+
+ val = atomic64_read(&rxe->stats_counters[RXE_CNT_SENT_BYTES]);
+ pma_cnt_ext->port_xmit_data = cpu_to_be64(val >> 2);
+
+ val = atomic64_read(&rxe->stats_counters[RXE_CNT_RCVD_BYTES]);
+ pma_cnt_ext->port_rcv_data = cpu_to_be64(val >> 2);
+
+ val = atomic64_read(&rxe->stats_counters[RXE_CNT_SENT_PKTS]);
+ pma_cnt_ext->port_xmit_packets = cpu_to_be64(val);
+
+ val = atomic64_read(&rxe->stats_counters[RXE_CNT_RCVD_PKTS]);
+ pma_cnt_ext->port_rcv_packets = cpu_to_be64(val);
+
+ return IB_MAD_RESULT_SUCCESS | IB_MAD_RESULT_REPLY;
+}
+
+static int rxe_get_perf_mgmt(struct rxe_dev *rxe, const struct ib_mad *in, struct ib_mad *out)
+{
+ switch (in->mad_hdr.attr_id) {
+ case IB_PMA_CLASS_PORT_INFO:
+ return rxe_get_pma_info(out);
+
+ case IB_PMA_PORT_COUNTERS:
+ return rxe_get_pma_counters(rxe, out);
+
+ case IB_PMA_PORT_COUNTERS_EXT:
+ return rxe_get_pma_counters_ext(rxe, out);
+
+ default:
+ out->mad_hdr.status = cpu_to_be16(IB_MGMT_MAD_STATUS_UNSUPPORTED_METHOD_ATTRIB);
+ return IB_MAD_RESULT_SUCCESS;
+ }
+}
+
+int rxe_process_mad(struct ib_device *ibdev, int mad_flags, u32 port_num,
+ const struct ib_wc *in_wc, const struct ib_grh *in_grh,
+ const struct ib_mad *in, struct ib_mad *out,
+ size_t *out_mad_size, u16 *out_mad_pkey_index)
+{
+ struct rxe_dev *rxe = to_rdev(ibdev);
+ u8 mgmt_class = in->mad_hdr.mgmt_class;
+ u8 method = in->mad_hdr.method;
+
+ if (port_num != 1)
+ return IB_MAD_RESULT_FAILURE;
+
+ memset(out, 0, sizeof(*out));
+ switch (mgmt_class) {
+ case IB_MGMT_CLASS_PERF_MGMT:
+ if (method == IB_MGMT_METHOD_GET)
+ return rxe_get_perf_mgmt(rxe, in, out);
+ break;
+
+ default:
+ out->mad_hdr.status = cpu_to_be16(IB_MGMT_MAD_STATUS_UNSUPPORTED_METHOD);
+ return IB_MAD_RESULT_SUCCESS;
+ }
+
+ return IB_MAD_RESULT_SUCCESS | IB_MAD_RESULT_REPLY;
+}
diff --git a/drivers/infiniband/sw/rxe/rxe_verbs.c b/drivers/infiniband/sw/rxe/rxe_verbs.c
index eb17b6086d5e..8edd4dd1f031 100644
--- a/drivers/infiniband/sw/rxe/rxe_verbs.c
+++ b/drivers/infiniband/sw/rxe/rxe_verbs.c
@@ -1496,6 +1496,7 @@ static const struct ib_device_ops rxe_dev_ops = {
.post_recv = rxe_post_recv,
.post_send = rxe_post_send,
.post_srq_recv = rxe_post_srq_recv,
+ .process_mad = rxe_process_mad,
.query_ah = rxe_query_ah,
.query_device = rxe_query_device,
.query_pkey = rxe_query_pkey,
--
2.43.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v7 4/4] selftest/rxe: Add selftests for perf
2026-04-14 6:29 [PATCH v7 0/4] Support PERF MGMT for RXE zhenwei pi
` (2 preceding siblings ...)
2026-04-14 6:29 ` [PATCH v7 3/4] RDMA/rxe: support perf mgmt GET method zhenwei pi
@ 2026-04-14 6:29 ` zhenwei pi
3 siblings, 0 replies; 5+ messages in thread
From: zhenwei pi @ 2026-04-14 6:29 UTC (permalink / raw)
To: linux-kernel, linux-rdma; +Cc: zyjzyj2000, jgg, leon, Zhu Yanjun
From: Zhu Yanjun <yanjun.zhu@linux.dev>
Create a virtual TUN net device with RXE support, then run rping
server and client to invoke networking packets, finally compare both
*port_xmit_data* and *port_rcv_data* of such device.
Signed-off-by: Zhu Yanjun <yanjun.zhu@linux.dev>
---
tools/testing/selftests/rdma/Makefile | 3 +-
.../selftests/rdma/rxe_sent_rcvd_bytes.sh | 75 +++++++++++++++++++
2 files changed, 77 insertions(+), 1 deletion(-)
create mode 100755 tools/testing/selftests/rdma/rxe_sent_rcvd_bytes.sh
diff --git a/tools/testing/selftests/rdma/Makefile b/tools/testing/selftests/rdma/Makefile
index 7dd7cba7a73c..07af7f15c1bf 100644
--- a/tools/testing/selftests/rdma/Makefile
+++ b/tools/testing/selftests/rdma/Makefile
@@ -2,6 +2,7 @@
TEST_PROGS := rxe_rping_between_netns.sh \
rxe_ipv6.sh \
rxe_socket_with_netns.sh \
- rxe_test_NETDEV_UNREGISTER.sh
+ rxe_test_NETDEV_UNREGISTER.sh \
+ rxe_sent_rcvd_bytes.sh
include ../lib.mk
diff --git a/tools/testing/selftests/rdma/rxe_sent_rcvd_bytes.sh b/tools/testing/selftests/rdma/rxe_sent_rcvd_bytes.sh
new file mode 100755
index 000000000000..0e4fbfeebd22
--- /dev/null
+++ b/tools/testing/selftests/rdma/rxe_sent_rcvd_bytes.sh
@@ -0,0 +1,75 @@
+#!/bin/bash
+
+# Configuration
+PORT=4791
+MODS=("tun" "rdma_rxe")
+
+exec > /dev/null
+
+# --- Helper: Cleanup Routine ---
+cleanup() {
+ echo "Cleaning up resources..."
+ rdma link del rxe0 2>/dev/null
+ ip link del tun0 2>/dev/null
+ for m in "${MODS[@]}"; do modprobe -r "$m" 2>/dev/null; done
+}
+
+# Ensure cleanup runs on script exit or interrupt
+trap cleanup EXIT
+
+# --- Phase 1: Environment Check ---
+if [[ $EUID -ne 0 ]]; then
+ echo "Error: This script must be run as root."
+ exit 1
+fi
+
+for m in "${MODS[@]}"; do
+ modprobe "$m" || { echo "Error: Failed to load $m"; exit 1; }
+done
+
+# --- Phase 2: Create Interfaces & RXE Links ---
+echo "Creating tun0 (1.1.1.1) and rxe0..."
+ip tuntap add mode tun tun0
+ip addr add 1.1.1.1/24 dev tun0
+ip link set tun0 up
+rdma link add rxe0 type rxe netdev tun0
+
+# Verify port 4791 is listening
+if ! ss -Huln sport = :$PORT | grep -q ":$PORT"; then
+ echo "Error: UDP port $PORT not found after rxe0 creation"
+ exit 1
+fi
+
+orig_s=`cat /sys/class/infiniband/rxe0/ports/1/counters/port_xmit_data`
+orig_r=`cat /sys/class/infiniband/rxe0/ports/1/counters/port_rcv_data`
+
+rping -s -a 1.1.1.1 -C 3 -v &
+sleep 1
+rping -c -a 1.1.1.1 -C 3 -d -v
+
+new_s=`cat /sys/class/infiniband/rxe0/ports/1/counters/port_xmit_data`
+new_r=`cat /sys/class/infiniband/rxe0/ports/1/counters/port_rcv_data`
+
+echo sent $new_s $orig_s
+echo rcvd $new_r $orig_r
+
+result0=$((new_s - orig_s))
+result1=$((new_r - orig_r))
+
+if [ $result0 != $result1 ]; then
+ echo "Error: sent and rcvd bytes different"
+ echo $result0
+ echo $result1
+ exit 1
+fi
+
+echo "Deleting rxe0..."
+rdma link del rxe0
+
+# Port should now be gone
+if ss -Huln sport = :$PORT | grep -q ":$PORT"; then
+ echo "Error: UDP port $PORT still exists after all links deleted"
+ exit 1
+fi
+
+echo "Test passed successfully."
--
2.43.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
end of thread, other threads:[~2026-04-14 6:30 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-04-14 6:29 [PATCH v7 0/4] Support PERF MGMT for RXE zhenwei pi
2026-04-14 6:29 ` [PATCH v7 1/4] RDMA/rxe: remove rxe_ib_device_get_netdev() and RXE_PORT zhenwei pi
2026-04-14 6:29 ` [PATCH v7 2/4] RDMA/rxe: add SENT/RCVD bytes zhenwei pi
2026-04-14 6:29 ` [PATCH v7 3/4] RDMA/rxe: support perf mgmt GET method zhenwei pi
2026-04-14 6:29 ` [PATCH v7 4/4] selftest/rxe: Add selftests for perf zhenwei pi
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox