[PATCH 02/14] examples/vhost_user_rdma: implement device and port query commands
From: Xiong Weimin <hidden>
Date: 2025-12-17 08:51:30
Also in:
lkml
Subsystem:
the rest · Maintainer:
Linus Torvalds
From: xiongweimin <redacted> Added RDMA control command handlers for: - VHOST_RDMA_CTRL_ROCE_QUERY_DEVICE - VHOST_RDMA_CTRL_ROCE_QUERY_PORT Key features: 1. Device capability reporting: - Maximum MR size and page size capabilities - Queue Pair (QP) limits (max WR, SGE, CQE) - Resource limits (MR, PD, AH counts) - RDMA protocol capabilities 2. Port attribute reporting: - GID table length and port state - MTU settings (active, physical, maximum) - Link speed and width capabilities - Error counters and security attributes 3. Response validation: - CHK_IOVEC macro ensures response buffer safety - Fixed attribute values for standard RDMA v2 compliance - Structured response formats matching IB specification Signed-off-by: Xiong Weimin <redacted> Change-Id: I17ac65a0801ebf5e0b0d83a50877004a54840365 --- examples/vhost_user_rdma/vhost_rdma_ib.c | 27 ++++++++++++ examples/vhost_user_rdma/vhost_rdma_ib.h | 56 +++++++++++++++++++++++- 2 files changed, 82 insertions(+), 1 deletion(-)
diff --git a/examples/vhost_user_rdma/vhost_rdma_ib.c b/examples/vhost_user_rdma/vhost_rdma_ib.c
index 5535a8696b..edb6e3fea3 100644
--- a/examples/vhost_user_rdma/vhost_rdma_ib.c
+++ b/examples/vhost_user_rdma/vhost_rdma_ib.c@@ -537,12 +537,39 @@ vhost_rdma_query_device(struct vhost_rdma_device *dev, CTRL_NO_CMD, return 0; } +static int +vhost_rdma_query_port(__rte_unused struct vhost_rdma_device *dev, + CTRL_NO_CMD, + struct iovec *out) +{ + struct vhost_rdma_ack_query_port *rsp; + + CHK_IOVEC(rsp, out); + + rsp->gid_tbl_len = VHOST_MAX_GID_TBL_LEN; + rsp->max_msg_sz = 0x800000; + rsp->active_mtu = VHOST_RDMA_IB_MTU_256; + rsp->phys_mtu = VHOST_RDMA_IB_MTU_256; + rsp->port_cap_flags = 65536UL; + rsp->bad_pkey_cntr = 0UL; + rsp->phys_state = VHOST_RDMA_IB_PORT_PHYS_STATE_POLLING; + rsp->pkey_tbl_len = 1UL; + rsp->qkey_viol_cntr = 0UL; + rsp->state = VHOST_RDMA_IB_PORT_DOWN; + rsp->active_speed = 1UL; + rsp->active_width = VHOST_RDMA_IB_WIDTH_1X; + rsp->max_mtu = VHOST_RDMA_IB_MTU_4096; + + return 0; +} + /* Command handler table declaration */ struct { int (*handler)(struct vhost_rdma_device *dev, struct iovec *in, struct iovec *out); const char *name; /* Name of the command (for logging) */ } cmd_tbl[] = { DEFINE_VIRTIO_RDMA_CMD(VHOST_RDMA_CTRL_ROCE_QUERY_DEVICE, vhost_rdma_query_device), + DEFINE_VIRTIO_RDMA_CMD(VHOST_RDMA_CTRL_ROCE_QUERY_PORT, vhost_rdma_query_port), }; /**
diff --git a/examples/vhost_user_rdma/vhost_rdma_ib.h b/examples/vhost_user_rdma/vhost_rdma_ib.h
index 4ac896d82e..664067b024 100644
--- a/examples/vhost_user_rdma/vhost_rdma_ib.h
+++ b/examples/vhost_user_rdma/vhost_rdma_ib.h@@ -204,7 +204,44 @@ enum vhost_user_rdma_request { VHOST_USER_SET_CONFIG = 25, VHOST_USER_MAX }; -/** @} */ + +enum vhost_rdma_ib_port_state { + VHOST_RDMA_IB_PORT_NOP = 0, + VHOST_RDMA_IB_PORT_DOWN = 1, + VHOST_RDMA_IB_PORT_INIT = 2, + VHOST_RDMA_IB_PORT_ARMED = 3, + VHOST_RDMA_IB_PORT_ACTIVE = 4, + VHOST_RDMA_IB_PORT_ACTIVE_DEFER = 5 +}; + +enum vhost_rdma_ib_port_phys_state { + VHOST_RDMA_IB_PORT_PHYS_STATE_SLEEP = 1, + VHOST_RDMA_IB_PORT_PHYS_STATE_POLLING = 2, + VHOST_RDMA_IB_PORT_PHYS_STATE_DISABLED = 3, + VHOST_RDMA_IB_PORT_PHYS_STATE_PORT_CONFIGURATION_TRAINING = 4, + VHOST_RDMA_IB_PORT_PHYS_STATE_LINK_UP = 5, + VHOST_RDMA_IB_PORT_PHYS_STATE_LINK_ERROR_RECOVERY = 6, + VHOST_RDMA_IB_PORT_PHYS_STATE_PHY_TEST = 7, +}; + +enum ib_port_width { + VHOST_RDMA_IB_WIDTH_1X = 1, + VHOST_RDMA_IB_WIDTH_2X = 16, + VHOST_RDMA_IB_WIDTH_4X = 2, + VHOST_RDMA_IB_WIDTH_8X = 4, + VHOST_RDMA_IB_WIDTH_12X = 8 +}; + +enum ib_port_speed { + VHOST_RDMA_IB_SPEED_SDR = 1, + VHOST_RDMA_IB_SPEED_DDR = 2, + VHOST_RDMA_IB_SPEED_QDR = 4, + VHOST_RDMA_IB_SPEED_FDR10 = 8, + VHOST_RDMA_IB_SPEED_FDR = 16, + VHOST_RDMA_IB_SPEED_EDR = 32, + VHOST_RDMA_IB_SPEED_HDR = 64, + VHOST_RDMA_IB_SPEED_NDR = 128, +}; /** * @brief QP capabilities structure
@@ -622,6 +659,23 @@ struct vhost_rdma_ctrl_hdr { uint8_t cmd; }; +struct vhost_rdma_ack_query_port { + enum vhost_rdma_ib_port_state state; + enum vhost_rdma_ib_mtu max_mtu; + enum vhost_rdma_ib_mtu active_mtu; + uint32_t phys_mtu; + int gid_tbl_len; + uint32_t port_cap_flags; + uint32_t max_msg_sz; + uint32_t bad_pkey_cntr; + uint32_t qkey_viol_cntr; + uint16_t pkey_tbl_len; + uint16_t active_speed; + uint8_t active_width; + uint8_t phys_state; + uint32_t reserved[32]; /* For future extensions */ +}__rte_packed; + /** * @brief Convert IB MTU enum to byte size * @param mtu The MTU enum value
--
2.43.0