mirror of
https://github.com/torvalds/linux.git
synced 2026-09-22 20:54:03 +02:00
RDMA/core: Expose Completion Counter capabilities to userspace
Add a dedicated query interface for completion counter capabilities via UVERBS_METHOD_QUERY_COMP_CNTR_CAPS on the device object. The query returns the maximum number of counters, maximum counter value, and a bitmask of supported QP attach operations. Each field is an optional ioctl attribute, allowing userspace to request only the capabilities it needs. Drivers implement the query_comp_cntr_caps operation to report device-specific capabilities. Reviewed-by: Yonatan Nachum <ynachum@amazon.com> Signed-off-by: Michael Margolin <mrgolin@amazon.com> Link: https://patch.msgid.link/20260722083603.30334-4-mrgolin@amazon.com Signed-off-by: Leon Romanovsky <leon@kernel.org>
This commit is contained in:
parent
45e537bf58
commit
c1c13e596f
|
|
@ -2829,6 +2829,7 @@ void ib_set_device_ops(struct ib_device *dev, const struct ib_device_ops *ops)
|
|||
SET_DEVICE_OP(dev_ops, post_srq_recv);
|
||||
SET_DEVICE_OP(dev_ops, process_mad);
|
||||
SET_DEVICE_OP(dev_ops, query_ah);
|
||||
SET_DEVICE_OP(dev_ops, query_comp_cntr_caps);
|
||||
SET_DEVICE_OP(dev_ops, query_device);
|
||||
SET_DEVICE_OP(dev_ops, query_gid);
|
||||
SET_DEVICE_OP(dev_ops, query_pkey);
|
||||
|
|
|
|||
|
|
@ -472,6 +472,42 @@ static int UVERBS_HANDLER(UVERBS_METHOD_QUERY_GID_ENTRY)(
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int UVERBS_HANDLER(UVERBS_METHOD_QUERY_COMP_CNTR_CAPS)(
|
||||
struct uverbs_attr_bundle *attrs)
|
||||
{
|
||||
struct ib_comp_cntr_caps caps = {};
|
||||
struct ib_ucontext *ucontext;
|
||||
struct ib_device *ib_dev;
|
||||
int ret;
|
||||
|
||||
ucontext = ib_uverbs_get_ucontext(attrs);
|
||||
if (IS_ERR(ucontext))
|
||||
return PTR_ERR(ucontext);
|
||||
ib_dev = ucontext->device;
|
||||
|
||||
if (!ib_dev->ops.query_comp_cntr_caps)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
ret = ib_dev->ops.query_comp_cntr_caps(ib_dev, &caps, attrs);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = uverbs_copy_to(attrs, UVERBS_ATTR_QUERY_COMP_CNTR_CAPS_MAX_COUNTERS,
|
||||
&caps.max_counters, sizeof(caps.max_counters));
|
||||
if (IS_UVERBS_COPY_ERR(ret))
|
||||
return ret;
|
||||
|
||||
ret = uverbs_copy_to(attrs, UVERBS_ATTR_QUERY_COMP_CNTR_CAPS_MAX_VALUE,
|
||||
&caps.max_value, sizeof(caps.max_value));
|
||||
if (IS_UVERBS_COPY_ERR(ret))
|
||||
return ret;
|
||||
|
||||
ret = uverbs_copy_to(attrs, UVERBS_ATTR_QUERY_COMP_CNTR_CAPS_SUPPORTED_QP_ATTACH_OPS,
|
||||
&caps.supported_qp_attach_ops,
|
||||
sizeof(caps.supported_qp_attach_ops));
|
||||
return IS_UVERBS_COPY_ERR(ret) ? ret : 0;
|
||||
}
|
||||
|
||||
DECLARE_UVERBS_NAMED_METHOD(
|
||||
UVERBS_METHOD_GET_CONTEXT,
|
||||
UVERBS_ATTR_PTR_OUT(UVERBS_ATTR_GET_CONTEXT_NUM_COMP_VECTORS,
|
||||
|
|
@ -542,6 +578,18 @@ DECLARE_UVERBS_NAMED_METHOD(
|
|||
netdev_ifindex),
|
||||
UA_MANDATORY));
|
||||
|
||||
DECLARE_UVERBS_NAMED_METHOD(
|
||||
UVERBS_METHOD_QUERY_COMP_CNTR_CAPS,
|
||||
UVERBS_ATTR_PTR_OUT(UVERBS_ATTR_QUERY_COMP_CNTR_CAPS_MAX_COUNTERS,
|
||||
UVERBS_ATTR_TYPE(u32),
|
||||
UA_OPTIONAL),
|
||||
UVERBS_ATTR_PTR_OUT(UVERBS_ATTR_QUERY_COMP_CNTR_CAPS_MAX_VALUE,
|
||||
UVERBS_ATTR_TYPE(u64),
|
||||
UA_OPTIONAL),
|
||||
UVERBS_ATTR_PTR_OUT(UVERBS_ATTR_QUERY_COMP_CNTR_CAPS_SUPPORTED_QP_ATTACH_OPS,
|
||||
UVERBS_ATTR_TYPE(u32),
|
||||
UA_OPTIONAL));
|
||||
|
||||
DECLARE_UVERBS_GLOBAL_METHODS(UVERBS_OBJECT_DEVICE,
|
||||
&UVERBS_METHOD(UVERBS_METHOD_GET_CONTEXT),
|
||||
&UVERBS_METHOD(UVERBS_METHOD_INVOKE_WRITE),
|
||||
|
|
@ -550,7 +598,8 @@ DECLARE_UVERBS_GLOBAL_METHODS(UVERBS_OBJECT_DEVICE,
|
|||
&UVERBS_METHOD(UVERBS_METHOD_QUERY_PORT_SPEED),
|
||||
&UVERBS_METHOD(UVERBS_METHOD_QUERY_CONTEXT),
|
||||
&UVERBS_METHOD(UVERBS_METHOD_QUERY_GID_TABLE),
|
||||
&UVERBS_METHOD(UVERBS_METHOD_QUERY_GID_ENTRY));
|
||||
&UVERBS_METHOD(UVERBS_METHOD_QUERY_GID_ENTRY),
|
||||
&UVERBS_METHOD(UVERBS_METHOD_QUERY_COMP_CNTR_CAPS));
|
||||
|
||||
const struct uapi_definition uverbs_def_obj_device[] = {
|
||||
UAPI_DEF_CHAIN_OBJ_TREE_NAMED(UVERBS_OBJECT_DEVICE),
|
||||
|
|
|
|||
|
|
@ -1755,6 +1755,12 @@ enum ib_qp_attach_comp_cntr_op {
|
|||
IB_QP_ATTACH_COMP_CNTR_OP_REMOTE_RDMA_WRITE = IB_UVERBS_QP_ATTACH_COMP_CNTR_OP_REMOTE_RDMA_WRITE,
|
||||
};
|
||||
|
||||
struct ib_comp_cntr_caps {
|
||||
u64 max_value;
|
||||
u32 max_counters;
|
||||
u32 supported_qp_attach_ops; /* Bitmask of enum ib_qp_attach_comp_cntr_op */
|
||||
};
|
||||
|
||||
struct ib_comp_cntr {
|
||||
struct ib_device *device;
|
||||
struct ib_uobject *uobject;
|
||||
|
|
@ -2689,6 +2695,9 @@ struct ib_device_ops {
|
|||
int (*modify_comp_cntr)(struct ib_comp_cntr *cc, enum ib_comp_cntr_entry entry,
|
||||
enum ib_comp_cntr_modify_op op, u64 value);
|
||||
int (*read_comp_cntr)(struct ib_comp_cntr *cc, enum ib_comp_cntr_entry entry, u64 *value);
|
||||
int (*query_comp_cntr_caps)(struct ib_device *dev,
|
||||
struct ib_comp_cntr_caps *caps,
|
||||
struct uverbs_attr_bundle *attrs);
|
||||
struct ib_mr *(*get_dma_mr)(struct ib_pd *pd, int mr_access_flags);
|
||||
struct ib_mr *(*reg_user_mr)(struct ib_pd *pd, u64 start, u64 length,
|
||||
u64 virt_addr, int mr_access_flags,
|
||||
|
|
|
|||
|
|
@ -76,6 +76,7 @@ enum uverbs_methods_device {
|
|||
UVERBS_METHOD_QUERY_GID_TABLE,
|
||||
UVERBS_METHOD_QUERY_GID_ENTRY,
|
||||
UVERBS_METHOD_QUERY_PORT_SPEED,
|
||||
UVERBS_METHOD_QUERY_COMP_CNTR_CAPS,
|
||||
};
|
||||
|
||||
enum uverbs_attrs_invoke_write_cmd_attr_ids {
|
||||
|
|
@ -94,6 +95,12 @@ enum uverbs_attrs_query_port_speed_cmd_attr_ids {
|
|||
UVERBS_ATTR_QUERY_PORT_SPEED_RESP,
|
||||
};
|
||||
|
||||
enum uverbs_attrs_query_comp_cntr_caps_attr_ids {
|
||||
UVERBS_ATTR_QUERY_COMP_CNTR_CAPS_MAX_COUNTERS,
|
||||
UVERBS_ATTR_QUERY_COMP_CNTR_CAPS_MAX_VALUE,
|
||||
UVERBS_ATTR_QUERY_COMP_CNTR_CAPS_SUPPORTED_QP_ATTACH_OPS,
|
||||
};
|
||||
|
||||
enum uverbs_attrs_get_context_attr_ids {
|
||||
UVERBS_ATTR_GET_CONTEXT_NUM_COMP_VECTORS,
|
||||
UVERBS_ATTR_GET_CONTEXT_CORE_SUPPORT,
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user