Expose CQ moderation to user space
Subsystems (5)
v2 cover Expose CQ moderation to user space
Changelog:v1->v2:
* Replaced word cookie to be CQE in commit messages.
* Added patch to rename ib_modify_cq() to be rdma_set_moderation()v0->v1:
* Dropped comp_mask, there is already attr_mask
* Put CQ moderartion into special struct instead of general struct
* ib_uverbs_ex_modify_cq
------------------------------------------------------------------------------
This patch set exposes CQ moderation. This will allow to moderate number of CQEs needed to create an event. Such change brings performance improvement by reducing pressure on application to receive event per-CQE.
The proposed semantics follows the well-established kernel semantics.
* cq_max_count - defines the number of cookies needed to create an event. * cq_period - defines the timeout between last event and a new one
that will occur even if cq_max_count was not reached
The patches are available in the git repository at:
git.kernel.org/pub/scm/linux/kernel/git/leon/linux-rdma.git tags/rdma-next-2017-11-13
Thanks
---------------------------------------
Leon Romanovsky (1):
RDMA/core: Rename kernel modify_cq to better describe its usage
Yonatan Cohen (6):
IB/uverbs: Allow CQ moderation with modify CQ IB/mlx4: Exposing modify CQ callback to uverbs layer IB/mlx5: Exposing modify CQ callback to uverbs layer IB/uverbs: Add CQ moderation capability to query_device IB/mlx4: Add CQ moderation capability to query_device IB/mlx5: Add CQ moderation capability to query_device
drivers/infiniband/core/uverbs.h | 1 + drivers/infiniband/core/uverbs_cmd.c | 51 ++++++++++++++++++++++++++++ drivers/infiniband/core/uverbs_main.c | 1 + drivers/infiniband/core/verbs.c | 4 +-- drivers/infiniband/hw/mlx4/main.c | 6 ++++ drivers/infiniband/hw/mlx4/mlx4_ib.h | 1 + drivers/infiniband/hw/mlx5/cq.c | 3 ++ drivers/infiniband/hw/mlx5/main.c | 10 +++++- drivers/infiniband/ulp/ipoib/ipoib_ethtool.c | 5 +-- include/linux/mlx4/cq.h | 3 ++ include/linux/mlx5/cq.h | 3 ++ include/rdma/ib_verbs.h | 14 ++++++-- include/uapi/rdma/ib_user_verbs.h | 22 +++++++++++- 13 files changed, 116 insertions(+), 8 deletions(-)
--
2.15.0
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
A message that is not in the archive (sent off-list or not yet received): 20171113085119.1705-1-leon-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org
PATCH v2 1/7 IB/uverbs: Allow CQ moderation with modify CQ
From: Yonatan Cohen <yonatanc-VPRAkNaXOzVWk0Htik3J/[email protected]>
Uverbs support in modify_cq for CQ moderation only.
Gives ability to change cq_max_count and cq_period.
CQ moderation enhance performance by moderating the number of CQEs needed to create an event instead of application having to suffer from event per-CQE.
To achieve CQ moderation the application needs to set cq_max_count and cq_period.cq_max_count - defines the number of CQEs needed to create an event. cq_period - defines the timeout (micro seconds) between last
event and a new one that will occur even if cq_max_count was not satisfied
--- drivers/infiniband/core/uverbs.h | 1 + drivers/infiniband/core/uverbs_cmd.c | 42 +++++++++++++++++++++++++++++++++++ drivers/infiniband/core/uverbs_main.c | 1 + include/rdma/ib_verbs.h | 4 ++++ include/uapi/rdma/ib_user_verbs.h | 15 ++++++++++++- 5 files changed, 62 insertions(+), 1 deletion(-)
drivers/infiniband/core/uverbs.h +1 -0
@@ -306,5 +306,6 @@ IB_UVERBS_DECLARE_EX_CMD(destroy_wq);IB_UVERBS_DECLARE_EX_CMD (create_rwq_ind_table);IB_UVERBS_DECLARE_EX_CMD (destroy_rwq_ind_table);IB_UVERBS_DECLARE_EX_CMD (modify_qp); +IB_UVERBS_DECLARE_EX_CMD (modify_cq);#endif /* UVERBS_H */
drivers/infiniband/core/uverbs_cmd.c +42 -0
45 lines not on this page · raw message
drivers/infiniband/core/uverbs_main.c +1 -0
@@ -128,6 +128,7 @@ static int (*uverbs_ex_cmd_table[])(struct ib_uverbs_file *file, [IB_USER_VERBS_EX_CMD_CREATE_RWQ_IND_TBL] = ib_uverbs_ex_create_rwq_ind_table, [IB_USER_VERBS_EX_CMD_DESTROY_RWQ_IND_TBL] = ib_uverbs_ex_destroy_rwq_ind_table, [IB_USER_VERBS_EX_CMD_MODIFY_QP] = ib_uverbs_ex_modify_qp, + [IB_USER_VERBS_EX_CMD_MODIFY_CQ] = ib_uverbs_ex_modify_cq, };static void ib_uverbs_add_one (struct ib_device *device);
include/rdma/ib_verbs.h +4 -0
@@ -311,6 +311,10 @@ struct ib_cq_init_attr {u32 flags; }; +enum ib_cq_attr_mask { +IB_CQ_MODERATE =1 <<0 , +}; +struct ib_device_attr {u64 fw_ver;__be64 sys_image_guid;
include/uapi/rdma/ib_user_verbs.h +14 -1
@@ -100,7 +100,8 @@ enum {IB_USER_VERBS_EX_CMD_MODIFY_WQ ,IB_USER_VERBS_EX_CMD_DESTROY_WQ ,IB_USER_VERBS_EX_CMD_CREATE_RWQ_IND_TBL , - IB_USER_VERBS_EX_CMD_DESTROY_RWQ_IND_TBL +IB_USER_VERBS_EX_CMD_DESTROY_RWQ_IND_TBL , + IB_USER_VERBS_EX_CMD_MODIFY_CQ };/*
@@ -1150,6 +1151,18 @@ struct ib_uverbs_ex_destroy_rwq_ind_table { __u32 ind_tbl_handle; }; +struct ib_uverbs_cq_moderation { +__u16 cq_count; +__u16 cq_period; +}; + +struct ib_uverbs_ex_modify_cq { +__u32 cq_handle; +__u32 attr_mask; +struct ib_uverbs_cq_moderation attr; +__u32 reserved; +}; +#define IB_DEVICE_NAME_MAX 64#endif /* IB_USER_VERBS_H */
--
2.15.0
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH v2 2/7 IB/mlx4: Exposing modify CQ callback to uverbs layer
In reply to a message not in the archiveFrom: Yonatan Cohen <yonatanc-VPRAkNaXOzVWk0Htik3J/[email protected]>
Exposed mlx4_ib_modify_cq to be called from ib device verb list.
--- drivers/infiniband/hw/mlx4/main.c | 3 +++ drivers/infiniband/hw/mlx4/mlx4_ib.h | 1 + include/linux/mlx4/cq.h | 3 +++ 3 files changed, 7 insertions(+)
drivers/infiniband/hw/mlx4/main.c +3 -0
@@ -2733,6 +2733,9 @@ static void *mlx4_ib_add(struct mlx4_dev *dev) ibdev->ib_dev.get_dev_fw_str = get_fw_ver_str; ibdev->ib_dev.disassociate_ucontext = mlx4_ib_disassociate_ucontext; + ibdev->ib_dev.uverbs_ex_cmd_mask |= + (1ull <<IB_USER_VERBS_EX_CMD_MODIFY_CQ ); + if ((dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_RSS) && ((mlx4_ib_port_link_layer(&ibdev->ib_dev, 1) == IB_LINK_LAYER_ETHERNET) ||
drivers/infiniband/hw/mlx4/mlx4_ib.h +1 -0
@@ -47,6 +47,7 @@#include <linux/mlx4/device.h> #include <linux/mlx4/doorbell.h> #include <linux/mlx4/qp.h> +#include <linux/mlx4/cq.h> #define MLX4_IB_DRV_NAME "mlx4_ib"
include/linux/mlx4/cq.h +3 -0
@@ -136,6 +136,9 @@ enum { MLX4_CQE_BAD_FCS = 1 << 4, }; +#define MLX4_MAX_CQ_PERIOD (BIT(16) - 1) +#define MLX4_MAX_CQ_COUNT (BIT(16) - 1) +static inline void mlx4_cq_arm (struct mlx4_cq *cq,u32 cmd,void __iomem *uar_page,spinlock_t *doorbell_lock)
--
2.15.0
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH v2 3/7 IB/mlx5: Exposing modify CQ callback to uverbs layer
In reply to a message not in the archiveFrom: Yonatan Cohen <yonatanc-VPRAkNaXOzVWk0Htik3J/[email protected]>
Exposed mlx5_ib_modify_cq to be called from ib device verb list.
--- drivers/infiniband/hw/mlx5/cq.c | 3 +++ drivers/infiniband/hw/mlx5/main.c | 3 ++- include/linux/mlx5/cq.h | 3 +++ 3 files changed, 8 insertions(+), 1 deletion(-)
drivers/infiniband/hw/mlx5/cq.c +3 -0
@@ -1149,6 +1149,9 @@ int mlx5_ib_modify_cq(struct ib_cq *cq, u16 cq_count, u16 cq_period)if (!MLX5_CAP_GEN (dev->mdev, cq_moderation))return -ENOSYS ; +if (cq_period >MLX5_MAX_CQ_PERIOD ) +return -EINVAL ; + err =mlx5_core_modify_cq_moderation (dev->mdev, &mcq->mcq, cq_period, cq_count);if (err)
drivers/infiniband/hw/mlx5/main.c +2 -1
@@ -4020,7 +4020,8 @@ static void *mlx5_ib_add(struct mlx5_core_dev *mdev) (1ull <<IB_USER_VERBS_EX_CMD_QUERY_DEVICE ) | (1ull <<IB_USER_VERBS_EX_CMD_CREATE_CQ ) | (1ull <<IB_USER_VERBS_EX_CMD_CREATE_QP ) | - (1ull <<IB_USER_VERBS_EX_CMD_MODIFY_QP ); + (1ull <<IB_USER_VERBS_EX_CMD_MODIFY_QP ) | + (1ull <<IB_USER_VERBS_EX_CMD_MODIFY_CQ ); dev->ib_dev.query_device = mlx5_ib_query_device; dev->ib_dev.query_port = mlx5_ib_query_port;
include/linux/mlx5/cq.h +3 -0
@@ -128,6 +128,9 @@ enum { CQE_SIZE_128_PAD = 2, }; +#define MLX5_MAX_CQ_PERIOD (BIT(__mlx5_bit_sz(cqc, cq_period)) - 1) +#define MLX5_MAX_CQ_COUNT (BIT(__mlx5_bit_sz(cqc, cq_max_count)) - 1) +static inline int cqe_sz_to_mlx_sz (u8 size,int padding_128_en) { return padding_128_en ? CQE_SIZE_128_PAD :
--
2.15.0
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH v2 4/7 IB/uverbs: Add CQ moderation capability to query_device
In reply to a message not in the archiveFrom: Yonatan Cohen <yonatanc-VPRAkNaXOzVWk0Htik3J/[email protected]>
The query_device function can now obtain the maximum values for cq_max_count and cq_period, needed for CQ moderation. cq_max_count is a 16 bits number that determines the number of CQEs to accumulate before generating an event. cq_period is a 16 bits number that determines the timeout in micro seconds from the last event generated, upon which a new event will be generated even if cq_max_count was not reached.
--- drivers/infiniband/core/uverbs_cmd.c | 9 +++++++++ include/rdma/ib_verbs.h | 6 ++++++ include/uapi/rdma/ib_user_verbs.h | 7 +++++++ 3 files changed, 22 insertions(+)
drivers/infiniband/core/uverbs_cmd.c +9 -0
@@ -3852,6 +3852,15 @@ int ib_uverbs_ex_query_device(struct ib_uverbs_file *file, resp.tm_caps.max_sge = attr.tm_caps.max_sge; resp.tm_caps.flags = attr.tm_caps.flags; resp.response_length +=sizeof (resp.tm_caps); + +if (ucore->outlen < resp.response_length +sizeof (resp.cq_moderation_caps)) + goto end; + + resp.cq_moderation_caps.max_cq_moderation_count = + attr.cq_caps.max_cq_moderation_count; + resp.cq_moderation_caps.max_cq_moderation_period = + attr.cq_caps.max_cq_moderation_period; + resp.response_length +=sizeof (resp.cq_moderation_caps); end: err =ib_copy_to_udata (ucore, &resp, resp.response_length);return err;
include/rdma/ib_verbs.h +6 -0
@@ -315,6 +315,11 @@ enum ib_cq_attr_mask { IB_CQ_MODERATE = 1 << 0, }; +struct ib_cq_caps { +u16 max_cq_moderation_count; +u16 max_cq_moderation_period; +}; +struct ib_device_attr {u64 fw_ver;__be64 sys_image_guid;
@@ -365,6 +370,7 @@ struct ib_device_attr {u32 max_wq_type_rq;u32 raw_packet_caps;/* Use ib_raw_packet_caps enum */ struct ib_tm_caps tm_caps; +struct ib_cq_caps cq_caps; };enum ib_mtu {
include/uapi/rdma/ib_user_verbs.h +7 -0
@@ -125,6 +125,12 @@ struct ib_uverbs_comp_event_desc {__u64 cq_handle; }; +struct ib_uverbs_cq_moderation_caps { +__u16 max_cq_moderation_count; +__u16 max_cq_moderation_period; +__u32 reserved; +}; +/* * All commands from userspace should start with a __u32 command field * followed by __u16 in_words and out_words fields (which give the
@@ -263,6 +269,7 @@ struct ib_uverbs_ex_query_device_resp {__u32 max_wq_type_rq;__u32 raw_packet_caps;struct ib_uverbs_tm_caps tm_caps; +struct ib_uverbs_cq_moderation_caps cq_moderation_caps; };struct ib_uverbs_query_port {
--
2.15.0
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH v2 5/7 IB/mlx4: Add CQ moderation capability to query_device
In reply to a message not in the archiveFrom: Yonatan Cohen <yonatanc-VPRAkNaXOzVWk0Htik3J/[email protected]>
query_device can now obtain the maximum values for cq_max_count and cq_period, needed for cq moderation.
--- drivers/infiniband/hw/mlx4/main.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/infiniband/hw/mlx4/main.c +3 -0
@@ -563,6 +563,9 @@ static int mlx4_ib_query_device(struct ib_device *ibdev, props->max_wq_type_rq = props->max_qp; } + props->cq_caps.max_cq_moderation_count =MLX4_MAX_CQ_COUNT ; + props->cq_caps.max_cq_moderation_period =MLX4_MAX_CQ_PERIOD ; +if (!mlx4_is_slave (dev->dev)) err =mlx4_get_internal_clock_params (dev->dev, &clock_params);
--
2.15.0
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH v2 6/7 IB/mlx5: Add CQ moderation capability to query_device
In reply to a message not in the archiveFrom: Yonatan Cohen <yonatanc-VPRAkNaXOzVWk0Htik3J/[email protected]>
query_device can now obtain the maximum values for cq_max_count and cq_period, needed for cq moderation.
--- drivers/infiniband/hw/mlx5/main.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/infiniband/hw/mlx5/main.c +7 -0
@@ -790,6 +790,13 @@ static int mlx5_ib_query_device(struct ib_device *ibdev, props->tm_caps.max_sge =MLX5_TM_MAX_SGE ; } +if (MLX5_CAP_GEN (dev->mdev, cq_moderation)) { + props->cq_caps.max_cq_moderation_count = +MLX5_MAX_CQ_COUNT ; + props->cq_caps.max_cq_moderation_period = +MLX5_MAX_CQ_PERIOD ; + } +if (field_avail (typeof (resp), cqe_comp_caps, uhw->outlen)) { resp.cqe_comp_caps.max_num = MLX5_CAP_GEN(dev->mdev, cqe_compression) ?
--
2.15.0
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH v2 7/7 RDMA/core: Rename kernel modify_cq to better describe its usage
In reply to a message not in the archiveFrom: Leon Romanovsky <leonro-VPRAkNaXOzVWk0Htik3J/[email protected]>
Current ib_modify_cq() is used to set CQ moderation parameters.
This patch renames ib_modify_cq() to be rdma_set_cq_moderation(), because the kernel version of RDMA API doesn't need to follow already exposed to user's API pattern (create_XXX/modify_XXX/query_XXX/destroy_XXX) and better to have more accurate name which describes the actual usage.
--- drivers/infiniband/core/uverbs_cmd.c | 2 +- drivers/infiniband/core/verbs.c | 4 ++-- drivers/infiniband/ulp/ipoib/ipoib_ethtool.c | 5 +++-- include/rdma/ib_verbs.h | 4 ++-- 4 files changed, 8 insertions(+), 7 deletions(-)
drivers/infiniband/core/uverbs_cmd.c +1 -1
@@ -3901,7 +3901,7 @@ int ib_uverbs_ex_modify_cq(struct ib_uverbs_file *file,if (!cq)return -EINVAL ; - ret =ib_modify_cq (cq, cmd.attr.cq_count, cmd.attr.cq_period); + ret =rdma_set_cq_moderation (cq, cmd.attr.cq_count, cmd.attr.cq_period);uobj_put_obj_read (cq);
drivers/infiniband/core/verbs.c +2 -2
@@ -1550,12 +1550,12 @@ struct ib_cq *ib_create_cq(struct ib_device *device, }EXPORT_SYMBOL (ib_create_cq); -int ib_modify_cq (struct ib_cq *cq,u16 cq_count,u16 cq_period) +int rdma_set_cq_moderation (struct ib_cq *cq,u16 cq_count,u16 cq_period) {return cq->device->modify_cq ? cq->device->modify_cq (cq, cq_count, cq_period) : -ENOSYS ; } -EXPORT_SYMBOL (ib_modify_cq); +EXPORT_SYMBOL (rdma_set_cq_moderation);int ib_destroy_cq (struct ib_cq *cq) {
drivers/infiniband/ulp/ipoib/ipoib_ethtool.c +3 -2
@@ -99,8 +99,9 @@ static int ipoib_set_coalesce(struct net_device *dev, coal->rx_max_coalesced_frames > 0xffff)return -EINVAL ; - ret =ib_modify_cq (priv->recv_cq, coal->rx_max_coalesced_frames, - coal->rx_coalesce_usecs); + ret =rdma_set_cq_moderation (priv->recv_cq, + coal->rx_max_coalesced_frames, + coal->rx_coalesce_usecs);if (ret && ret != -ENOSYS ) {ipoib_warn (priv,"failed modifying CQ (%d)\n" , ret);return ret;
include/rdma/ib_verbs.h +2 -2
@@ -3169,13 +3169,13 @@ struct ib_cq *ib_create_cq(struct ib_device *device,int ib_resize_cq (struct ib_cq *cq,int cqe);/** -* ib_modify_cq - Modifies moderation params of the CQ +* rdma_set_cq_moderation - Modifies moderation params of the CQ * @cq: The CQ to modify. * @cq_count: number of CQEs that will trigger an event * @cq_period: max period of time in usec before triggering an event * */ -int ib_modify_cq (struct ib_cq *cq,u16 cq_count,u16 cq_period); +int rdma_set_cq_moderation (struct ib_cq *cq,u16 cq_count,u16 cq_period);/** * ib_destroy_cq - Destroys the specified CQ.
--
2.15.0
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Doug Ledford
AppliedQuoted 18 lines · Leon Romanovsky
Changelog:
v1->v2:
* Replaced word cookie to be CQE in commit messages.
* Added patch to renameib_modify_cq()to berdma_set_moderation()v0->v1:
* Droppedcomp_mask, there is alreadyattr_mask
* Put CQ moderartion into special struct instead of general struct
*ib_uverbs_ex_modify_cq------------------------------------------------------------------------------
This patch set exposes CQ moderation. This will allow to moderate number of CQEs needed to create an event. Such change brings performance improvement by reducing pressure on application to receive event per-CQE.The proposed semantics follows the well-established kernel semantics.
*cq_max_count- defines the number of cookies needed to create an event. *cq_period- defines the timeout between last event and a new one
that will occur even ifcq_max_countwas not reached
Quoted 5 lines
The patches are available in the git repository at:
git.kernel.org/pub/scm/linux/kernel/git/leon/linux-rdma.git tags/rdma-next-2017-11-13Thanks
---------------------------------------
Thanks, applied.
Signature · 3 lines
Doug Ledford <[email protected]> GPG KeyID: B826A3330E572FDD Key fingerprint = AE6B 1BDA 122B 23B4 265B 1274 B826 A333 0E57 2FDD