Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

devlink: Add dump support for device-level resources

Add dumpit handler for resource-dump command to iterate over all devlink
devices and show their resources.

$ devlink resource show
pci/0000:08:00.0:
name local_max_SFs size 508 unit entry
name external_max_SFs size 508 unit entry
pci/0000:08:00.1:
name local_max_SFs size 508 unit entry
name external_max_SFs size 508 unit entry

Signed-off-by: Or Har-Toov <ohartoov@nvidia.com>
Reviewed-by: Shay Drori <shayd@nvidia.com>
Reviewed-by: Moshe Shemesh <moshe@nvidia.com>
Reviewed-by: Jiri Pirko <jiri@nvidia.com>
Signed-off-by: Tariq Toukan <tariqt@nvidia.com>
Link: https://patch.msgid.link/20260407194107.148063-6-tariqt@nvidia.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

authored by

Or Har-Toov and committed by
Jakub Kicinski
11636b55 085b234b

+102 -5
+5 -1
Documentation/netlink/specs/devlink.yaml
··· 1764 1764 - bus-name 1765 1765 - dev-name 1766 1766 - index 1767 - reply: 1767 + reply: &resource-dump-reply 1768 1768 value: 36 1769 1769 attributes: 1770 1770 - bus-name 1771 1771 - dev-name 1772 1772 - index 1773 1773 - resource-list 1774 + dump: 1775 + request: 1776 + attributes: *dev-id-attrs 1777 + reply: *resource-dump-reply 1774 1778 1775 1779 - 1776 1780 name: reload
+77
net/devlink/resource.c
··· 223 223 return -EMSGSIZE; 224 224 } 225 225 226 + static int devlink_resource_list_fill(struct sk_buff *skb, 227 + struct devlink *devlink, 228 + struct list_head *resource_list_head, 229 + int *idx) 230 + { 231 + struct devlink_resource *resource; 232 + int i = 0; 233 + int err; 234 + 235 + list_for_each_entry(resource, resource_list_head, list) { 236 + if (i < *idx) { 237 + i++; 238 + continue; 239 + } 240 + err = devlink_resource_put(devlink, skb, resource); 241 + if (err) { 242 + *idx = i; 243 + return err; 244 + } 245 + i++; 246 + } 247 + *idx = 0; 248 + return 0; 249 + } 250 + 226 251 static int devlink_resource_fill(struct genl_info *info, 227 252 enum devlink_command cmd, int flags) 228 253 { ··· 325 300 return -EOPNOTSUPP; 326 301 327 302 return devlink_resource_fill(info, DEVLINK_CMD_RESOURCE_DUMP, 0); 303 + } 304 + 305 + static int 306 + devlink_nl_resource_dump_one(struct sk_buff *skb, struct devlink *devlink, 307 + struct netlink_callback *cb, int flags) 308 + { 309 + struct devlink_nl_dump_state *state = devlink_dump_state(cb); 310 + struct nlattr *resources_attr; 311 + int start_idx = state->idx; 312 + void *hdr; 313 + int err; 314 + 315 + if (list_empty(&devlink->resource_list)) 316 + return 0; 317 + 318 + err = -EMSGSIZE; 319 + hdr = genlmsg_put(skb, NETLINK_CB(cb->skb).portid, cb->nlh->nlmsg_seq, 320 + &devlink_nl_family, flags, DEVLINK_CMD_RESOURCE_DUMP); 321 + if (!hdr) 322 + return err; 323 + 324 + if (devlink_nl_put_handle(skb, devlink)) 325 + goto nla_put_failure; 326 + 327 + resources_attr = nla_nest_start_noflag(skb, DEVLINK_ATTR_RESOURCE_LIST); 328 + if (!resources_attr) 329 + goto nla_put_failure; 330 + 331 + err = devlink_resource_list_fill(skb, devlink, 332 + &devlink->resource_list, &state->idx); 333 + if (err) { 334 + if (state->idx == start_idx) 335 + goto resource_list_cancel; 336 + nla_nest_end(skb, resources_attr); 337 + genlmsg_end(skb, hdr); 338 + return err; 339 + } 340 + nla_nest_end(skb, resources_attr); 341 + genlmsg_end(skb, hdr); 342 + return 0; 343 + 344 + resource_list_cancel: 345 + nla_nest_cancel(skb, resources_attr); 346 + nla_put_failure: 347 + genlmsg_cancel(skb, hdr); 348 + return err; 349 + } 350 + 351 + int devlink_nl_resource_dump_dumpit(struct sk_buff *skb, 352 + struct netlink_callback *cb) 353 + { 354 + return devlink_nl_dumpit(skb, cb, devlink_nl_resource_dump_one); 328 355 } 329 356 330 357 int devlink_resources_validate(struct devlink *devlink,