diff --git a/debian/ibverbs-providers.symbols b/debian/ibverbs-providers.symbols index 256d80fe2..1777e18b9 100644 --- a/debian/ibverbs-providers.symbols +++ b/debian/ibverbs-providers.symbols @@ -189,8 +189,10 @@ libhns.so.1 ibverbs-providers #MINVER# libmana.so.1 ibverbs-providers #MINVER# * Build-Depends-Package: libibverbs-dev MANA_1.0@MANA_1.0 41 + MANA_1.1@MANA_1.1 62 manadv_init_obj@MANA_1.0 41 manadv_set_context_attr@MANA_1.0 41 + manadv_alloc_pd@MANA_1.1 62 libionic.so.1 ibverbs-providers #MINVER# * Build-Depends-Package: libibverbs-dev IONIC_1.0@IONIC_1.0 59 diff --git a/kernel-headers/rdma/bnxt_re-abi.h b/kernel-headers/rdma/bnxt_re-abi.h index faa9d62b3..f24edf1c7 100644 --- a/kernel-headers/rdma/bnxt_re-abi.h +++ b/kernel-headers/rdma/bnxt_re-abi.h @@ -56,6 +56,7 @@ enum { BNXT_RE_UCNTX_CMASK_DBR_PACING_ENABLED = 0x08ULL, BNXT_RE_UCNTX_CMASK_POW2_DISABLED = 0x10ULL, BNXT_RE_UCNTX_CMASK_MSN_TABLE_ENABLED = 0x40, + BNXT_RE_UCNTX_CMASK_QP_RATE_LIMIT_ENABLED = 0x80ULL, }; enum bnxt_re_wqe_mode { @@ -215,4 +216,19 @@ enum bnxt_re_toggle_mem_methods { BNXT_RE_METHOD_GET_TOGGLE_MEM = (1U << UVERBS_ID_NS_SHIFT), BNXT_RE_METHOD_RELEASE_TOGGLE_MEM, }; + +struct bnxt_re_packet_pacing_caps { + __u32 qp_rate_limit_min; + __u32 qp_rate_limit_max; /* In kbps */ + /* Corresponding bit will be set if qp type from + * 'enum ib_qp_type' is supported, e.g. + * supported_qpts |= 1 << IB_QPT_RC + */ + __u32 supported_qpts; + __u32 reserved; +}; + +struct bnxt_re_query_device_ex_resp { + struct bnxt_re_packet_pacing_caps packet_pacing_caps; +}; #endif /* __BNXT_RE_UVERBS_ABI_H__*/ diff --git a/kernel-headers/rdma/mana-abi.h b/kernel-headers/rdma/mana-abi.h index 45c2df619..88b24ae50 100644 --- a/kernel-headers/rdma/mana-abi.h +++ b/kernel-headers/rdma/mana-abi.h @@ -17,6 +17,9 @@ #define MANA_IB_UVERBS_ABI_VERSION 1 enum mana_ib_create_cq_flags { + /* Reserved for backward compatibility. Legacy + * kernel versions use it to create CQs in RNIC + */ MANA_IB_CREATE_RNIC_CQ = 1 << 0, }; @@ -84,4 +87,18 @@ struct mana_ib_create_qp_rss_resp { struct rss_resp_entry entries[64]; }; +enum mana_ib_create_pd_flags { + MANA_IB_PD_SHORT_PDN = 1 << 0, +}; + +struct mana_ib_alloc_pd { + __u32 flags; + __u32 reserved; +}; + +struct mana_ib_alloc_pd_resp { + __u32 pdn; + __u32 reserved; +}; + #endif diff --git a/kernel-headers/rdma/mlx4-abi.h b/kernel-headers/rdma/mlx4-abi.h index 1f6848ef1..f74557528 100644 --- a/kernel-headers/rdma/mlx4-abi.h +++ b/kernel-headers/rdma/mlx4-abi.h @@ -143,7 +143,7 @@ enum mlx4_ib_rx_hash_function_flags { }; /* - * RX Hash flags, these flags allow setting which incoming packet's field should + * RX Hash flags, these flags allows to set which incoming packet's field should * participates in RX Hash. Each flag represent certain packet's field, * when the flag is set the field that is represented by the flag will * participate in RX Hash calculation. diff --git a/kernel-headers/rdma/mlx5-abi.h b/kernel-headers/rdma/mlx5-abi.h index a6d060801..8a6ad6c68 100644 --- a/kernel-headers/rdma/mlx5-abi.h +++ b/kernel-headers/rdma/mlx5-abi.h @@ -353,7 +353,7 @@ enum mlx5_rx_hash_function_flags { }; /* - * RX Hash flags, these flags allow setting which incoming packet's field should + * RX Hash flags, these flags allows to set which incoming packet's field should * participates in RX Hash. Each flag represent certain packet's field, * when the flag is set the field that is represented by the flag will * participate in RX Hash calculation. diff --git a/providers/mana/CMakeLists.txt b/providers/mana/CMakeLists.txt index 05011be02..3ae2b02ac 100644 --- a/providers/mana/CMakeLists.txt +++ b/providers/mana/CMakeLists.txt @@ -1,5 +1,5 @@ rdma_shared_provider(mana libmana.map - 1 1.0.${PACKAGE_VERSION} + 1 1.1.${PACKAGE_VERSION} mana.c manadv.c qp.c diff --git a/providers/mana/libmana.map b/providers/mana/libmana.map index ab66295d6..24af016fc 100644 --- a/providers/mana/libmana.map +++ b/providers/mana/libmana.map @@ -6,3 +6,8 @@ MANA_1.0 { manadv_init_obj; local: *; }; + +MANA_1.1 { + global: + manadv_alloc_pd; +} MANA_1.0; diff --git a/providers/mana/man/CMakeLists.txt b/providers/mana/man/CMakeLists.txt index 24f185969..3458443d7 100644 --- a/providers/mana/man/CMakeLists.txt +++ b/providers/mana/man/CMakeLists.txt @@ -2,4 +2,5 @@ rdma_man_pages( manadv.7.md manadv_init_obj.3.md manadv_set_context_attr.3.md + manadv_alloc_pd.3.md ) diff --git a/providers/mana/man/manadv_alloc_pd.3.md b/providers/mana/man/manadv_alloc_pd.3.md new file mode 100644 index 000000000..b121ea23c --- /dev/null +++ b/providers/mana/man/manadv_alloc_pd.3.md @@ -0,0 +1,36 @@ +--- +layout: page +title: manadv_alloc_pd +section: 3 +tagline: Verbs +--- + +# NAME +manadv_alloc_pd \- Create a MANA specific PD for the RDMA device context. + +# SYNOPSIS" +```c +#include + +struct ibv_pd *manadv_alloc_pd(struct ibv_context *context, uint32_t flags); +``` + +# DESCRIPTION +**manadv_alloc_pd()** allocates a PD for the RDMA device context with additional +creation flags. + +# ARGUMENTS +*context* +: RDMA device context to work on. + +*flags* +: A bitwise OR of the various values described below. + + MANADV_PD_FLAGS_SHORT_PDN: + allocates a PD with 16 bit PDN. + +# RETURN VALUE +returns a pointer to the allocated PD, or NULL if the request fails. + +# AUTHORS +Konstantin Taranov diff --git a/providers/mana/man/manadv_init_obj.3.md b/providers/mana/man/manadv_init_obj.3.md index 575ea34f7..a4dd7129b 100644 --- a/providers/mana/man/manadv_init_obj.3.md +++ b/providers/mana/man/manadv_init_obj.3.md @@ -48,6 +48,10 @@ struct manadv_rwq { void *db_page; }; +struct manadv_pd { + uint32_t pdn; +}; + struct manadv_obj { struct { struct ibv_qp *in; @@ -63,6 +67,11 @@ struct manadv_obj { struct ibv_wq *in; struct manadv_rwq *out; } rwq; + + struct { + struct ibv_pd *in; + struct manadv_pd *out; + } pd; }; ``` @@ -74,6 +83,7 @@ enum manadv_obj_type { MANADV_OBJ_QP = 1 << 0, MANADV_OBJ_CQ = 1 << 1, MANADV_OBJ_RWQ = 1 << 2, + MANADV_OBJ_PD = 1 << 3, }; ``` # RETURN VALUE diff --git a/providers/mana/mana.c b/providers/mana/mana.c index a8091fa56..c6effd5e4 100644 --- a/providers/mana/mana.c +++ b/providers/mana/mana.c @@ -23,7 +23,8 @@ DECLARE_DRV_CMD(mana_alloc_ucontext, IB_USER_VERBS_CMD_GET_CONTEXT, empty, empty); -DECLARE_DRV_CMD(mana_alloc_pd, IB_USER_VERBS_CMD_ALLOC_PD, empty, empty); +DECLARE_DRV_CMD(mana_alloc_pd, IB_USER_VERBS_CMD_ALLOC_PD, mana_ib_alloc_pd, + mana_ib_alloc_pd_resp); static const struct verbs_match_ent hca_table[] = { VERBS_DRIVER_ID(RDMA_DRIVER_MANA), @@ -111,10 +112,11 @@ int mana_query_port(struct ibv_context *context, uint8_t port, return ibv_cmd_query_port(context, port, attr, &cmd, sizeof(cmd)); } -struct ibv_pd *mana_alloc_pd(struct ibv_context *context) +struct ibv_pd *mana_alloc_pd_ex(struct ibv_context *context, uint32_t flags) { - struct ibv_alloc_pd cmd; - struct mana_alloc_pd_resp resp; + struct mana_alloc_pd_resp resp = {}; + struct mana_ib_alloc_pd *cmd_drv; + struct mana_alloc_pd cmd = {}; struct mana_pd *pd; int ret; @@ -122,7 +124,11 @@ struct ibv_pd *mana_alloc_pd(struct ibv_context *context) if (!pd) return NULL; - ret = ibv_cmd_alloc_pd(context, &pd->ibv_pd, &cmd, sizeof(cmd), + cmd_drv = &cmd.drv_payload; + cmd_drv->flags = flags; + resp.pdn = UINT32_MAX; + + ret = ibv_cmd_alloc_pd(context, &pd->ibv_pd, &cmd.ibv_cmd, sizeof(cmd), &resp.ibv_resp, sizeof(resp)); if (ret) { verbs_err(verbs_get_ctx(context), "Failed to allocate PD\n"); @@ -131,9 +137,16 @@ struct ibv_pd *mana_alloc_pd(struct ibv_context *context) return NULL; } + pd->pdn = resp.pdn; + return &pd->ibv_pd; } +static struct ibv_pd *mana_alloc_pd(struct ibv_context *context) +{ + return mana_alloc_pd_ex(context, 0); +} + struct ibv_pd * mana_alloc_parent_domain(struct ibv_context *context, struct ibv_parent_domain_init_attr *attr) diff --git a/providers/mana/mana.h b/providers/mana/mana.h index 6f4e74216..7b14fe6e8 100644 --- a/providers/mana/mana.h +++ b/providers/mana/mana.h @@ -172,6 +172,7 @@ struct mana_device { struct mana_pd { struct ibv_pd ibv_pd; + uint32_t pdn; struct mana_pd *mprotection_domain; }; @@ -192,7 +193,7 @@ int mana_query_device_ex(struct ibv_context *context, int mana_query_port(struct ibv_context *context, uint8_t port, struct ibv_port_attr *attr); -struct ibv_pd *mana_alloc_pd(struct ibv_context *context); +struct ibv_pd *mana_alloc_pd_ex(struct ibv_context *context, uint32_t flags); struct ibv_pd * mana_alloc_parent_domain(struct ibv_context *context, struct ibv_parent_domain_init_attr *attr); diff --git a/providers/mana/manadv.c b/providers/mana/manadv.c index 4b40d05bb..2392adf49 100644 --- a/providers/mana/manadv.c +++ b/providers/mana/manadv.c @@ -42,7 +42,7 @@ int manadv_set_context_attr(struct ibv_context *ibv_ctx, int manadv_init_obj(struct manadv_obj *obj, uint64_t obj_type) { - if (obj_type & ~(MANADV_OBJ_QP | MANADV_OBJ_CQ | MANADV_OBJ_RWQ)) + if (obj_type & ~(MANADV_OBJ_QP | MANADV_OBJ_CQ | MANADV_OBJ_RWQ | MANADV_OBJ_PD)) return EINVAL; if (obj_type & MANADV_OBJ_QP) { @@ -84,5 +84,17 @@ int manadv_init_obj(struct manadv_obj *obj, uint64_t obj_type) obj->rwq.out->db_page = ctx->db_page; } + if (obj_type & MANADV_OBJ_PD) { + struct ibv_pd *ibpd = obj->pd.in; + struct mana_pd *pd = container_of(ibpd, struct mana_pd, ibv_pd); + + obj->pd.out->pdn = pd->pdn; + } + return 0; } + +struct ibv_pd *manadv_alloc_pd(struct ibv_context *context, uint32_t flags) +{ + return mana_alloc_pd_ex(context, flags); +} diff --git a/providers/mana/manadv.h b/providers/mana/manadv.h index 27c8fe939..87f6e8f52 100644 --- a/providers/mana/manadv.h +++ b/providers/mana/manadv.h @@ -52,6 +52,10 @@ struct manadv_rwq { void *db_page; }; +struct manadv_pd { + uint32_t pdn; +}; + struct manadv_obj { struct { struct ibv_qp *in; @@ -67,16 +71,27 @@ struct manadv_obj { struct ibv_wq *in; struct manadv_rwq *out; } rwq; + struct { + struct ibv_pd *in; + struct manadv_pd *out; + } pd; }; enum manadv_obj_type { MANADV_OBJ_QP = 1 << 0, MANADV_OBJ_CQ = 1 << 1, MANADV_OBJ_RWQ = 1 << 2, + MANADV_OBJ_PD = 1 << 3, +}; + +enum { + MANADV_PD_FLAGS_SHORT_PDN = 1 << 0, }; int manadv_init_obj(struct manadv_obj *obj, uint64_t obj_type); +struct ibv_pd *manadv_alloc_pd(struct ibv_context *context, uint32_t flags); + #ifdef __cplusplus } #endif