* [PATCH 1/2] RDMA/nldev: add resource summary max values for usage rate display
@ 2026-04-23 6:13 Tao Cui
2026-04-23 6:13 ` [PATCH 2/2] selftests/rdma: add resource usage rate display test Tao Cui
` (2 more replies)
0 siblings, 3 replies; 6+ messages in thread
From: Tao Cui @ 2026-04-23 6:13 UTC (permalink / raw)
To: jgg, leon, linux-rdma; +Cc: Tao Cui
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 rates.
The new attribute is optional and backward compatible - old userspace
tools will simply ignore it.
Signed-off-by: Tao Cui <cuitao@kylinos.cn>
---
drivers/infiniband/core/nldev.c | 29 ++++++++++++++++++++++++++---
include/uapi/rdma/rdma_netlink.h | 5 +++++
2 files changed, 31 insertions(+), 3 deletions(-)
diff --git a/drivers/infiniband/core/nldev.c b/drivers/infiniband/core/nldev.c
index 96c745d5bac4..879aaa7960fe 100644
--- a/drivers/infiniband/core/nldev.c
+++ b/drivers/infiniband/core/nldev.c
@@ -187,6 +187,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,
@@ -412,7 +413,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;
@@ -426,6 +427,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 (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;
@@ -449,7 +453,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 = 0;
if (fill_nldev_handle(msg, device))
return -EMSGSIZE;
@@ -462,7 +466,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;
}
diff --git a/include/uapi/rdma/rdma_netlink.h b/include/uapi/rdma/rdma_netlink.h
index aac9782ddc09..bf98e0d25007 100644
--- a/include/uapi/rdma/rdma_netlink.h
+++ b/include/uapi/rdma/rdma_netlink.h
@@ -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, used to calculate usage rate.
+ */
+ RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY_MAX, /* u64 */
+
/*
* Always the end
*/
--
2.43.0
^ permalink raw reply related [flat|nested] 6+ messages in thread* [PATCH 2/2] selftests/rdma: add resource usage rate display test
2026-04-23 6:13 [PATCH 1/2] RDMA/nldev: add resource summary max values for usage rate display Tao Cui
@ 2026-04-23 6:13 ` Tao Cui
2026-04-26 12:42 ` [PATCH 1/2] RDMA/nldev: add resource summary max values for usage rate display Leon Romanovsky
2026-05-11 10:12 ` Leon Romanovsky
2 siblings, 0 replies; 6+ messages in thread
From: Tao Cui @ 2026-04-23 6:13 UTC (permalink / raw)
To: jgg, leon, linux-rdma; +Cc: Tao Cui
Add rxe_res_usage.sh to verify the new RES_SUMMARY_ENTRY_MAX netlink
attribute and the usage percentage display in rdma resource show.
Tests cover:
- Usage percentage format and numerical correctness
- JSON output structure (max and usage fields)
- Per-device query returning max > 0
- Cross-validation against ibv_devinfo max values
- Usage count increase after creating QPs via rping
- Resources without max limit (cm_id, ctx) show no usage percentage
Requires: rdma_rxe module, rdma tool, jq, rping.
Signed-off-by: Tao Cui <cuitao@kylinos.cn>
---
tools/testing/selftests/rdma/Makefile | 3 +-
tools/testing/selftests/rdma/rxe_res_usage.sh | 356 ++++++++++++++++++
2 files changed, 358 insertions(+), 1 deletion(-)
create mode 100755 tools/testing/selftests/rdma/rxe_res_usage.sh
diff --git a/tools/testing/selftests/rdma/Makefile b/tools/testing/selftests/rdma/Makefile
index 7dd7cba7a73c..422be2bae838 100644
--- a/tools/testing/selftests/rdma/Makefile
+++ b/tools/testing/selftests/rdma/Makefile
@@ -2,6 +2,7 @@
TEST_PROGS := rxe_rping_between_netns.sh \
rxe_ipv6.sh \
rxe_socket_with_netns.sh \
- rxe_test_NETDEV_UNREGISTER.sh
+ rxe_test_NETDEV_UNREGISTER.sh \
+ rxe_res_usage.sh
include ../lib.mk
diff --git a/tools/testing/selftests/rdma/rxe_res_usage.sh b/tools/testing/selftests/rdma/rxe_res_usage.sh
new file mode 100755
index 000000000000..afcf7c5daa7b
--- /dev/null
+++ b/tools/testing/selftests/rdma/rxe_res_usage.sh
@@ -0,0 +1,356 @@
+#!/bin/bash
+# SPDX-License-Identifier: GPL-2.0
+#
+# Test rdma resource show max and usage percentage display.
+# Requires: rdma_rxe module, rdma tool (iproute2), rping utility.
+#
+# Verifies:
+# 1. "rdma resource show" outputs usage percentage for qp/cq/mr/pd/srq
+# 2. Usage percentage is displayed and correct
+# 3. JSON output contains "max" and "usage" fields
+# 4. Resources without max limit (cm_id, ctx) show no percentage
+
+set -e
+
+NS_NAME="rxe_res_test"
+VETH_HOST="veth_res0"
+VETH_NS="veth_res1"
+RXE_NAME="rxe_res"
+
+PASS=0
+FAIL=0
+
+cleanup() {
+ ip netns exec "$NS_NAME" rdma link del "$RXE_NAME" 2>/dev/null || true
+ ip netns del "$NS_NAME" 2>/dev/null || true
+ modprobe -r rdma_rxe 2>/dev/null || true
+ echo ""
+ echo "Results: $PASS passed, $FAIL failed"
+ if [ "$FAIL" -gt 0 ]; then
+ exit 1
+ fi
+}
+trap cleanup EXIT
+
+assert_contains() {
+ local desc="$1"
+ local haystack="$2"
+ local needle="$3"
+
+ if echo "$haystack" | grep -q "$needle"; then
+ echo " PASS: $desc"
+ PASS=$((PASS + 1))
+ else
+ echo " FAIL: $desc (expected '$needle' in output)"
+ FAIL=$((FAIL + 1))
+ fi
+}
+
+assert_field_value() {
+ local desc="$1"
+ local json="$2"
+ local field="$3"
+ local expected="$4"
+ local actual
+
+ actual=$(echo "$json" | jq -r "$field" 2>/dev/null) || true
+ if [ "$actual" = "$expected" ]; then
+ echo " PASS: $desc ($field=$actual)"
+ PASS=$((PASS + 1))
+ else
+ echo " FAIL: $desc (expected $field=$expected, got $actual)"
+ FAIL=$((FAIL + 1))
+ fi
+}
+
+assert_usage_pct() {
+ local desc="$1"
+ local curr="$2"
+ local max="$3"
+ local usage_str="$4"
+
+ # Calculate expected percentage with 1 decimal place using shell arithmetic
+ # Multiply by 1000 first to get one decimal: (curr * 1000 * 100) / max = per-mille
+ local permille=$(( curr * 100000 / max ))
+ local int_part=$(( permille / 1000 ))
+ local frac_part=$(( permille % 1000 ))
+ local expected="${int_part}.$(printf '%03d' $frac_part | sed 's/0*$//')"
+ # Trim trailing dot
+ expected="${expected%.}"
+
+ # Extract percentage from usage string like "(0.0%)"
+ local actual
+ actual=$(echo "$usage_str" | sed 's/.*(\([0-9.]*\)%).*/\1/')
+
+ if [ "$actual" = "$expected" ]; then
+ echo " PASS: $desc (usage=$actual%)"
+ PASS=$((PASS + 1))
+ else
+ echo " FAIL: $desc (expected $expected%, got $actual%)"
+ FAIL=$((FAIL + 1))
+ fi
+}
+
+# ============================================================
+# Setup
+# ============================================================
+
+echo "=== Setting up test environment ==="
+
+# Check prerequisites
+if ! command -v rdma >/dev/null 2>&1; then
+ echo "SKIP: 'rdma' not found, test requires it"
+ exit 4
+fi
+
+if ! modinfo rdma_rxe >/dev/null 2>&1; then
+ echo "SKIP: rdma_rxe kernel module not found"
+ exit 4
+fi
+
+modprobe rdma_rxe
+
+ip netns add "$NS_NAME"
+ip link add "$VETH_HOST" type veth peer name "$VETH_NS"
+ip link set "$VETH_NS" netns "$NS_NAME"
+ip netns exec "$NS_NAME" ip link set "$VETH_NS" up
+ip link set "$VETH_HOST" up
+
+ip netns exec "$NS_NAME" rdma link add "$RXE_NAME" type rxe netdev "$VETH_NS"
+echo "RXE link $RXE_NAME created."
+
+# Helper: run rdma in test namespace
+rdma_ns() {
+ ip netns exec "$NS_NAME" rdma "$@"
+}
+
+# ============================================================
+# Test 1: Plain text output has usage percentage
+# ============================================================
+echo ""
+echo "=== Test 1: Plain text output contains usage percentage ==="
+
+OUT=$(rdma_ns resource show)
+echo "Output: $OUT"
+
+for res in qp cq mr pd srq; do
+ assert_contains "$res has usage percentage" "$OUT" "$res [0-9]* ([0-9.]*%)"
+done
+
+# ============================================================
+# Test 2: Usage percentage is numerically correct
+# ============================================================
+echo ""
+echo "=== Test 2: Usage percentage is parsed correctly ==="
+
+# Extract curr and usage for qp from rxe_res device line only
+# Expected format: "... rxe_res: ... qp 1 (0.0%) ..."
+QP_LINE=$(echo "$OUT" | grep "$RXE_NAME" | sed -n 's/.*\(qp [0-9]* ([0-9.]*%)\).*/\1/p')
+if [ -n "$QP_LINE" ]; then
+ QP_CURR=$(echo "$QP_LINE" | sed 's/qp \([0-9]*\) .*/\1/')
+ QP_USAGE=$(echo "$QP_LINE" | sed 's/.*(\([0-9.]*%\))/(\1)/')
+ if [ -n "$QP_CURR" ] && [ "$QP_CURR" -ge 0 ] 2>/dev/null; then
+ echo " PASS: qp usage percentage parsed ($QP_CURR $QP_USAGE)"
+ PASS=$((PASS + 1))
+ else
+ echo " FAIL: Could not parse qp curr value"
+ FAIL=$((FAIL + 1))
+ fi
+else
+ echo " SKIP: Could not parse qp line for percentage check"
+fi
+
+# ============================================================
+# Test 4: JSON output structure
+# ============================================================
+echo ""
+echo "=== Test 3: JSON output structure ==="
+
+if ! command -v jq >/dev/null 2>&1; then
+ echo " SKIP: jq not available, skipping JSON tests"
+else
+JSON=$(rdma_ns -j resource show)
+echo "JSON: $JSON"
+
+# JSON should be valid
+if echo "$JSON" | jq . >/dev/null 2>&1; then
+ echo " PASS: JSON is valid"
+ PASS=$((PASS + 1))
+else
+ echo " FAIL: JSON is invalid"
+ FAIL=$((FAIL + 1))
+ JSON="[]"
+fi
+
+# Check that at least one entry has a "max" field
+if echo "$JSON" | jq -e '.[] | select(.max != null)' >/dev/null 2>&1; then
+ echo " PASS: JSON contains 'max' field"
+ PASS=$((PASS + 1))
+else
+ echo " FAIL: JSON missing 'max' field"
+ FAIL=$((FAIL + 1))
+fi
+
+# Check that at least one entry has a "usage" field
+if echo "$JSON" | jq -e '.[] | select(.usage != null)' >/dev/null 2>&1; then
+ echo " PASS: JSON contains 'usage' field"
+ PASS=$((PASS + 1))
+else
+ echo " FAIL: JSON missing 'usage' field"
+ FAIL=$((FAIL + 1))
+fi
+fi
+
+# ============================================================
+# Test 5: Per-device JSON output
+# ============================================================
+echo ""
+echo "=== Test 4: Per-device JSON output ==="
+
+if ! command -v jq >/dev/null 2>&1; then
+ echo " SKIP: jq not available, skipping JSON tests"
+else
+DEV_JSON=$(rdma_ns -j resource show "$RXE_NAME")
+echo "Device JSON: $DEV_JSON"
+
+if [ "$DEV_JSON" != "[]" ]; then
+ echo " PASS: Device-specific query returned data"
+ PASS=$((PASS + 1))
+
+ # JSON is flat with duplicate "max" keys per resource; jq returns the last one
+ JSON_MAX=$(echo "$DEV_JSON" | jq -r '.[0].max' 2>/dev/null)
+ if [ -n "$JSON_MAX" ] && [ "$JSON_MAX" -gt 0 ] 2>/dev/null; then
+ echo " PASS: JSON max field present and > 0 ($JSON_MAX)"
+ PASS=$((PASS + 1))
+ else
+ echo " FAIL: JSON max is missing or zero (got: $JSON_MAX)"
+ FAIL=$((FAIL + 1))
+ fi
+
+ if echo "$DEV_JSON" | grep -q '"usage"'; then
+ echo " PASS: JSON usage field present"
+ PASS=$((PASS + 1))
+ else
+ echo " FAIL: JSON usage field missing"
+ FAIL=$((FAIL + 1))
+ fi
+else
+ echo " FAIL: Device-specific query returned empty"
+ FAIL=$((FAIL + 1))
+fi
+fi
+
+# ============================================================
+# Test 6: Verify max values match ibv_devinfo
+# ============================================================
+echo ""
+echo "=== Test 5: Max values match ibv_devinfo ==="
+
+if ! command -v jq >/dev/null 2>&1; then
+ echo " SKIP: jq not available, skipping ibv_devinfo cross-validation"
+elif ! command -v ibv_devinfo >/dev/null 2>&1; then
+ echo " SKIP: ibv_devinfo not available"
+else
+ IBV_OUT=$(ip netns exec "$NS_NAME" ibv_devinfo -v -d "$RXE_NAME" 2>/dev/null || true)
+ if [ -n "$IBV_OUT" ]; then
+ IBV_MAX_QP=$(echo "$IBV_OUT" | sed -n 's/.*max_qp:[[:space:]]*\([0-9]*\).*/\1/p')
+ IBV_MAX_PD=$(echo "$IBV_OUT" | sed -n 's/.*max_pd:[[:space:]]*\([0-9]*\).*/\1/p')
+
+ # Verify ibv_devinfo reports reasonable max values
+ if [ -n "$IBV_MAX_QP" ] && [ "$IBV_MAX_QP" -gt 0 ] 2>/dev/null; then
+ echo " PASS: ibv_devinfo max_qp=$IBV_MAX_QP"
+ PASS=$((PASS + 1))
+ else
+ echo " FAIL: ibv_devinfo max_qp missing or zero"
+ FAIL=$((FAIL + 1))
+ fi
+ if [ -n "$IBV_MAX_PD" ] && [ "$IBV_MAX_PD" -gt 0 ] 2>/dev/null; then
+ echo " PASS: ibv_devinfo max_pd=$IBV_MAX_PD"
+ PASS=$((PASS + 1))
+ else
+ echo " FAIL: ibv_devinfo max_pd missing or zero"
+ FAIL=$((FAIL + 1))
+ fi
+ else
+ echo " SKIP: ibv_devinfo returned no output"
+ fi
+fi
+
+# ============================================================
+# Test 7: Usage after creating QPs (with rping)
+# ============================================================
+echo ""
+echo "=== Test 6: Usage increases after creating resources ==="
+
+BEFORE_QP_CURR=$(echo "$OUT" | sed -n 's/.*qp \([0-9]*\).*/\1/p' | head -1)
+BEFORE_QP_CURR=${BEFORE_QP_CURR:-0}
+echo " QP count before: $BEFORE_QP_CURR"
+
+# Start rping server in background to create QP resources
+ip netns exec "$NS_NAME" rping -s -p 12345 -v &
+RPING_PID=$!
+sleep 1
+
+# Check resource count after
+OUT_AFTER=$(rdma_ns resource show)
+AFTER_QP_CURR=$(echo "$OUT_AFTER" | sed -n 's/.*qp \([0-9]*\).*/\1/p' | head -1)
+AFTER_QP_CURR=${AFTER_QP_CURR:-0}
+echo " QP count after rping: $AFTER_QP_CURR"
+
+if [ "$AFTER_QP_CURR" -ge "$BEFORE_QP_CURR" ]; then
+ echo " PASS: QP count did not decrease ($BEFORE_QP_CURR -> $AFTER_QP_CURR)"
+ PASS=$((PASS + 1))
+else
+ echo " FAIL: QP count unexpectedly decreased"
+ FAIL=$((FAIL + 1))
+fi
+
+# Verify usage percentage is still present after count change
+QP_LINE_AFTER=$(echo "$OUT_AFTER" | sed -n 's/.*\(qp [0-9]* ([0-9.]*%)\).*/\1/p')
+if [ -n "$QP_LINE_AFTER" ]; then
+ echo " PASS: qp usage percentage present after rping ($QP_LINE_AFTER)"
+ PASS=$((PASS + 1))
+else
+ echo " FAIL: qp usage percentage missing after rping"
+ FAIL=$((FAIL + 1))
+fi
+
+kill "$RPING_PID" 2>/dev/null || true
+wait "$RPING_PID" 2>/dev/null || true
+
+# ============================================================
+# Test 8: Resources without max show no usage percentage (cm_id, ctx)
+# ============================================================
+echo ""
+echo "=== Test 7: Resources without max limit (cm_id, ctx) ==="
+
+# cm_id and ctx have no max in ib_device_attr, max=0 from kernel
+# In output, they should NOT show usage percentage
+CM_ID_LINE=$(echo "$OUT" | sed -n 's/.*\(cm_id [0-9]*\).*/\1/p' | head -1)
+if [ -n "$CM_ID_LINE" ]; then
+ if echo "$OUT" | grep -q 'cm_id [0-9]* ([0-9.]*%)'; then
+ echo " FAIL: cm_id should not show usage percentage (no ib_device_attr equivalent)"
+ FAIL=$((FAIL + 1))
+ else
+ echo " PASS: cm_id has no usage percentage (as expected)"
+ PASS=$((PASS + 1))
+ fi
+else
+ echo " SKIP: cm_id not found in output"
+fi
+
+CTX_LINE=$(echo "$OUT" | sed -n 's/.*\(ctx [0-9]*\).*/\1/p' | head -1)
+if [ -n "$CTX_LINE" ]; then
+ if echo "$OUT" | grep -q 'ctx [0-9]* ([0-9.]*%)'; then
+ echo " FAIL: ctx should not show usage percentage"
+ FAIL=$((FAIL + 1))
+ else
+ echo " PASS: ctx has no usage percentage (as expected)"
+ PASS=$((PASS + 1))
+ fi
+else
+ echo " SKIP: ctx not found in output"
+fi
+
+echo ""
+echo "=== All tests completed ==="
--
2.43.0
^ permalink raw reply related [flat|nested] 6+ messages in thread* Re: [PATCH 1/2] RDMA/nldev: add resource summary max values for usage rate display
2026-04-23 6:13 [PATCH 1/2] RDMA/nldev: add resource summary max values for usage rate display Tao Cui
2026-04-23 6:13 ` [PATCH 2/2] selftests/rdma: add resource usage rate display test Tao Cui
@ 2026-04-26 12:42 ` Leon Romanovsky
2026-04-26 12:47 ` Leon Romanovsky
2026-04-28 8:20 ` Tao Cui
2026-05-11 10:12 ` Leon Romanovsky
2 siblings, 2 replies; 6+ messages in thread
From: Leon Romanovsky @ 2026-04-26 12:42 UTC (permalink / raw)
To: Tao Cui; +Cc: jgg, linux-rdma
On Thu, Apr 23, 2026 at 02:13:51PM +0800, Tao Cui wrote:
> 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 rates.
Historically, we try to avoid duplicating functionality, and this already
exists in ibv_devinfo. What is the reason for adding it to rdmatool as well?
>
> The new attribute is optional and backward compatible - old userspace
> tools will simply ignore it.
>
> Signed-off-by: Tao Cui <cuitao@kylinos.cn>
> ---
> drivers/infiniband/core/nldev.c | 29 ++++++++++++++++++++++++++---
> include/uapi/rdma/rdma_netlink.h | 5 +++++
> 2 files changed, 31 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/infiniband/core/nldev.c b/drivers/infiniband/core/nldev.c
> index 96c745d5bac4..879aaa7960fe 100644
> --- a/drivers/infiniband/core/nldev.c
> +++ b/drivers/infiniband/core/nldev.c
> @@ -187,6 +187,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,
> @@ -412,7 +413,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;
>
> @@ -426,6 +427,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 (nla_put_u64_64bit(msg, RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY_MAX, max,
> + RDMA_NLDEV_ATTR_PAD))
> + goto err;
From an implementation perspective, this is not an appropriate place to
store this information. It will result in reporting the same value
(max_XXX is per‑device) across multiple objects.
Thanks
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: [PATCH 1/2] RDMA/nldev: add resource summary max values for usage rate display
2026-04-26 12:42 ` [PATCH 1/2] RDMA/nldev: add resource summary max values for usage rate display Leon Romanovsky
@ 2026-04-26 12:47 ` Leon Romanovsky
2026-04-28 8:20 ` Tao Cui
1 sibling, 0 replies; 6+ messages in thread
From: Leon Romanovsky @ 2026-04-26 12:47 UTC (permalink / raw)
To: Tao Cui; +Cc: jgg, linux-rdma
On Sun, Apr 26, 2026 at 03:42:23PM +0300, Leon Romanovsky wrote:
> On Thu, Apr 23, 2026 at 02:13:51PM +0800, Tao Cui wrote:
<...>
> > @@ -426,6 +427,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 (nla_put_u64_64bit(msg, RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY_MAX, max,
> > + RDMA_NLDEV_ATTR_PAD))
> > + goto err;
>
> From an implementation perspective, this is not an appropriate place to
> store this information. It will result in reporting the same value
> (max_XXX is per‑device) across multiple objects.
Alright, after a closer review, please disregard my earlier comment.
>
> Thanks
>
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 1/2] RDMA/nldev: add resource summary max values for usage rate display
2026-04-26 12:42 ` [PATCH 1/2] RDMA/nldev: add resource summary max values for usage rate display Leon Romanovsky
2026-04-26 12:47 ` Leon Romanovsky
@ 2026-04-28 8:20 ` Tao Cui
1 sibling, 0 replies; 6+ messages in thread
From: Tao Cui @ 2026-04-28 8:20 UTC (permalink / raw)
To: Leon Romanovsky; +Cc: jgg, linux-rdma
在 2026/4/26 20:42, Leon Romanovsky 写道:
> On Thu, Apr 23, 2026 at 02:13:51PM +0800, Tao Cui wrote:
>> 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 rates.
>
> Historically, we try to avoid duplicating functionality, and this already
> exists in ibv_devinfo. What is the reason for adding it to rdmatool as well?
>
Thanks for your review.
You're right that ibv_devinfo exposes these limits via the verbs API.
The motivation here is not to duplicate ibv_devinfo, but to make the
existing `rdma resource show` output more self-contained.
Currently `rdma resource show` displays current resource counts (curr),
but not the maximum limits. To compute usage rates, a user must
cross-reference two separate tools using different interfaces
(ibv_devinfo via verbs vs. rdma via netlink). This is especially
inconvenient for monitoring and automation use cases that rely on
netlink + JSON output.
By adding max alongside curr in the same resource summary entry, the
rdma tool can present a complete picture in one query, and userspace
can compute usage rates without querying two different interfaces.
That said, if you feel this doesn't justify the addition, I'm happy
to withdraw or adjust the approach. For example, an alternative would
be to not add a new netlink attribute and instead let userspace tools
do the cross-referencing, though I think the single-query approach
provides better usability.
>>
>> The new attribute is optional and backward compatible - old userspace
>> tools will simply ignore it.
>>
>> Signed-off-by: Tao Cui <cuitao@kylinos.cn>
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 1/2] RDMA/nldev: add resource summary max values for usage rate display
2026-04-23 6:13 [PATCH 1/2] RDMA/nldev: add resource summary max values for usage rate display Tao Cui
2026-04-23 6:13 ` [PATCH 2/2] selftests/rdma: add resource usage rate display test Tao Cui
2026-04-26 12:42 ` [PATCH 1/2] RDMA/nldev: add resource summary max values for usage rate display Leon Romanovsky
@ 2026-05-11 10:12 ` Leon Romanovsky
2 siblings, 0 replies; 6+ messages in thread
From: Leon Romanovsky @ 2026-05-11 10:12 UTC (permalink / raw)
To: Tao Cui; +Cc: jgg, linux-rdma
On Thu, Apr 23, 2026 at 02:13:51PM +0800, Tao Cui wrote:
> 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 rates.
While I'm fine with the overall idea, I think we should spend more time
determining the proper display format for this information. Once we agree
on how it should be presented, that output should be included in the commit
message.
Presenting utilization as a percentage seems too imprecise, and users would
likely prefer to see the maximum value instead.
Thanks
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2026-05-11 10:13 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-04-23 6:13 [PATCH 1/2] RDMA/nldev: add resource summary max values for usage rate display Tao Cui
2026-04-23 6:13 ` [PATCH 2/2] selftests/rdma: add resource usage rate display test Tao Cui
2026-04-26 12:42 ` [PATCH 1/2] RDMA/nldev: add resource summary max values for usage rate display Leon Romanovsky
2026-04-26 12:47 ` Leon Romanovsky
2026-04-28 8:20 ` Tao Cui
2026-05-11 10:12 ` Leon Romanovsky
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox