RDMA/nldev: Add resource summary max values for usage display

Add RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY_MAX netlink attribute to expose
device resource limits (max_qp, max_cq, max_mr, max_pd, max_srq) in
the resource summary alongside the existing current count. This allows
userspace tools like iproute2's rdma to display resource usage in
curr/max format.

Expected output from "rdma resource show":
  Before: 0: mlx5_0: qp 123  cq 45  mr 200  pd 10
  After:  0: mlx5_0: qp 123/131072  cq 45/65536  mr 200/1000000  pd 10/32768

In JSON output, both "curr" and "max" fields will be provided so that
scripts can compute percentages if needed.

The new attribute is optional and backward compatible - old userspace
tools will simply ignore it.

Signed-off-by: Tao Cui <cuitao@kylinos.cn>
Link: https://patch.msgid.link/20260615003646.168704-1-cui.tao@linux.dev
Signed-off-by: Leon Romanovsky <leon@kernel.org>
This commit is contained in:
Tao Cui
2026-06-15 08:36:46 +08:00
committed by Leon Romanovsky
parent dc59e4fea9
commit 5911f6d6e7
2 changed files with 31 additions and 3 deletions

View File

@@ -188,6 +188,7 @@ static const struct nla_policy nldev_policy[RDMA_NLDEV_ATTR_MAX] = {
[RDMA_NLDEV_ATTR_FRMR_POOLS_AGING_PERIOD] = { .type = NLA_U32 },
[RDMA_NLDEV_ATTR_FRMR_POOL_PINNED_HANDLES] = { .type = NLA_U32 },
[RDMA_NLDEV_ATTR_FRMR_POOL_KEY_KERNEL_VENDOR_KEY] = { .type = NLA_U64 },
[RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY_MAX] = { .type = NLA_U64 },
};
static int put_driver_name_print_type(struct sk_buff *msg, const char *name,
@@ -413,7 +414,7 @@ static int fill_port_info(struct sk_buff *msg,
}
static int fill_res_info_entry(struct sk_buff *msg,
const char *name, u64 curr)
const char *name, u64 curr, u64 max)
{
struct nlattr *entry_attr;
@@ -427,6 +428,9 @@ static int fill_res_info_entry(struct sk_buff *msg,
if (nla_put_u64_64bit(msg, RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY_CURR, curr,
RDMA_NLDEV_ATTR_PAD))
goto err;
if (max && nla_put_u64_64bit(msg, RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY_MAX,
max, RDMA_NLDEV_ATTR_PAD))
goto err;
nla_nest_end(msg, entry_attr);
return 0;
@@ -450,7 +454,7 @@ static int fill_res_info(struct sk_buff *msg, struct ib_device *device,
};
struct nlattr *table_attr;
int ret, i, curr;
int ret, i, curr, max;
if (fill_nldev_handle(msg, device))
return -EMSGSIZE;
@@ -463,7 +467,26 @@ static int fill_res_info(struct sk_buff *msg, struct ib_device *device,
if (!names[i])
continue;
curr = rdma_restrack_count(device, i, show_details);
ret = fill_res_info_entry(msg, names[i], curr);
switch (i) {
case RDMA_RESTRACK_QP:
max = device->attrs.max_qp;
break;
case RDMA_RESTRACK_CQ:
max = device->attrs.max_cq;
break;
case RDMA_RESTRACK_MR:
max = device->attrs.max_mr;
break;
case RDMA_RESTRACK_PD:
max = device->attrs.max_pd;
break;
case RDMA_RESTRACK_SRQ:
max = device->attrs.max_srq;
break;
default:
max = 0;
}
ret = fill_res_info_entry(msg, names[i], curr, max);
if (ret)
goto err;
}

View File

@@ -604,6 +604,11 @@ enum rdma_nldev_attr {
RDMA_NLDEV_ATTR_FRMR_POOL_PINNED_HANDLES, /* u32 */
RDMA_NLDEV_ATTR_FRMR_POOL_KEY_KERNEL_VENDOR_KEY, /* u64 */
/*
* Resource summary entry maximum value.
*/
RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY_MAX, /* u64 */
/*
* Always the end
*/