History

RDMA/core: Add Completion Counters support

Add core infrastructure for Completion Counters, a light-weight alternative to polling CQ for tracking operation completions. Define the UVERBS_OBJECT_COMP_CNTR ioctl object with create, destroy, modify and read methods for both success and error counters. Add a QP attach method on the QP object to associate a completion counter with a queue pair. Add ib_comp_cntr struct, ib_comp_cntr_attach_attr, device ops, and DECLARE_RDMA_OBJ_SIZE for driver object allocation. Only userspace Completion Counters are supported at this stage.

Michael Margolin committed 3 months ago

Commit b3818ea1 parent 8b90e709 files · +310 −1Browse files

Unified · Split

9 files
  1. drivers/infiniband/core/Makefile +1 −0
  2. drivers/infiniband/core/device.c +6 −0
  3. drivers/infiniband/core/rdma_core.h +1 −0
  4. drivers/infiniband/core/uverbs_std_types_comp_cntr.c +159 −0
  5. drivers/infiniband/core/uverbs_std_types_qp.c +50 −1
  6. drivers/infiniband/core/uverbs_uapi.c +1 −0
  7. include/rdma/ib_verbs.h +37 −0
  8. include/uapi/rdma/ib_user_ioctl_cmds.h +36 −0
  9. include/uapi/rdma/ib_user_ioctl_verbs.h +19 −0
drivers/infiniband/core/Makefile+1−0
@@ -38,6 +38,7 @@ ib_umad-y := user_mad.o · 37 unmodified lines
38ib_uverbs-y := uverbs_main.o uverbs_cmd.o uverbs_marshall.o \38ib_uverbs-y := uverbs_main.o uverbs_cmd.o uverbs_marshall.o \
39 uverbs_std_types.o uverbs_ioctl.o \39 uverbs_std_types.o uverbs_ioctl.o \
40 uverbs_std_types_cq.o \40 uverbs_std_types_cq.o \
41 uverbs_std_types_comp_cntr.o \
41 uverbs_std_types_dmabuf.o \42 uverbs_std_types_dmabuf.o \
42 uverbs_std_types_dmah.o \43 uverbs_std_types_dmah.o \
43 uverbs_std_types_flow_action.o uverbs_std_types_dm.o \44 uverbs_std_types_flow_action.o uverbs_std_types_dm.o \
drivers/infiniband/core/device.c+6−0
@@ -2742,6 +2742,7 @@ void ib_set_device_ops(struct ib_device *dev, const struct ib_device_ops *ops) · 2741 unmodified lines
2742 SET_DEVICE_OP(dev_ops, create_ah);2742 SET_DEVICE_OP(dev_ops, create_ah);
2743 SET_DEVICE_OP(dev_ops, create_counters);2743 SET_DEVICE_OP(dev_ops, create_counters);
2744 SET_DEVICE_OP(dev_ops, create_cq);2744 SET_DEVICE_OP(dev_ops, create_cq);
2745 SET_DEVICE_OP(dev_ops, create_comp_cntr);
2745 SET_DEVICE_OP(dev_ops, create_user_cq);2746 SET_DEVICE_OP(dev_ops, create_user_cq);
2746 SET_DEVICE_OP(dev_ops, create_flow);2747 SET_DEVICE_OP(dev_ops, create_flow);
2747 SET_DEVICE_OP(dev_ops, create_qp);2748 SET_DEVICE_OP(dev_ops, create_qp);
@@ -2762,6 +2763,7 @@ void ib_set_device_ops(struct ib_device *dev, const struct ib_device_ops *ops) · 14 unmodified lines
2762 SET_DEVICE_OP(dev_ops, destroy_ah);2763 SET_DEVICE_OP(dev_ops, destroy_ah);
2763 SET_DEVICE_OP(dev_ops, destroy_counters);2764 SET_DEVICE_OP(dev_ops, destroy_counters);
2764 SET_DEVICE_OP(dev_ops, destroy_cq);2765 SET_DEVICE_OP(dev_ops, destroy_cq);
2766 SET_DEVICE_OP(dev_ops, destroy_comp_cntr);
2765 SET_DEVICE_OP(dev_ops, destroy_flow);2767 SET_DEVICE_OP(dev_ops, destroy_flow);
2766 SET_DEVICE_OP(dev_ops, destroy_flow_action);2768 SET_DEVICE_OP(dev_ops, destroy_flow_action);
2767 SET_DEVICE_OP(dev_ops, destroy_qp);2769 SET_DEVICE_OP(dev_ops, destroy_qp);
@@ -2813,6 +2815,7 @@ void ib_set_device_ops(struct ib_device *dev, const struct ib_device_ops *ops) · 45 unmodified lines
2813 SET_DEVICE_OP(dev_ops, modify_hw_stat);2815 SET_DEVICE_OP(dev_ops, modify_hw_stat);
2814 SET_DEVICE_OP(dev_ops, modify_port);2816 SET_DEVICE_OP(dev_ops, modify_port);
2815 SET_DEVICE_OP(dev_ops, modify_qp);2817 SET_DEVICE_OP(dev_ops, modify_qp);
2818 SET_DEVICE_OP(dev_ops, qp_attach_comp_cntr);
2816 SET_DEVICE_OP(dev_ops, modify_srq);2819 SET_DEVICE_OP(dev_ops, modify_srq);
2817 SET_DEVICE_OP(dev_ops, modify_wq);2820 SET_DEVICE_OP(dev_ops, modify_wq);
2818 SET_DEVICE_OP(dev_ops, peek_cq);2821 SET_DEVICE_OP(dev_ops, peek_cq);
@@ -2836,12 +2839,14 @@ void ib_set_device_ops(struct ib_device *dev, const struct ib_device_ops *ops) · 17 unmodified lines
2836 SET_DEVICE_OP(dev_ops, query_ucontext);2839 SET_DEVICE_OP(dev_ops, query_ucontext);
2837 SET_DEVICE_OP(dev_ops, rdma_netdev_get_params);2840 SET_DEVICE_OP(dev_ops, rdma_netdev_get_params);
2838 SET_DEVICE_OP(dev_ops, read_counters);2841 SET_DEVICE_OP(dev_ops, read_counters);
2842 SET_DEVICE_OP(dev_ops, read_comp_cntr);
2839 SET_DEVICE_OP(dev_ops, reg_dm_mr);2843 SET_DEVICE_OP(dev_ops, reg_dm_mr);
2840 SET_DEVICE_OP(dev_ops, reg_user_mr);2844 SET_DEVICE_OP(dev_ops, reg_user_mr);
2841 SET_DEVICE_OP(dev_ops, reg_user_mr_dmabuf);2845 SET_DEVICE_OP(dev_ops, reg_user_mr_dmabuf);
2842 SET_DEVICE_OP(dev_ops, req_notify_cq);2846 SET_DEVICE_OP(dev_ops, req_notify_cq);
2843 SET_DEVICE_OP(dev_ops, rereg_user_mr);2847 SET_DEVICE_OP(dev_ops, rereg_user_mr);
2844 SET_DEVICE_OP(dev_ops, resize_user_cq);2848 SET_DEVICE_OP(dev_ops, resize_user_cq);
2849 SET_DEVICE_OP(dev_ops, modify_comp_cntr);
2845 SET_DEVICE_OP(dev_ops, set_vf_guid);2850 SET_DEVICE_OP(dev_ops, set_vf_guid);
2846 SET_DEVICE_OP(dev_ops, set_vf_link_state);2851 SET_DEVICE_OP(dev_ops, set_vf_link_state);
2847 SET_DEVICE_OP(dev_ops, ufile_hw_cleanup);2852 SET_DEVICE_OP(dev_ops, ufile_hw_cleanup);
@@ -2850,6 +2855,7 @@ void ib_set_device_ops(struct ib_device *dev, const struct ib_device_ops *ops) · 2 unmodified lines
2850 SET_OBJ_SIZE(dev_ops, ib_ah);2855 SET_OBJ_SIZE(dev_ops, ib_ah);
2851 SET_OBJ_SIZE(dev_ops, ib_counters);2856 SET_OBJ_SIZE(dev_ops, ib_counters);
2852 SET_OBJ_SIZE(dev_ops, ib_cq);2857 SET_OBJ_SIZE(dev_ops, ib_cq);
2858 SET_OBJ_SIZE(dev_ops, ib_comp_cntr);
2853 SET_OBJ_SIZE(dev_ops, ib_dmah);2859 SET_OBJ_SIZE(dev_ops, ib_dmah);
2854 SET_OBJ_SIZE(dev_ops, ib_mw);2860 SET_OBJ_SIZE(dev_ops, ib_mw);
2855 SET_OBJ_SIZE(dev_ops, ib_pd);2861 SET_OBJ_SIZE(dev_ops, ib_pd);
drivers/infiniband/core/rdma_core.h+1−0
@@ -159,6 +159,7 @@ void uverbs_user_mmap_disassociate(struct ib_uverbs_file *ufile); · 158 unmodified lines
159 159
160extern const struct uapi_definition uverbs_def_obj_async_fd[];160extern const struct uapi_definition uverbs_def_obj_async_fd[];
161extern const struct uapi_definition uverbs_def_obj_counters[];161extern const struct uapi_definition uverbs_def_obj_counters[];
162extern const struct uapi_definition uverbs_def_obj_comp_cntr[];
162extern const struct uapi_definition uverbs_def_obj_cq[];163extern const struct uapi_definition uverbs_def_obj_cq[];
163extern const struct uapi_definition uverbs_def_obj_device[];164extern const struct uapi_definition uverbs_def_obj_device[];
164extern const struct uapi_definition uverbs_def_obj_dm[];165extern const struct uapi_definition uverbs_def_obj_dm[];
drivers/infiniband/core/uverbs_std_types_comp_cntr.c+159−0
@@ -0,0 +1,159 @@
1// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
2/*
3 * Copyright Amazon.com, Inc. or its affiliates. All rights reserved.
4 */
5
6#include <rdma/uverbs_std_types.h>
7#include "rdma_core.h"
8#include "uverbs.h"
9
10static int uverbs_free_comp_cntr(struct ib_uobject *uobject, enum rdma_remove_reason why,
11 struct uverbs_attr_bundle *attrs)
12{
13 struct ib_comp_cntr *cc = uobject->object;
14 int ret;
15
16 ret = cc->device->ops.destroy_comp_cntr(cc);
17 if (ret)
18 return ret;
19
20 kfree(cc);
21 return 0;
22}
23
24static int UVERBS_HANDLER(UVERBS_METHOD_COMP_CNTR_CREATE)(struct uverbs_attr_bundle *attrs)
25{
26 struct ib_uobject *uobj = uverbs_attr_get_uobject(attrs,
27 UVERBS_ATTR_CREATE_COMP_CNTR_HANDLE);
28 struct ib_device *ib_dev = attrs->context->device;
29 struct ib_comp_cntr *cc;
30 int ret;
31
32 if (!ib_dev->ops.create_comp_cntr ||
33 !ib_dev->ops.destroy_comp_cntr ||
34 !ib_dev->ops.qp_attach_comp_cntr)
35 return -EOPNOTSUPP;
36
37 cc = rdma_zalloc_drv_obj(ib_dev, ib_comp_cntr);
38 if (!cc)
39 return -ENOMEM;
40
41 cc->device = ib_dev;
42 cc->uobject = uobj;
43
44 ret = ib_dev->ops.create_comp_cntr(cc, attrs);
45 if (ret)
46 goto err_free;
47
48 uobj->object = cc;
49 uverbs_finalize_uobj_create(attrs, UVERBS_ATTR_CREATE_COMP_CNTR_HANDLE);
50 return 0;
51
52err_free:
53 kfree(cc);
54 return ret;
55}
56
57static int UVERBS_HANDLER(UVERBS_METHOD_COMP_CNTR_MODIFY)(struct uverbs_attr_bundle *attrs)
58{
59 struct ib_comp_cntr *cc = uverbs_attr_get_obj(attrs, UVERBS_ATTR_MODIFY_COMP_CNTR_HANDLE);
60 enum ib_comp_cntr_modify_op op;
61 enum ib_comp_cntr_entry entry;
62 u64 value;
63 int ret;
64
65 if (!cc->device->ops.modify_comp_cntr)
66 return -EOPNOTSUPP;
67
68 ret = uverbs_get_const(&entry, attrs, UVERBS_ATTR_MODIFY_COMP_CNTR_ENTRY);
69 if (ret)
70 return ret;
71
72 ret = uverbs_get_const(&op, attrs, UVERBS_ATTR_MODIFY_COMP_CNTR_OP);
73 if (ret)
74 return ret;
75
76 ret = uverbs_copy_from(&value, attrs, UVERBS_ATTR_MODIFY_COMP_CNTR_VALUE);
77 if (ret)
78 return ret;
79
80 return cc->device->ops.modify_comp_cntr(cc, entry, op, value);
81}
82
83static int UVERBS_HANDLER(UVERBS_METHOD_COMP_CNTR_READ)(struct uverbs_attr_bundle *attrs)
84{
85 struct ib_comp_cntr *cc = uverbs_attr_get_obj(attrs, UVERBS_ATTR_READ_COMP_CNTR_HANDLE);
86 enum ib_comp_cntr_entry entry;
87 u64 value = 0;
88 int ret;
89
90 if (!cc->device->ops.read_comp_cntr)
91 return -EOPNOTSUPP;
92
93 ret = uverbs_get_const(&entry, attrs, UVERBS_ATTR_READ_COMP_CNTR_ENTRY);
94 if (ret)
95 return ret;
96
97 ret = cc->device->ops.read_comp_cntr(cc, entry, &value);
98 if (ret)
99 return ret;
100
101 return uverbs_copy_to(attrs, UVERBS_ATTR_READ_COMP_CNTR_RESP_VALUE, &value, sizeof(value));
102}
103
104DECLARE_UVERBS_NAMED_METHOD(
105 UVERBS_METHOD_COMP_CNTR_CREATE,
106 UVERBS_ATTR_IDR(UVERBS_ATTR_CREATE_COMP_CNTR_HANDLE,
107 UVERBS_OBJECT_COMP_CNTR,
108 UVERBS_ACCESS_NEW,
109 UA_MANDATORY));
110
111DECLARE_UVERBS_NAMED_METHOD_DESTROY(
112 UVERBS_METHOD_COMP_CNTR_DESTROY,
113 UVERBS_ATTR_IDR(UVERBS_ATTR_DESTROY_COMP_CNTR_HANDLE,
114 UVERBS_OBJECT_COMP_CNTR,
115 UVERBS_ACCESS_DESTROY,
116 UA_MANDATORY));
117
118DECLARE_UVERBS_NAMED_METHOD(
119 UVERBS_METHOD_COMP_CNTR_MODIFY,
120 UVERBS_ATTR_IDR(UVERBS_ATTR_MODIFY_COMP_CNTR_HANDLE,
121 UVERBS_OBJECT_COMP_CNTR,
122 UVERBS_ACCESS_WRITE,
123 UA_MANDATORY),
124 UVERBS_ATTR_CONST_IN(UVERBS_ATTR_MODIFY_COMP_CNTR_ENTRY,
125 enum ib_uverbs_comp_cntr_entry,
126 UA_MANDATORY),
127 UVERBS_ATTR_CONST_IN(UVERBS_ATTR_MODIFY_COMP_CNTR_OP,
128 enum ib_uverbs_comp_cntr_modify_op,
129 UA_MANDATORY),
130 UVERBS_ATTR_PTR_IN(UVERBS_ATTR_MODIFY_COMP_CNTR_VALUE,
131 UVERBS_ATTR_TYPE(u64),
132 UA_MANDATORY));
133
134DECLARE_UVERBS_NAMED_METHOD(
135 UVERBS_METHOD_COMP_CNTR_READ,
136 UVERBS_ATTR_IDR(UVERBS_ATTR_READ_COMP_CNTR_HANDLE,
137 UVERBS_OBJECT_COMP_CNTR,
138 UVERBS_ACCESS_READ,
139 UA_MANDATORY),
140 UVERBS_ATTR_CONST_IN(UVERBS_ATTR_READ_COMP_CNTR_ENTRY,
141 enum ib_uverbs_comp_cntr_entry,
142 UA_MANDATORY),
143 UVERBS_ATTR_PTR_OUT(UVERBS_ATTR_READ_COMP_CNTR_RESP_VALUE,
144 UVERBS_ATTR_TYPE(u64),
145 UA_MANDATORY));
146
147DECLARE_UVERBS_NAMED_OBJECT(
148 UVERBS_OBJECT_COMP_CNTR,
149 UVERBS_TYPE_ALLOC_IDR(uverbs_free_comp_cntr),
150 &UVERBS_METHOD(UVERBS_METHOD_COMP_CNTR_CREATE),
151 &UVERBS_METHOD(UVERBS_METHOD_COMP_CNTR_DESTROY),
152 &UVERBS_METHOD(UVERBS_METHOD_COMP_CNTR_MODIFY),
153 &UVERBS_METHOD(UVERBS_METHOD_COMP_CNTR_READ));
154
155const struct uapi_definition uverbs_def_obj_comp_cntr[] = {
156 UAPI_DEF_CHAIN_OBJ_TREE_NAMED(UVERBS_OBJECT_COMP_CNTR,
157 UAPI_DEF_OBJ_NEEDS_FN(destroy_comp_cntr)),
158 {}
159};
drivers/infiniband/core/uverbs_std_types_qp.c+50−1
@@ -372,11 +372,60 @@ DECLARE_UVERBS_NAMED_METHOD( · 371 unmodified lines
372 UVERBS_ATTR_TYPE(struct ib_uverbs_destroy_qp_resp),372 UVERBS_ATTR_TYPE(struct ib_uverbs_destroy_qp_resp),
373 UA_MANDATORY));373 UA_MANDATORY));
374 374
375static int UVERBS_HANDLER(UVERBS_METHOD_QP_ATTACH_COMP_CNTR)(
376 struct uverbs_attr_bundle *attrs)
377{
378 struct ib_uobject *qp_uobj = uverbs_attr_get_uobject(
379 attrs, UVERBS_ATTR_QP_ATTACH_COMP_CNTR_HANDLE);
380 struct ib_comp_cntr *cc = uverbs_attr_get_obj(
381 attrs, UVERBS_ATTR_QP_ATTACH_COMP_CNTR_CNTR_HANDLE);
382 struct ib_qp_attach_comp_cntr_attr attr = {};
383 struct ib_qp *qp = qp_uobj->object;
384 int ret;
385
386 if (!cc->device->ops.qp_attach_comp_cntr)
387 return -EOPNOTSUPP;
388
389 if (qp->real_qp != qp)
390 return -EINVAL;
391
392 ret = uverbs_get_flags32(&attr.op_mask, attrs,
393 UVERBS_ATTR_QP_ATTACH_COMP_CNTR_OP_MASK,
394 IB_UVERBS_QP_ATTACH_COMP_CNTR_OP_SEND |
395 IB_UVERBS_QP_ATTACH_COMP_CNTR_OP_RECV |
396 IB_UVERBS_QP_ATTACH_COMP_CNTR_OP_RDMA_READ |
397 IB_UVERBS_QP_ATTACH_COMP_CNTR_OP_REMOTE_RDMA_READ |
398 IB_UVERBS_QP_ATTACH_COMP_CNTR_OP_RDMA_WRITE |
399 IB_UVERBS_QP_ATTACH_COMP_CNTR_OP_REMOTE_RDMA_WRITE);
400 if (ret)
401 return ret;
402
403 if (!attr.op_mask)
404 return -EINVAL;
405
406 return qp->device->ops.qp_attach_comp_cntr(qp, cc, &attr);
407}
408
409DECLARE_UVERBS_NAMED_METHOD(
410 UVERBS_METHOD_QP_ATTACH_COMP_CNTR,
411 UVERBS_ATTR_IDR(UVERBS_ATTR_QP_ATTACH_COMP_CNTR_HANDLE,
412 UVERBS_OBJECT_QP,
413 UVERBS_ACCESS_WRITE,
414 UA_MANDATORY),
415 UVERBS_ATTR_IDR(UVERBS_ATTR_QP_ATTACH_COMP_CNTR_CNTR_HANDLE,
416 UVERBS_OBJECT_COMP_CNTR,
417 UVERBS_ACCESS_READ,
418 UA_MANDATORY),
419 UVERBS_ATTR_FLAGS_IN(UVERBS_ATTR_QP_ATTACH_COMP_CNTR_OP_MASK,
420 enum ib_uverbs_qp_attach_comp_cntr_op,
421 UA_MANDATORY));
422
375DECLARE_UVERBS_NAMED_OBJECT(423DECLARE_UVERBS_NAMED_OBJECT(
376 UVERBS_OBJECT_QP,424 UVERBS_OBJECT_QP,
377 UVERBS_TYPE_ALLOC_IDR_SZ(sizeof(struct ib_uqp_object), uverbs_free_qp),425 UVERBS_TYPE_ALLOC_IDR_SZ(sizeof(struct ib_uqp_object), uverbs_free_qp),
378 &UVERBS_METHOD(UVERBS_METHOD_QP_CREATE),426 &UVERBS_METHOD(UVERBS_METHOD_QP_CREATE),
379 &UVERBS_METHOD(UVERBS_METHOD_QP_DESTROY));427 &UVERBS_METHOD(UVERBS_METHOD_QP_DESTROY),
428 &UVERBS_METHOD(UVERBS_METHOD_QP_ATTACH_COMP_CNTR));
380 429
381const struct uapi_definition uverbs_def_obj_qp[] = {430const struct uapi_definition uverbs_def_obj_qp[] = {
382 UAPI_DEF_CHAIN_OBJ_TREE_NAMED(UVERBS_OBJECT_QP,431 UAPI_DEF_CHAIN_OBJ_TREE_NAMED(UVERBS_OBJECT_QP,
drivers/infiniband/core/uverbs_uapi.c+1−0
@@ -628,6 +628,7 @@ void uverbs_destroy_api(struct uverbs_api *uapi) · 627 unmodified lines
628static const struct uapi_definition uverbs_core_api[] = {628static const struct uapi_definition uverbs_core_api[] = {
629 UAPI_DEF_CHAIN(uverbs_def_obj_async_fd),629 UAPI_DEF_CHAIN(uverbs_def_obj_async_fd),
630 UAPI_DEF_CHAIN(uverbs_def_obj_counters),630 UAPI_DEF_CHAIN(uverbs_def_obj_counters),
631 UAPI_DEF_CHAIN(uverbs_def_obj_comp_cntr),
631 UAPI_DEF_CHAIN(uverbs_def_obj_cq),632 UAPI_DEF_CHAIN(uverbs_def_obj_cq),
632 UAPI_DEF_CHAIN(uverbs_def_obj_device),633 UAPI_DEF_CHAIN(uverbs_def_obj_device),
633 UAPI_DEF_CHAIN(uverbs_def_obj_dm),634 UAPI_DEF_CHAIN(uverbs_def_obj_dm),
include/rdma/ib_verbs.h+37−0
@@ -1746,6 +1746,34 @@ struct ib_cq { · 1745 unmodified lines
1746 struct rdma_restrack_entry res;1746 struct rdma_restrack_entry res;
1747};1747};
1748 1748
1749enum ib_qp_attach_comp_cntr_op {
1750 IB_QP_ATTACH_COMP_CNTR_OP_SEND = IB_UVERBS_QP_ATTACH_COMP_CNTR_OP_SEND,
1751 IB_QP_ATTACH_COMP_CNTR_OP_RECV = IB_UVERBS_QP_ATTACH_COMP_CNTR_OP_RECV,
1752 IB_QP_ATTACH_COMP_CNTR_OP_RDMA_READ = IB_UVERBS_QP_ATTACH_COMP_CNTR_OP_RDMA_READ,
1753 IB_QP_ATTACH_COMP_CNTR_OP_REMOTE_RDMA_READ = IB_UVERBS_QP_ATTACH_COMP_CNTR_OP_REMOTE_RDMA_READ,
1754 IB_QP_ATTACH_COMP_CNTR_OP_RDMA_WRITE = IB_UVERBS_QP_ATTACH_COMP_CNTR_OP_RDMA_WRITE,
1755 IB_QP_ATTACH_COMP_CNTR_OP_REMOTE_RDMA_WRITE = IB_UVERBS_QP_ATTACH_COMP_CNTR_OP_REMOTE_RDMA_WRITE,
1756};
1757
1758struct ib_comp_cntr {
1759 struct ib_device *device;
1760 struct ib_uobject *uobject;
1761};
1762
1763enum ib_comp_cntr_entry {
1764 IB_COMP_CNTR_ENTRY_COMP = IB_UVERBS_COMP_CNTR_ENTRY_COMP,
1765 IB_COMP_CNTR_ENTRY_ERR = IB_UVERBS_COMP_CNTR_ENTRY_ERR,
1766};
1767
1768enum ib_comp_cntr_modify_op {
1769 IB_COMP_CNTR_MODIFY_OP_SET = IB_UVERBS_COMP_CNTR_MODIFY_OP_SET,
1770 IB_COMP_CNTR_MODIFY_OP_INC = IB_UVERBS_COMP_CNTR_MODIFY_OP_INC,
1771};
1772
1773struct ib_qp_attach_comp_cntr_attr {
1774 u32 op_mask; /* Bitmask of enum ib_qp_attach_comp_cntr_op */
1775};
1776
1749struct ib_srq {1777struct ib_srq {
1750 struct ib_device *device;1778 struct ib_device *device;
1751 struct ib_pd *pd;1779 struct ib_pd *pd;
@@ -2629,6 +2657,8 @@ struct ib_device_ops { · 877 unmodified lines
2629 struct ib_udata *udata);2657 struct ib_udata *udata);
2630 int (*modify_qp)(struct ib_qp *qp, struct ib_qp_attr *qp_attr,2658 int (*modify_qp)(struct ib_qp *qp, struct ib_qp_attr *qp_attr,
2631 int qp_attr_mask, struct ib_udata *udata);2659 int qp_attr_mask, struct ib_udata *udata);
2660 int (*qp_attach_comp_cntr)(struct ib_qp *qp, struct ib_comp_cntr *cc,
2661 struct ib_qp_attach_comp_cntr_attr *attr);
2632 int (*query_qp)(struct ib_qp *qp, struct ib_qp_attr *qp_attr,2662 int (*query_qp)(struct ib_qp *qp, struct ib_qp_attr *qp_attr,
2633 int qp_attr_mask, struct ib_qp_init_attr *qp_init_attr);2663 int qp_attr_mask, struct ib_qp_init_attr *qp_init_attr);
2634 int (*destroy_qp)(struct ib_qp *qp, struct ib_udata *udata);2664 int (*destroy_qp)(struct ib_qp *qp, struct ib_udata *udata);
@@ -2650,6 +2680,12 @@ struct ib_device_ops { · 15 unmodified lines
2650 * post_destroy_cq - Free all kernel resources2680 * post_destroy_cq - Free all kernel resources
2651 */2681 */
2652 void (*post_destroy_cq)(struct ib_cq *cq);2682 void (*post_destroy_cq)(struct ib_cq *cq);
2683 int (*create_comp_cntr)(struct ib_comp_cntr *cc,
2684 struct uverbs_attr_bundle *attrs);
2685 int (*destroy_comp_cntr)(struct ib_comp_cntr *cc);
2686 int (*modify_comp_cntr)(struct ib_comp_cntr *cc, enum ib_comp_cntr_entry entry,
2687 enum ib_comp_cntr_modify_op op, u64 value);
2688 int (*read_comp_cntr)(struct ib_comp_cntr *cc, enum ib_comp_cntr_entry entry, u64 *value);
2653 struct ib_mr *(*get_dma_mr)(struct ib_pd *pd, int mr_access_flags);2689 struct ib_mr *(*get_dma_mr)(struct ib_pd *pd, int mr_access_flags);
2654 struct ib_mr *(*reg_user_mr)(struct ib_pd *pd, u64 start, u64 length,2690 struct ib_mr *(*reg_user_mr)(struct ib_pd *pd, u64 start, u64 length,
2655 u64 virt_addr, int mr_access_flags,2691 u64 virt_addr, int mr_access_flags,
@@ -2883,6 +2919,7 @@ struct ib_device_ops { · 227 unmodified lines
2883 DECLARE_RDMA_OBJ_SIZE(ib_ah);2919 DECLARE_RDMA_OBJ_SIZE(ib_ah);
2884 DECLARE_RDMA_OBJ_SIZE(ib_counters);2920 DECLARE_RDMA_OBJ_SIZE(ib_counters);
2885 DECLARE_RDMA_OBJ_SIZE(ib_cq);2921 DECLARE_RDMA_OBJ_SIZE(ib_cq);
2922 DECLARE_RDMA_OBJ_SIZE(ib_comp_cntr);
2886 DECLARE_RDMA_OBJ_SIZE(ib_dmah);2923 DECLARE_RDMA_OBJ_SIZE(ib_dmah);
2887 DECLARE_RDMA_OBJ_SIZE(ib_mw);2924 DECLARE_RDMA_OBJ_SIZE(ib_mw);
2888 DECLARE_RDMA_OBJ_SIZE(ib_pd);2925 DECLARE_RDMA_OBJ_SIZE(ib_pd);
include/uapi/rdma/ib_user_ioctl_cmds.h+36−0
@@ -57,6 +57,7 @@ enum uverbs_default_objects { · 56 unmodified lines
57 UVERBS_OBJECT_ASYNC_EVENT,57 UVERBS_OBJECT_ASYNC_EVENT,
58 UVERBS_OBJECT_DMAH,58 UVERBS_OBJECT_DMAH,
59 UVERBS_OBJECT_DMABUF,59 UVERBS_OBJECT_DMABUF,
60 UVERBS_OBJECT_COMP_CNTR,
60};61};
61 62
62enum {63enum {
@@ -169,9 +170,16 @@ enum uverbs_attrs_destroy_qp_cmd_attr_ids { · 106 unmodified lines
169 UVERBS_ATTR_DESTROY_QP_RESP,170 UVERBS_ATTR_DESTROY_QP_RESP,
170};171};
171 172
173enum uverbs_attrs_qp_attach_comp_cntr_cmd_attr_ids {
174 UVERBS_ATTR_QP_ATTACH_COMP_CNTR_HANDLE,
175 UVERBS_ATTR_QP_ATTACH_COMP_CNTR_CNTR_HANDLE,
176 UVERBS_ATTR_QP_ATTACH_COMP_CNTR_OP_MASK,
177};
178
172enum uverbs_methods_qp {179enum uverbs_methods_qp {
173 UVERBS_METHOD_QP_CREATE,180 UVERBS_METHOD_QP_CREATE,
174 UVERBS_METHOD_QP_DESTROY,181 UVERBS_METHOD_QP_DESTROY,
182 UVERBS_METHOD_QP_ATTACH_COMP_CNTR,
175};183};
176 184
177enum uverbs_attrs_create_srq_cmd_attr_ids {185enum uverbs_attrs_create_srq_cmd_attr_ids {
@@ -438,4 +446,32 @@ enum uverbs_attrs_query_gid_entry_cmd_attr_ids { · 260 unmodified lines
438 UVERBS_ATTR_QUERY_GID_ENTRY_RESP_ENTRY,446 UVERBS_ATTR_QUERY_GID_ENTRY_RESP_ENTRY,
439};447};
440 448
449enum uverbs_methods_comp_cntr {
450 UVERBS_METHOD_COMP_CNTR_CREATE,
451 UVERBS_METHOD_COMP_CNTR_DESTROY,
452 UVERBS_METHOD_COMP_CNTR_MODIFY,
453 UVERBS_METHOD_COMP_CNTR_READ,
454};
455
456enum uverbs_attrs_create_comp_cntr_cmd_attr_ids {
457 UVERBS_ATTR_CREATE_COMP_CNTR_HANDLE,
458};
459
460enum uverbs_attrs_destroy_comp_cntr_cmd_attr_ids {
461 UVERBS_ATTR_DESTROY_COMP_CNTR_HANDLE,
462};
463
464enum uverbs_attrs_modify_comp_cntr_cmd_attr_ids {
465 UVERBS_ATTR_MODIFY_COMP_CNTR_HANDLE,
466 UVERBS_ATTR_MODIFY_COMP_CNTR_ENTRY,
467 UVERBS_ATTR_MODIFY_COMP_CNTR_OP,
468 UVERBS_ATTR_MODIFY_COMP_CNTR_VALUE,
469};
470
471enum uverbs_attrs_read_comp_cntr_cmd_attr_ids {
472 UVERBS_ATTR_READ_COMP_CNTR_HANDLE,
473 UVERBS_ATTR_READ_COMP_CNTR_ENTRY,
474 UVERBS_ATTR_READ_COMP_CNTR_RESP_VALUE,
475};
476
441#endif477#endif
include/uapi/rdma/ib_user_ioctl_verbs.h+19−0
@@ -300,4 +300,23 @@ struct ib_uverbs_buffer_desc { · 299 unmodified lines
300 __aligned_u64 length;300 __aligned_u64 length;
301};301};
302 302
303enum ib_uverbs_comp_cntr_entry {
304 IB_UVERBS_COMP_CNTR_ENTRY_COMP,
305 IB_UVERBS_COMP_CNTR_ENTRY_ERR,
306};
307
308enum ib_uverbs_comp_cntr_modify_op {
309 IB_UVERBS_COMP_CNTR_MODIFY_OP_SET,
310 IB_UVERBS_COMP_CNTR_MODIFY_OP_INC,
311};
312
313enum ib_uverbs_qp_attach_comp_cntr_op {
314 IB_UVERBS_QP_ATTACH_COMP_CNTR_OP_SEND = 1 << 0,
315 IB_UVERBS_QP_ATTACH_COMP_CNTR_OP_RECV = 1 << 1,
316 IB_UVERBS_QP_ATTACH_COMP_CNTR_OP_RDMA_READ = 1 << 2,
317 IB_UVERBS_QP_ATTACH_COMP_CNTR_OP_REMOTE_RDMA_READ = 1 << 3,
318 IB_UVERBS_QP_ATTACH_COMP_CNTR_OP_RDMA_WRITE = 1 << 4,
319 IB_UVERBS_QP_ATTACH_COMP_CNTR_OP_REMOTE_RDMA_WRITE = 1 << 5,
320};
321
303#endif322#endif