[PATCH 04/14] examples/vhost_user_rdma: implement protection domain create/destroy 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 core functionality for managing RDMA Protection Domains (PDs): 1. CREATE_PD command for resource allocation and initialization 2. DESTROY_PD command with reference-counted teardown 3. Integration with device-specific PD resource pool 4. Minimalist state management for security domains 5. Robust input validation and error handling Key features: - PD identifier (pdn) generation and return to guest - Atomic reference counting for lifecycle management - Device association for resource tracking - Memory-safe buffer handling with CHK_IOVEC - ENOMEM handling for allocation failures Signed-off-by: Xiong Weimin<redacted> Change-Id: I36d841a76067813c1880069c71b2eba90337609b --- examples/vhost_user_rdma/vhost_rdma_ib.c | 38 ++++++++++++++++++++++++ examples/vhost_user_rdma/vhost_rdma_ib.h | 30 +++++++++---------- 2 files changed, 53 insertions(+), 15 deletions(-)
diff --git a/examples/vhost_user_rdma/vhost_rdma_ib.c b/examples/vhost_user_rdma/vhost_rdma_ib.c
index 5ec0de8ae7..e590b555d3 100644
--- a/examples/vhost_user_rdma/vhost_rdma_ib.c
+++ b/examples/vhost_user_rdma/vhost_rdma_ib.c@@ -616,6 +616,42 @@ vhost_rdma_destroy_cq(struct vhost_rdma_device *dev, struct iovec *in, CTRL_NO_R return 0; } +static int +vhost_rdma_create_pd(struct vhost_rdma_device *dev, CTRL_NO_CMD, struct iovec *out) +{ + struct vhost_rdma_ack_create_pd *create_rsp; + struct vhost_rdma_pd *pd; + uint32_t idx; + + CHK_IOVEC(create_rsp, out); + + pd = vhost_rdma_pool_alloc(&dev->pd_pool, &idx); + if(pd == NULL) { + return -ENOMEM; + } + vhost_rdma_ref_init(pd); + + pd->dev = dev; + pd->pdn = idx; + create_rsp->pdn = idx; + + return 0; +} + +static int +vhost_rdma_destroy_pd(struct vhost_rdma_device *dev, struct iovec *in, CTRL_NO_RSP) +{ + struct vhost_rdma_cmd_destroy_pd *create_cmd; + struct vhost_rdma_pd *pd; + + CHK_IOVEC(create_cmd, in); + + pd = vhost_rdma_pool_get(&dev->pd_pool, create_cmd->pdn); + vhost_rdma_drop_ref(pd, dev, pd); + + return 0; +} + /* Command handler table declaration */ struct { int (*handler)(struct vhost_rdma_device *dev, struct iovec *in, struct iovec *out);
@@ -625,6 +661,8 @@ struct { DEFINE_VIRTIO_RDMA_CMD(VHOST_RDMA_CTRL_ROCE_QUERY_PORT, vhost_rdma_query_port), DEFINE_VIRTIO_RDMA_CMD(VHOST_RDMA_CTRL_ROCE_CREATE_CQ, vhost_rdma_create_cq), DEFINE_VIRTIO_RDMA_CMD(VHOST_RDMA_CTRL_ROCE_DESTROY_CQ, vhost_rdma_destroy_cq), + DEFINE_VIRTIO_RDMA_CMD(VHOST_RDMA_CTRL_ROCE_CREATE_PD, vhost_rdma_create_pd), + DEFINE_VIRTIO_RDMA_CMD(VHOST_RDMA_CTRL_ROCE_DESTROY_PD, vhost_rdma_destroy_pd), }; /**
diff --git a/examples/vhost_user_rdma/vhost_rdma_ib.h b/examples/vhost_user_rdma/vhost_rdma_ib.h
index 6420c8c7e2..6356abc65a 100644
--- a/examples/vhost_user_rdma/vhost_rdma_ib.h
+++ b/examples/vhost_user_rdma/vhost_rdma_ib.h@@ -667,44 +667,44 @@ struct vhost_rdma_ctrl_hdr { 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; + enum vhost_rdma_ib_mtu max_mtu; + enum vhost_rdma_ib_mtu active_mtu; uint32_t phys_mtu; - int gid_tbl_len; + 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; + uint8_t active_width; + uint8_t phys_state; uint32_t reserved[32]; /* For future extensions */ }__rte_packed; struct vhost_rdma_cmd_create_cq { - /* Size of CQ */ - uint32_t cqe; + /* Size of CQ */ + uint32_t cqe; }; struct vhost_rdma_ack_create_cq { - /* The index of CQ */ - uint32_t cqn; + /* The index of CQ */ + uint32_t cqn; }; struct vhost_rdma_cmd_destroy_cq { - /* The index of CQ */ - uint32_t cqn; + /* The index of CQ */ + uint32_t cqn; }; struct vhost_rdma_ack_create_pd { - /* The handle of PD */ - uint32_t pdn; + /* The handle of PD */ + uint32_t pdn; }; struct vhost_rdma_cmd_destroy_pd { - /* The handle of PD */ - uint32_t pdn; + /* The handle of PD */ + uint32_t pdn; }; /**
--
2.43.0